本设计: 基于STM32控制直流电机加减速正反转设计(程序+仿真+论文) 仿真:proteus8.9 程序编译器:keil 5 编程语言:C语言 编号C0011 $ s+ q8 l. ?- x% }, n% ]$ A& S
功能说明: 本设计由STM32F103、L298N电机驱动电路、按键电路组成。 1.通过按键可以控制电机,正转、反转、加速、减速、停止。 2.档位分4档,并且可以通过按键顺序正转、反转、加速、减速、停止。 3.档位可以自定义。 附赠相关论文,根据实物写的,与仿真功能基本一致。
0 ` Y0 M% e# S3 W
仿真图(提供源文件): 2 H4 F, n3 V6 d L/ n6 X
( G8 y8 W' V: [8 K
源程序(提供源文件):
0 J; a$ o- R( R( i& u- Y1 u以下为部分程序: - ! s. G/ a. _. J a4 q& |3 t5 v
- int main(void)( E9 e0 o, `. K! ~) A+ ^" {, g( t
- {% m: x6 z% w9 i8 |! j6 g% L
- delay_init(); //延时函数初始化+ @4 o. H1 Y5 _% w% O! }
- // uart_init(9600); //串口初始化为1152004 S$ h. G, W5 w3 Z
- // uart2_init(9600) ;1 o. o1 O# X; D
- TIM3_Int_Init(10, 7199); //定时器3 \; ]$ W h0 {9 z
- LED_Init(); //初始化与LED连接的硬件接口- P& X2 T4 ]1 _4 B# [! Q/ }2 R+ W# r
- KEY_Init();
8 o2 K3 A, J2 E - Lcd_GPIO_init(); `3 N2 q4 b0 A2 c
- Lcd_Init();
8 ~; q8 g* W6 W% z W# G2 \% ?, P0 P - IN1 = 1; //方向控制: H8 o g: Y7 h* B m( h
- IN2 = 0;
1 [! p2 F; }6 p9 _( T - pwmRigh = 0; //pwm调整,电机转速调整
* b9 O* Q1 J4 ]6 o5 }( ^, l0 ] - Lcd_Puts(0, 0, (unsigned char *)dis0);
# l2 l( L4 g6 x; ? X - sprintf(dis2,"SPEED:%d",pwmRigh);
8 ]! S! t1 s0 a4 e) @& g9 y - Lcd_Puts(0, 1, (unsigned char *)dis2);
2 i1 D& u+ G0 m6 W& U5 R: L# b - Lcd_Puts(8, 0, (unsigned char *)dis3);. x2 v4 z5 T5 T/ t7 z9 A6 L
- while(1)% l" m3 k5 ]8 p: Q$ Y
- {8 U) U9 Q4 Y5 g% g+ R: u
- if((key1 == 0) || (key2 == 0) || (key3 == 0) || (key4 == 0) || (key5 == 0)) //检测到按键按下
3 }1 ^" U8 O" o8 Q - {
4 s7 T5 ]* n d1 \- q: e - // delay_ms(1); //小抖动仿真不需要加
: o9 Y- k7 s, K4 I+ ]# s; P - if(rekey == 0)
/ g4 g+ f1 n# n) n, I1 o - {
! }- r, X5 q+ V) m1 m. Q - if(key1 == 0) //检测是否按下: f* U5 e) l+ x9 Q1 e G
- {
! V8 {' v3 _ ~6 L4 n. _ - rekey = 1;
$ `" z6 `, R9 i+ f4 u& t) z) E0 D - IN1 = 1; //方向控制1 w/ X# p3 E# Z
- IN2 = 0; ! Y, B3 Y# c! \
- Lcd_Puts(0, 0, (unsigned char *)dis0);
& L z6 [0 S( t0 t - Lcd_Puts(8, 0, (unsigned char *)dis3);0 n# o% Z9 _9 L! E! i9 E; ~% Y
- } E) ~1 D, _& q; R& [
- else if(key2 == 0) //设置值键
: }, a. l" F0 M) Z) ?4 n. o - {) E6 \- G t- H/ O B! q2 q
- rekey = 1;+ W% A8 V1 H$ n% e7 a* R q2 r* g
- IN1 = 0; //方向控制
% G$ J' j. K! M- N5 E" ^: f' P3 o/ v - IN2 = 1;
4 y" F0 T, p2 I0 t, I" | - Lcd_Puts(0, 0, (unsigned char *)dis1);
' ?$ b# o9 N3 f! U8 S - Lcd_Puts(8, 0, (unsigned char *)dis3);
9 x8 s* y$ S, V0 Q: ? p - } T% y0 U" q4 b4 Y/ ?* o
- else if(key3 == 0) //设置值键' ?- ? X# U+ b- L- U; o% ~
- {# t T4 R1 B, F" X
- rekey = 1;% \6 W3 |+ ]# V+ j& l$ U
- if(pwmRigh < 8)pwmRigh = pwmRigh + 2; //pwm 调速3 J5 Z9 g0 [' n! }: d2 ^
- sprintf(dis2,"SPEED:%d",pwmRigh/2);
7 ?6 ?, O0 w: A5 |" e - Lcd_Puts(0, 1, (unsigned char *)dis2);' h$ V7 T, d1 S. H) r; \1 F' W
- }
2 }: r- j4 t1 w# W1 Q5 ` - else if(key4 == 0) //设置值键
6 k2 X: ^6 H j - {
6 h- b( I. J9 y j$ z) U0 } - rekey = 1;0 m% v0 N% l* m! z* V( M' |
- if(pwmRigh >= 2)pwmRigh = pwmRigh - 1; //pwm 调速
, x+ i+ D# H, i# w - sprintf(dis2,"SPEED:%d",pwmRigh/2);
& b2 K# E" @5 K0 ~2 P6 C - Lcd_Puts(0, 1, (unsigned char *)dis2);
" h, @! m) n" K2 }! e6 |' { - }
6 l% W, Y' h& n8 N& R - else if(key5 == 0) //设置值键
" ]0 [9 B3 |. g8 p2 d( E3 _* R' y - {
& G, k" l% I9 X - rekey = 1;
9 U7 M/ k! k7 t+ q S b - IN1 = 0; //方向控制# g$ {9 N6 {) ^: M
- IN2 = 0;; D+ K6 d: C0 U1 t
- Lcd_Puts(8, 0, (unsigned char *)dis4);
" }0 b9 W9 L8 V5 n2 Q/ h$ e' _ - }2 @7 X/ \! v9 }. d) w' y* a }
- }
2 j5 k- |& E; K" G% [' D- x - }7 l+ O# G( L7 m' v c
- else
. T6 q) t) o; i6 {! l' X - {
- y( S3 u v1 p" w! {8 b - rekey = 0; //防止重复检测到按键# P) |: X! k9 [. r5 p- g) h
- }: i. x$ d+ j) i. e* Y
- delay_ms(10);+ r) n6 z/ w6 f
- }. `6 O' _# R7 q! w9 R" t; T
- }
复制代码 ' ~7 s S. }& g3 U% q6 w" L
+ S( j( E' E) s7 O
|