|
本设计: 基于STM32控制直流电机加减速正反转设计(程序+仿真+论文) 仿真:proteus8.9 程序编译器:keil 5 编程语言:C语言 编号C0011 7 M7 }% h) l$ Y
功能说明: 本设计由STM32F103、L298N电机驱动电路、按键电路组成。 1.通过按键可以控制电机,正转、反转、加速、减速、停止。 2.档位分4档,并且可以通过按键顺序正转、反转、加速、减速、停止。 3.档位可以自定义。 附赠相关论文,根据实物写的,与仿真功能基本一致。 # p. G G( e) ^3 A" M7 t3 p
仿真图(提供源文件):
* N! O. J7 M9 Z/ T& T/ [/ g+ y a
/ _) F" ~7 a5 J2 M# z& D
源程序(提供源文件):
$ r3 H9 \, ]' M, ]+ x: F以下为部分程序:
9 X @/ L- T+ G; {, q- int main(void)# Z, B% ]( M) |! p( Z. K
- {
2 T0 Y4 j( G9 V( C/ g6 h! [ - delay_init(); //延时函数初始化0 Q+ s5 N0 d/ k* M$ ?+ |
- // uart_init(9600); //串口初始化为115200
3 w) n, S: A% }0 R, e& Q - // uart2_init(9600) ;0 C6 U ]/ h' \" N4 R1 a. M
- TIM3_Int_Init(10, 7199); //定时器
+ o ^$ T+ u0 \& o( X - LED_Init(); //初始化与LED连接的硬件接口
; y0 X. _$ b3 ~) Y. j5 k7 J8 C* H - KEY_Init();
. I4 q! H+ ]: o2 _" H - Lcd_GPIO_init();- ` W2 [, t" @6 a" ?
- Lcd_Init();; k& _1 n$ C: ~$ C; G
- IN1 = 1; //方向控制
) u% h% I% D: w- D& L - IN2 = 0;
1 l' e7 {, S( d$ s' p - pwmRigh = 0; //pwm调整,电机转速调整
7 _) F4 m* }0 ?& n( ~ - Lcd_Puts(0, 0, (unsigned char *)dis0);5 s! g# S: F, l* f
- sprintf(dis2,"SPEED:%d",pwmRigh);7 J! U$ P3 |# U: A4 D
- Lcd_Puts(0, 1, (unsigned char *)dis2);
6 i6 R4 t- b3 V9 A5 W$ Z6 c - Lcd_Puts(8, 0, (unsigned char *)dis3);
# k- G* J+ r; @6 X7 z, }% T - while(1)
' B1 v- |) }3 _7 \ - {
4 x" N/ N2 F8 l! N - if((key1 == 0) || (key2 == 0) || (key3 == 0) || (key4 == 0) || (key5 == 0)) //检测到按键按下9 P0 j5 R# V4 r! I+ w9 r0 x% s A
- {
?( C( O. \, N) |# s - // delay_ms(1); //小抖动仿真不需要加( E4 Q4 {. |5 W. m+ s' T) z
- if(rekey == 0)
2 ]8 f1 ~! s2 x: ~ - {
" z0 g3 @5 E* z! J- `6 g, m - if(key1 == 0) //检测是否按下5 f* Q- C0 P7 e, r% X6 [
- {
. ^( {% z! O5 d3 X, y - rekey = 1;9 e( E! @+ {* t
- IN1 = 1; //方向控制$ T, v' K1 h) ?2 L
- IN2 = 0; * N2 \" J _7 {4 a0 L
- Lcd_Puts(0, 0, (unsigned char *)dis0);7 ~9 Y( e, a3 a
- Lcd_Puts(8, 0, (unsigned char *)dis3);
! n* l9 w1 q+ ?( r - }; H7 W8 a. t ~: @3 h
- else if(key2 == 0) //设置值键' t4 O5 ^9 B: ^" }1 _
- {! T* o8 j* ~. H# O
- rekey = 1;: o3 U' ~4 V: x/ d1 ~1 c
- IN1 = 0; //方向控制& M# r! H( G" y+ Q
- IN2 = 1;3 `. Q9 Z9 W7 w
- Lcd_Puts(0, 0, (unsigned char *)dis1);3 }- ~- g5 _6 c) w
- Lcd_Puts(8, 0, (unsigned char *)dis3);
. P( c& E4 L, z4 n8 Z: I! I& C - }' B" L+ [, ]+ ~, Q" f8 k* ^
- else if(key3 == 0) //设置值键
9 Q/ H- L. s( ~. V9 n2 l/ H( q - {
7 \ K7 {" F5 j( t: n8 f5 @ - rekey = 1;
% w t4 |3 H* R4 Q' W4 D - if(pwmRigh < 8)pwmRigh = pwmRigh + 2; //pwm 调速" N& H+ X. ~- _& h t
- sprintf(dis2,"SPEED:%d",pwmRigh/2);- Z* p+ `) `& I3 i# x
- Lcd_Puts(0, 1, (unsigned char *)dis2);
$ I' }& Y- j: p4 L) s - }6 }2 a9 z6 @. z- `! P
- else if(key4 == 0) //设置值键
* }. F$ S; N# v - {; p I* {# G V9 J. i( H8 O
- rekey = 1;
/ K V/ r1 A$ j H# u - if(pwmRigh >= 2)pwmRigh = pwmRigh - 1; //pwm 调速
% b2 M. @' L1 x% H" ~ - sprintf(dis2,"SPEED:%d",pwmRigh/2);) A2 Y& @ i; G3 B G4 t" p
- Lcd_Puts(0, 1, (unsigned char *)dis2);
' U+ B* T3 k% U7 i3 k6 ^4 e - }: j1 U) w: `3 w, z! a
- else if(key5 == 0) //设置值键
$ A) U% I- U, G1 A2 P) ^& ] - {1 k$ |9 F. k# j
- rekey = 1;) D6 Q8 s" T! B* p4 x+ N
- IN1 = 0; //方向控制, G0 v+ V+ d, w
- IN2 = 0;
+ p; e* ~. p+ c. H' _8 ]! _5 O0 { - Lcd_Puts(8, 0, (unsigned char *)dis4);
5 w; ^0 O4 }) F - }
) {9 l$ b0 E( J3 H+ L4 A5 P - }
- } `! s' z4 H4 q - }8 y: o. ?& c# ^* x6 j0 [
- else
, X# V# v9 \) D! y: d0 k4 x& D% k - { S \. A! S; _& E+ D
- rekey = 0; //防止重复检测到按键
* z4 w9 M& ?1 b2 \$ m - }
, E& A( r$ j9 F' W - delay_ms(10);6 o$ O: d7 b1 K+ y. |( {
- }
9 H T, k& S8 W2 D4 _6 ? - }
复制代码 5 O5 n) v% O- n4 ~" o6 Q* _4 Z
0 R: |5 D) O/ d6 D
|