51系列单片机控制直流电机的方法.docVIP

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
51系列单片机控制直流电机的方法

51单片机控制直流电机设计的方法: 可以实现的功能是: ?按下左转键则开始向左转动 ?按下右转键则向右转动 ?按下停止键则开始逐渐停止转动 ?按下调速键一次则会加速一档 ?按下调速键二次则会加速二档 ?按下调速键三次则会加速三档 ?按下调速键四次则会加速四档 ?按下调速键五次则会回到最初速度重新记档位 ?设计思路: ???? 直流电机只要能提供一定的直流就可以转动,改变电压极性可以改变转动方向,可以通过给直流电机提供脉冲信号来驱动它,脉冲信号的占空比可以影响到直流电机的平均速度,因此可以通过调整占空比从而能实现调速的目的。直流电机的驱动电路要有过流保护作用,图中的二极管就直到这个作用,另外电机的驱动电流是比较大的所以需要用三极管来放大电流。程序的关键就是如何实现占空比的调整,这个可以通过对51单片机定时器重装初值进行改变,从而改变时间。用51实现PWM信号的输出,相对麻烦点,要是AVR就可以方便地实现PWM信号,由见51单片机的局限性与AVR单片机的优势。 ? 原理图 详细程序: #includereg52.h #define? uchar? unsigned? char #define? uint?? unsigned? int sbit? PW1=P2^0 ; sbit? PW2=P2^1?;???? //控制电机的两个输入 sbit? accelerate=P2^2? ;?? //调速按键 sbit? stop=P2^3? ;??? //停止按键 sbit? left=P2^4 ;???? //左转按键 sbit? right=P2^5 ;??? //右转按键 ???????????? #define right_turn PW1=0;PW2=1???//顺时针转动 #define left_turn? PW1=1;PW2=0???//逆向转动 #define end_turn?? PW1=1;PW2=1???//停转 uint t0=25000,t1=25000;?? //初始时占空比为50% uint a=25000;????? //?? 设置定时器装载初值?? 25ms???? 设定频率为20Hz uchar flag=1;????? //此标志用于选择不同的装载初值 uchar dflag;????? //左右转标志 uchar count;???? //用来标志速度档位 ? void keyscan();???? //键盘扫描 void delay(uchar z); void time_init();??? //定时器的初始化 void? adjust_speed();??//通过 调整占空比来调整速度 void main() { ??? time_init();???? //定时器的初始化 ?while(1) ? { ??? ? ??keyscan();???//不断扫描键盘程序,以便及时作出相应的响应 ? } } void? timer0()?? interrupt 1 using 0 { ??? ? if(flag) ??? { ?????? flag=0; ??? end_turn; ??? a=t0;???//t0的大小决定着低电平延续时间 ??? TH0=(65536-a)/256; ? ??? TL0=(65536-a)%256;??//重装载初值 ??? } ??? else ???? { ???flag=1;??? //这个标志起到交替输出高低电平的作用 ???if(dflag==0) ??? { ?????? ?right_turn;?? //右转 ??? } ???? else ?????? { ????? left_turn;? //左转 ????} ???a=t1;?? //t1的大小决定着高电平延续时间 ???TH0=(65536-a)/256; ? ????? TL0=(65536-a)%256;??//重装载初值 ??} ? } void time_init() { ? TMOD=0x01;? //工作方式寄存器??? 软件起动定时器? 定时器功能? 方式1? 定时器0 ? TH0=(65536-a)/256; ? TL0=(65536-a)%256;??//装载初值 ? ET0=1;??????//开启定时器中断使能 ? EA=1;???????? ?//? 开启总中断 ? TR0=0; ? } void delay(uchar z)???//在12M下延时z毫秒 { ?uint x,y; ?for(x=z;x0;x--) ?? for(y=110;y0;y--); } void keyscan() ?{ ?? ? if(stop==0) ?? { ?

文档评论(0)

aicencen + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档