|
本设计: 基于STM32控制直流电机加减速正反转设计(程序+仿真+论文) 仿真:proteus8.9 程序编译器:keil 5 编程语言:C语言 编号C0011
( E0 n# A6 N, ?" l' h
功能说明: 本设计由STM32F103、L298N电机驱动电路、按键电路组成。 1.通过按键可以控制电机,正转、反转、加速、减速、停止。 2.档位分4档,并且可以通过按键顺序正转、反转、加速、减速、停止。 3.档位可以自定义。 附赠相关论文,根据实物写的,与仿真功能基本一致。 7 E6 ~% o% E; a0 B, x; G7 n& K; C/ Y
仿真图(提供源文件): ; J2 R. t) `" S8 Y' N% h
$ ^# O+ q5 u& m4 W6 ]: v
源程序(提供源文件): 0 C, e4 h( V( ^! ^' R' ]: }
以下为部分程序:
, ~5 |* z7 X5 L2 ]! \- int main(void)
0 L2 N2 d' b3 z1 c3 b( ? - {% K n( q& Z/ c$ q1 X
- delay_init(); //延时函数初始化4 A6 L6 S5 r5 F) |$ v
- // uart_init(9600); //串口初始化为115200
- h4 @( \9 d5 \" _. Y' U; E5 x7 g - // uart2_init(9600) ;8 r9 c6 g$ `$ z, i( q
- TIM3_Int_Init(10, 7199); //定时器8 }, p3 b8 d) a# s' b0 q
- LED_Init(); //初始化与LED连接的硬件接口
. o {% B: c! o7 Y1 v/ b$ \ - KEY_Init();
- i! u# R* p: J1 [ - Lcd_GPIO_init();
8 g& O9 ] U. E* M' ~) h. J - Lcd_Init();
5 `! I6 `. W5 C, X - IN1 = 1; //方向控制, m9 s# {1 ^/ G9 s
- IN2 = 0;' Z" u( [+ f, M& G
- pwmRigh = 0; //pwm调整,电机转速调整" j) u) r& U1 x
- Lcd_Puts(0, 0, (unsigned char *)dis0);9 O) v5 R) R8 j& E$ n9 u# I* V
- sprintf(dis2,"SPEED:%d",pwmRigh);
4 e6 x' y. O! {' Z) i - Lcd_Puts(0, 1, (unsigned char *)dis2);5 Z6 N3 i4 h$ t3 q' t
- Lcd_Puts(8, 0, (unsigned char *)dis3);
* s: i. C! c+ d2 G - while(1)
9 R! Z: z& Z; S* N2 e - {
' [. l/ j3 J0 ^! @$ B. O) m9 q - if((key1 == 0) || (key2 == 0) || (key3 == 0) || (key4 == 0) || (key5 == 0)) //检测到按键按下
; k7 }2 Y m. }0 {5 l5 g$ r - {
* M1 k( C! F+ s2 Z6 H+ U* G - // delay_ms(1); //小抖动仿真不需要加
. b* B& d5 S# C% Q# F - if(rekey == 0)
1 ]8 c3 d' k* f M8 j6 I0 J" E - {
6 ?. n/ o+ S9 e# A/ D1 ? - if(key1 == 0) //检测是否按下
" {: L+ i! s- ]+ V/ l u - {0 {: }* z6 D( f+ t
- rekey = 1;7 y. J- f* r# p( _$ d
- IN1 = 1; //方向控制
; P, `2 V( @, B - IN2 = 0; 5 D4 q1 r' m: m- |5 A
- Lcd_Puts(0, 0, (unsigned char *)dis0);' ?9 s" ?+ G! f6 T8 M
- Lcd_Puts(8, 0, (unsigned char *)dis3);" @/ L5 [) G4 V. v" L/ P( m. l
- }
\) C" |4 W) j& Q! { - else if(key2 == 0) //设置值键
: |/ R; b; U) F" n - {
9 F1 q( y: ]. k3 ]$ O - rekey = 1;
5 F$ N$ [- A. n5 u2 b" `2 H - IN1 = 0; //方向控制
' x% C) g/ J5 i1 x9 c% ? - IN2 = 1;
+ c7 @3 T& A3 s5 l - Lcd_Puts(0, 0, (unsigned char *)dis1);
8 k5 Q4 u1 \' b. m' ^/ J - Lcd_Puts(8, 0, (unsigned char *)dis3);
& y* G# H; w7 U& ?* z B' b! V; H* r9 N - }
1 d( H; w- W3 J5 | - else if(key3 == 0) //设置值键$ g" y7 U. T, J1 @2 U, d
- {
+ ~5 r; [8 B4 ~5 a9 f% G1 ^ - rekey = 1;
0 }- \" q) h+ }4 r6 _& O* I0 V4 ^( N" \ - if(pwmRigh < 8)pwmRigh = pwmRigh + 2; //pwm 调速
5 d0 D2 {7 a& @7 C$ b7 S - sprintf(dis2,"SPEED:%d",pwmRigh/2);- w0 c+ N+ u( i6 H; s
- Lcd_Puts(0, 1, (unsigned char *)dis2);
1 @1 M* h- V, _/ [1 W: N - }4 o* k- E- q5 q1 i X
- else if(key4 == 0) //设置值键
0 B" k3 f5 w% m: E7 }3 x2 [$ _ - {% L8 e+ b+ @$ u ]( T( L
- rekey = 1;8 Q* P9 u$ S* T+ N7 S. |8 i
- if(pwmRigh >= 2)pwmRigh = pwmRigh - 1; //pwm 调速
0 \+ x# W1 D& F8 r4 }* G - sprintf(dis2,"SPEED:%d",pwmRigh/2);" R# I" l! J/ d. D' C6 u' `. t
- Lcd_Puts(0, 1, (unsigned char *)dis2);. D: ]9 Y4 }0 D4 @2 C/ r3 T
- }: K* s" U% o! c) \% p; s/ c
- else if(key5 == 0) //设置值键
; v x1 _0 Q) E( o7 p! h7 H - {
' k+ E7 a6 A2 L( l* ? - rekey = 1;
1 O( `2 i9 Q- Q! p! C - IN1 = 0; //方向控制
" T' ]' X2 k/ R# x$ I/ q' a1 f - IN2 = 0;4 |4 V6 f! J. U d. t
- Lcd_Puts(8, 0, (unsigned char *)dis4);! X0 W2 d9 H% x7 _
- }) L, m6 `8 n/ v8 `5 Z4 m0 A! T
- }
% i0 R3 Z. N6 p+ M2 q! b& o j9 s$ F. ? - }. j5 [! i4 w, G: x. a
- else
4 k4 e& m0 J8 x - {
: ]; e2 l( r) ?7 X+ V - rekey = 0; //防止重复检测到按键& I- Z. B. J/ N# n
- }0 h. d2 [$ q& H5 ?, Q: t0 U
- delay_ms(10);
9 D% h+ P7 D* Z8 D8 O* c - }% Z, v( v7 S# D6 l7 ?, x. A$ V
- }
复制代码 + l/ n9 _0 k" x1 q! I
( f- }5 q( @2 ~/ g" N- d
|