找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3533|回复: 4
打印 上一主题 下一主题
收起左侧

51单片机直流电机的PWM速度控制程序 测试通过

[复制链接]
跳转到指定楼层
楼主
ID:140343 发表于 2016-10-21 22:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /* =======直流电机的PWM速度控制程序======== */  
  2. /* 晶振采用11.0592M,产生的PWM的频率约为91Hz */  
  3. #include<reg51.h>  
  4. #include<math.h>  
  5. #define uchar unsigned char  
  6. #define uint unsigned int  
  7. sbit en1=P2^0;  /* L298的Enable A */  
  8. sbit en2=P2^1;  /* L298的Enable B */  
  9. sbit s1=P2^2;  /* L298的Input 1 */  
  10. sbit s2=P2^3;  /* L298的Input 2 */  
  11. sbit s3=P2^4;  /* L298的Input 3 */  
  12. sbit s4=P2^5;  /* L298的Input 4 */  
  13. uchar t=0;   /* 中断计数器 */  
  14. uchar m1=0;   /* 电机1速度值 */  
  15. uchar m2=0;   /* 电机2速度值 */  
  16. uchar tmp1,tmp2; /* 电机当前速度值 */  

  17. /* 电机控制函数 index-电机号(1,2); speed-电机速度(-100—100) */  
  18. void motor(uchar index, char speed)  
  19. {  
  20. if(speed>=-100 && speed<=100)  
  21. {  
  22.   if(index==1) /* 电机1的处理 */  
  23.   {  
  24.    m1=abs(speed); /* 取速度的绝对值 */  
  25.    if(speed<0) /* 速度值为负则反转 */  
  26.    {  
  27.     s1=0;  
  28.     s2=1;  
  29.    }  
  30.    else /* 不为负数则正转 */  
  31.    {  
  32.     s1=1;  
  33.     s2=0;  
  34.    }  
  35.   }  
  36.   if(index==2) /* 电机2的处理 */  
  37.   {  
  38.    m2=abs(speed); /* 电机2的速度控制 */  
  39.    if(speed<0) /* 电机2的方向控制 */  
  40.    {  
  41.     s3=0;  
  42.     s4=1;  
  43.    }  
  44.    else  
  45.    {  
  46.     s3=1;  
  47.     s4=0;  
  48.    }  
  49.   }  
  50. }  
  51. }  

  52. void delay(uint j) /* 简易延时函数 */  
  53. {  
  54. for(j;j>0;j--);  
  55. }  

  56. void main()  
  57. {  
  58. char i;  
  59. TMOD=0x02; /* 设定T0的工作模式为2 */  
  60. TH0=0x9B; /* 装入定时器的初值 */  
  61. TL0=0x9B;  
  62. EA=1; /* 开中断 */  
  63. ET0=1; /* 定时器0允许中断 */  
  64. TR0=1; /* 启动定时器0 */  
  65. while(1) /* 电机实际控制演示 */  
  66. {  
  67.   for(i=0;i<=100;i++) /* 正转加速 */  
  68.   {  
  69.    motor(1,i);  
  70.    motor(2,i);  
  71.    delay(5000);  
  72.   }  
  73.   for(i=100;i>0;i--) /* 正转减速 */  
  74.   {  
  75.    motor(1,i);  
  76.    motor(2,i);  
  77.    delay(5000);  
  78.   }  
  79.   for(i=0;i<=100;i++) /* 反转加速 */  
  80.   {  
  81.    motor(1,-i);  
  82.    motor(2,-i);  
  83.    delay(5000);  
  84.   }  
  85.   for(i=100;i>0;i--) /* 反转减速 */  
  86.   {  
  87.    motor(1,-i);  
  88.    motor(2,-i);  
  89.    delay(5000);  
  90.   }  
  91. }  
  92. }  

  93. void timer0() interrupt 1 /* T0中断服务程序 */  
  94. {  
  95. if(t==0) /* 1个PWM周期完成后才会接受新数值 */  
  96. {  
  97.   tmp1=m1;  
  98.   tmp2=m2;  
  99. }  
  100. if(t<tmp1) en1=1; else en1=0; /* 产生电机1的PWM信号 */  
  101. if(t<tmp2) en2=1; else en2=0; /* 产生电机2的PWM信号 */  
  102. t++;  
  103. if(t>=100) t=0; /* 1个PWM信号由100次中断产生 */  
  104. }  
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161494 发表于 2017-1-12 17:34 | 只看该作者
O(∩_∩)O谢谢
回复

使用道具 举报

板凳
ID:216338 发表于 2017-7-1 16:06 | 只看该作者
谢谢楼主提供
回复

使用道具 举报

地板
ID:736988 发表于 2020-5-14 18:05 | 只看该作者
谢谢楼主
回复

使用道具 举报

5#
ID:743069 发表于 2020-5-14 22:14 | 只看该作者
谢谢楼主  看了你的代码我终于找到我的问题了 太感谢了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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