找回密码
 注册
关于网站域名变更的通知
查看: 429|回复: 1
打印 上一主题 下一主题

基于51单片机PWM直流电机调速程序 0到20级的调速

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-11-26 09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
基于51单片机PWM直流电机调速程序 0到20级的调速4 W3 F2 o: k, [* X5 x" r
' E: g7 f' c6 B5 D8 d6 A: U! S* \2 b
. }1 O- e" `* h! w

- b0 F$ X+ m( Y5 B: P  d/*******************************************************************/
2 t0 p" [2 }& G& I/* 程序名:PWM直流电机调速 */* t  X- c+ z$ m" g' L/ V9 B
/* 晶振:11.00592 MHz CPU型号:AT89C51 */
0 C5 L! ~9 U& q" M1 r8 E/* 直流电机的PWM波控制,可以直接的调速从0到20级的调速 */
5 H# U' E7 s$ ^3 @9 |' o* L
8 i! ~" U) c: x5 h/ c. N  h  v/*****************************************************************/ , f) l0 ]  W6 K- Q
$ ]( p  C" V9 I1 D9 E
#include<reg51.h>
! d$ ?! F  V- `  n/ u7 u) O! Y#define TH0_TL0 (65536-1000)//设定中断的间隔时长
# @. R% [/ ^$ a1 k' A% v# b5 aunsigned char count0 = 50;//低电平的占空比+ T. u) b. _1 B3 m! U/ F
unsigned char count1 = 0;//高电平的占空比
1 `) t  r* u$ \, k2 u3 F; s6 K; v# ?8 g! g! y
bit Flag = 1;//电机正反转标志位,1正转,0反转4 s: M5 G7 m: M; t% T" c% e+ X: p
3 j6 S( I! K8 j8 u5 V$ }
sbit Key_add=P2 ^ 0; //电机减速! ?* d% V8 Z; U7 U! o
sbit Key_dec=P2 ^ 1; //电机加速
  @/ o% H8 R; X& Y  \sbit Key_turn=P2 ^ 2; //电机换向. k3 l7 b/ z$ P; \" K7 y6 R+ k/ g
5 ~* S! K! P. u! p: {; m! a
sbit PWM1=P2^6;//PWM 通道 1,反转脉冲4 s, H4 u6 z! E0 D, G
sbit PWM2=P2^7;//PWM 通道 2,正转脉冲
2 b( u5 k) I( s# K- V9 Z
' i5 ?4 D, \! V/ Kunsigned char Time_delay;9 c! k" ~) |# p5 I
/ G5 s+ E1 X1 a* k7 ?2 n
/************函数声明**************// y. _* C" I! X5 z
void Delay(unsigned char x);
& u/ Q  w3 ~1 }, k! W: N- Q. rvoid Motor_speed_high(void);
: \1 K, E2 T$ g0 z( ]- ivoid Motor_speed_low(void);" r7 t7 e8 t8 M" }: o+ ]3 x
void Motor_turn(void);! Q& J# v+ {# Z+ a  R2 j
void Timer0_init(void);
% j( y$ E* @3 f; D
  Q; Y8 d1 a6 I/ K7 v& {& ~- O% s/****************延时处理**********************/
, o) w/ h# k' n3 z3 Rvoid Delay(unsigned char x)
& R* c6 Y7 D0 O: C( ^{9 n+ g% J( t$ {5 L3 d& z: ?7 Z9 Y6 M/ o
        Time_delay = x;+ F6 s/ y. j7 W
        while(Time_delay != 0);//等待中断,可减少PWM输出时间间隔2 f% @* \, \4 T5 y/ y7 l, u! Z
}* L$ K3 s; G7 ~
* S: H9 M7 g* w& h6 D* Q
/*******按键处理加pwm占空比,电机加速**********/
8 w3 ^! ^1 s* A6 pvoid Motor_speed_high(void)( ^$ `7 ]" A! {% ^  u& R: X* Y! g
{5 w/ z9 B9 W2 K  Y  {* n/ p
        if(Key_add==0)0 J& G, o9 X1 N( @( E+ r# Q
        {* g, s7 j* T% ^4 k+ b7 I8 K$ g
                  Delay(10);
# ^8 G" `8 V, q/ Q- C2 O1 j                  if(Key_add==0)
3 }) i$ e, S, }0 x" M- v                  {0 m! p2 n3 i' v& b) y
                    count0 += 5;
( G$ l5 a7 e/ d% J
2 a' M! i3 j- e( H- u                    if(count0 >= 100)
. s8 M; u9 q. l                    {
. @: D. k3 w3 l& X  V, j                            count0 = 100;
8 v! c7 h4 \+ [, n, W                    }
3 J2 P7 `6 I5 ?" k4 T8 A                  }/ J" {2 e2 s5 E! M3 W
                  while(!Key_add);//等待键松开; n1 f1 S$ R" q5 K# S5 k
        }- Q, Y% u$ m! g$ D$ c# v6 A8 a! N
}
2 j8 i' e2 D9 n% \5 p- l; C: q: I- L; H1 j/ c
/******按键处理减pwm占空比,电机减速*****/
6 U' j: [/ [$ Q$ P* H7 fvoid Motor_speed_low(void)" \& K. r9 o2 }
{
3 \) [; R8 v4 _! Q- f, I4 Y        if(Key_dec==0)" q- }: G3 j% S5 G; \0 S6 r/ G9 G
        {. g) Z8 ^( X6 \" j9 t7 {2 O* t
                  Delay(10);5 l/ v% U3 B. q$ o
                  if(Key_dec==0)# `$ g1 j: N8 D& [6 r
          {: @! J  s& p4 r4 t. q+ s5 X, i
            count0 -= 5;
6 l+ a1 L, t+ n. ?  M8 N0 u2 Q5 Q% L: ?( j, E
            if(count0 <= 0)) r+ n% {% E3 N, u; M6 A. C
            {
4 |# }( O+ k4 F' D                    count0 = 0;
* ?4 o& a% T. s0 x+ x7 o            } ( L( q% w7 \& c+ R0 i6 k6 @
          }0 t5 I- k+ m/ u" ~2 s
          while(!Key_dec );" i1 i. {7 {7 n; {; Y4 v
        }
, }  B  J# Z% f: E& p& ^$ ?}! C. H  f/ |- a( u
; Y5 v  y2 c- y0 L: M
/************电机正反向控制**************/
6 E4 p: W+ z, g/ e/ j; zvoid Motor_turn(void)) K5 X" g' Q, j/ ^
{9 G9 j7 L: P7 i3 C4 h9 R
        if(Key_turn == 0)7 o9 ?7 E' u, ]! z* O$ e" K
        {$ _5 ?& K- N6 b2 P; C/ |
          Delay(10);5 Y8 I+ d% E) Z, C3 Q( u
          if(Key_turn == 0)
. k; ?  e9 ^: A# P. u% q9 J1 W          {
! n2 S+ `. ]: W" ~5 N. d- j            Flag = ~Flag;
4 h; j3 {6 r6 u7 O' B5 H* x          }$ u5 c& ]* ^8 L" m) z+ S
          while(!Key_turn);
6 |& Q& D' I! z% x! j! L; i        }
  L1 V: m( I% S$ k" i5 y}& j0 x" a& C0 W/ i  I: l
: b4 j, P. V9 b# L
/***********定时器0初始化***********/
9 o% p: t& [9 L; a' l2 Hvoid Timer0_init(void)
0 n+ x" k) F/ V- z) r- ^{2 Q2 E6 i, l; u# l
TMOD=0x01; //定时器0工作于方式1: l" ]4 y0 G  o9 f# U. S+ _
TH0=TH0_TL0/256;! A8 @/ q+ z5 P# k+ _
TL0=TH0_TL0%256;
; w6 M) u, K& L1 l9 {1 |TR0=1;" K3 c+ p  V2 n+ [2 g+ n
ET0=1;
" U) G' l2 ?2 |) j8 n! w( ?% zEA=1;
' @% u' e7 U8 F$ \* f}
; M/ U# B- v8 r* M% z1 }$ V: h( P% B2 N7 O
/*********主函数********************/, `# p3 z/ k1 e( O* J, p3 w
void main(void)
. r) W4 h; ^& h5 ]2 t/ r! u{
* U0 X7 n# N& B' q: x        Timer0_init();, n$ C; t+ I7 Q  z5 h/ h
: N9 P- P' k$ v0 u) r
        while(1)8 _) F  R' j" V
        {
5 {/ H2 `9 B' u9 @0 Z$ g          Motor_turn();
5 y0 K1 }9 g1 u  f! P2 {# D9 |          Motor_speed_high();
9 i9 N8 N1 n: y2 y& c1 `& y          Motor_speed_low();
! d, `4 u" \$ ?! U2 ]& Y3 E        }
  r; r1 T, e# V}) }: U" ]$ i8 \8 M" F- V3 H- c
) v. g/ C' C' h4 ~% {; y
/**************定时0中断处理******************/. |, l. e( u; K
void Timer0_int(void) interrupt 1 using 1
7 n" o- i6 M& K$ s. B{
# J/ J3 k8 f, L8 K& kTR0 = 0;//设置定时器初值期间,关闭定时器1 e( l9 W7 w5 F) Y6 ^1 B, B0 X7 d
TL0 = TH0_TL0 % 256;6 o: A9 z& l4 D8 W  L# w
TH0 = TH0_TL0 / 256 ;//定时器装初值$ z: l$ b3 ]/ H( K1 g2 Y
TR0 = 1;
6 J% O6 y) b, H( L' \# D* C5 U. E( ^! |) r6 e, s
if(Time_delay != 0)//延时函数用
" t8 i4 `; s; M+ u8 o{' J$ W7 S+ N5 K8 I
  Time_delay--;
8 _6 v3 g; {& ~  t, j) y  a}
0 H) ?/ L$ o! L- G4 N
+ L6 x" Z9 ?" {9 G# L* O+ rif(Flag == 1)//电机正转
# C0 @3 I. |/ ?: H: S6 p# b3 i0 g{
; I9 S# W2 h" f  PWM1 = 0;
6 h. q! ~+ _8 \# h/ T4 @+ ?# }. _7 I1 P3 I# D9 _0 D# }/ Z( Q+ ~
  if(++count1 < count0)4 f; w& m- ^/ [- X0 k1 _3 W) I6 L2 r' n
  {5 z7 A3 Y. H  C7 E1 X7 \) |) z
    PWM2 = 1;  `) s- {, i% ^9 s7 _9 `
  }
9 x! N- D) L5 U( c8 Q    else % \$ K) f2 L) F; h' p
    PWM2 = 0;& ~% O' F; }; [$ d
* x4 y0 G7 a+ q: h' a( A
    if(count1 >= 100), |* Q9 g2 j! r* R
    {7 ^# _' R- {) L" g3 C$ I
    count1=0;
0 N2 b9 n) f8 `+ P5 U  D  F* ?  r" ]    }3 e. ~$ k$ B# n
}
$ M( b0 l9 C2 ]1 k  `) P6 W$ T$ S! j  else //电机反转
( q' u& ?. N" b+ c& O$ x" c% `  a- K! {" |8 r  {/ ?0 P0 ?! \6 ]  u- o+ F# }
    PWM2 = 0; + t2 n. ]( b- C/ _

. V" v9 c% B9 d& H6 j$ c    if(++count1 < count0)& |2 v, J! K4 d
    {; f; Y5 z: D/ Y, Q  P, A2 `
    PWM1 = 1;6 j& D; p0 I2 Y) Y. E- Z
    }
7 _0 b. s# Y9 y0 j( {. n; P, t+ b- p    else
5 F' u: Z( I& X4 Q: H( P8 L    PWM1 = 0;
$ J# a) h: I1 K( e* |. V. F
2 r  _0 j4 k( W4 z' B" o3 X  b8 ~    if(count1 >= 100): ]" Q: V8 D% _" j- P+ w6 y9 D
    {+ l  y& k- x$ U0 l
      count1=0;$ l* v5 `% j! t9 O( m8 I
    }
$ f; [2 z5 K3 u: M  }) w  r8 C7 e9 ^' c* I- ~
}2 Z( Q, I# w! \- ^6 O
/************************************************0 y; g) |1 t9 h5 x3 ^4 B

3 i5 q  N$ a! Y) Zvoid Delay(unsigned char x)8 }5 L  L! u5 z; R
{6 n5 a7 ~# Y* F. ?' f/ k  q
Time_delay = x;
. g% i0 K* s0 V% {5 K- i
# [2 A- f' ~2 W8 f, _( T5 Xwhile(Time_delay != 0);//等待中断,可减少PWM输出时间间隔
- C- x2 m7 R  l9 Y4 c8 ]5 c}
4 V3 @9 M0 Q& ]* m( i% x
* w  l& z1 |3 z3 P. H( P$ O( E2 fDelay(10);
. h/ J" V3 y$ K, F( j
* Q1 [8 A- b) M6 @+ Yif(Time_delay != 0)//延时函数用
  n' e$ r& C' A2 Z. v4 E) _( A{
% y, k  d0 V% @; q8 X1 N  e8 q7 ^& J  Time_delay--;
% n4 l5 ?0 R2 X$ u6 S}
' ~$ F2 y- a# O0 z, B
0 L5 D+ ~3 c: a7 ]; X  ?& H其实这三个部分是相关联的。
% L4 R) K% W4 {9 M" b9 J) }Delay(10)这是延时防抖的这是毫无疑问的,但这个消抖在消抖的同时将一开始只是声明了下的Time-% A" ^* ], h, n9 G: A2 U: ~/ q! H

8 D, ^7 T" @, c9 t0 ]0 wdelay赋值了,赋值还不算他还牵扯到定时器里去了。你看在赋值后Time-delay变成了10,看第二个部分
* V& F6 a& i* J( G
" m1 H# A& _' H" D的while(Time-delay!=10);这个语句正如注释所说的等待中断,当等来了中断后你可以看第三个部, Y: i, J, ^! @: H9 D. j  n0 a1 T

0 G4 z% q( j! l& y分了,看见了吧终端中有将Time-delay减一,每中断一次就减一次直到等于0之后。也就是说延时的时长
5 f) R: a( A+ Y; _2 v
1 f) m$ M; `0 }7 ]  z是十个中断的时长。注释中:可减少PWM输出时间间隔      也就可想而知了。5 A6 S: v9 k- j# @) \  `$ Y4 q
*****************************************************/7 \* @# s8 s6 [1 V- {
游客,如果您要查看本帖隐藏内容请回复
& c2 C3 Z7 T0 E: F$ z, D
( ]0 g4 e. }" x* ^

该用户从未签到

2#
发表于 2018-11-26 10:31 | 只看该作者
这个好这个好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-18 18:13 , Processed in 0.109375 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表