找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机L298输出PWM控制小直流电机旋转,显示转速,占空比

[复制链接]
跳转到指定楼层
楼主
1. 根据小直流电机参数完成驱动电路的选型设计(使用L298芯片)
2. 用51单片机I/O脚产生控制信号,使用PWM控制小直流电机旋转。
3. 产生两种旋转速度:快速,慢速。使用一个开关控制启动和停止
4.显示转速,占空比

电路原理图如下:


单片机源程序如下:
  1. #include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器
  2. #include "lcd.h"

  3. typedef unsigned int u16;      //对数据类型进行声明定义
  4. typedef unsigned char u8;

  5. #define uchar unsigned char
  6. #define uint unsigned int


  7. unsigned char code CDIS1[]={" duty cycle:   % "};
  8. unsigned char code CDIS2[]={"speed:     r/min "};

  9. /*******************************************************************************
  10. * 崔健
  11. * 17040101105
  12. *******************************************************************************/
  13. sbit num1=P1^0;  //占空比加1
  14. sbit num2=P1^1;  //占空比减一
  15. sbit num5=P1^7;  //开始停止切换


  16. sbit IN_1 = P3^0; /* L298的IN_1 */
  17. sbit IN_2 = P3^1; /* L298的IN_2 */

  18. sbit EN_A = P3^2; /* L298的EN_A */

  19. uint duty=50;
  20. uint pulse=0;
  21. uint time=0;
  22. uint mo=0;



  23. /**********电机驱动****************/   
  24. uchar count        = 0; /* 中断计数器 */
  25. uint Speed_d = 0; /* 电机档位 */
  26. uint Speed_1 = 0; /* 电机1/2速度值 */
  27. uint Speed_Now_1 = 0; /* 电机1/2当前速度值 */

  28. void delay(uint z)//延时1ms函数
  29. {
  30. uint x,y;
  31. for(x=0;x<z;x++)
  32.      for(y=0;y<110;y++);
  33. }

  34. void keyscan()  //键盘扫描函数
  35. {
  36.    
  37.   if(num1==0)     
  38.   {
  39.     delay(10);      //消除抖动
  40.     while(!num1);
  41.      if(duty<100)
  42.       duty=duty+5;
  43.      else duty=100;
  44.      
  45.   }
  46.   if(num2==0)
  47.   {
  48.     delay(10);
  49.     while(!num2);
  50.      if(duty>0)
  51.       duty=duty-5;
  52.      else duty=0;
  53.          
  54.   }
  55.       
  56.   if(num5==0)
  57.   {
  58.     delay(5);
  59.         while(!num5);
  60.         if(mo==0){
  61.             EN_A = 1;
  62.             IN_2 = 0;
  63.             mo=1;
  64.         }
  65.         else{
  66.             EN_A=0;
  67.             IN_2=0;
  68.             mo=0;
  69.         }
  70.   }
  71.    
  72.   
  73. }

  74. void LcdDisplay(uint pulse)      //lcd显示
  75. {
  76.    
  77.       unsigned int datas[] = {0, 0, 0, 0, 0}; //定义数组
  78.    
  79.     LcdWriteCom(0x8c);         //写地址 80表示初始地址
  80.     LcdWriteData(duty/10+0x30); //显示占空比十位
  81.     LcdWriteCom(0x8d);         
  82.     LcdWriteData(duty%10+0x30); //显示占空比个位
  83.    
  84.     Speed_1=pulse*3;//  (脉冲数/20)*(60)=圈数x一分钟时间
  85.    
  86.     datas[0] = Speed_1 / 10000;
  87.     datas[1] = Speed_1 % 10000 / 1000;
  88.     datas[2] = Speed_1 % 1000 / 100;
  89.     datas[3] = Speed_1 % 100 / 10;
  90.     datas[4] = Speed_1 % 10;
  91.    
  92.     LcdWriteCom(0x86+0x40);//第二行显示转速
  93.     if(datas[0]!=0)
  94.    LcdWriteData(datas[0]+'0');
  95.     else
  96.    LcdWriteData(' ');
  97.         
  98.     LcdWriteCom(0x87+0x40); //显示速度千位
  99.     LcdWriteData('0'+datas[1]);  

  100.     LcdWriteCom(0x88+0x40); //显示速度百位
  101.     LcdWriteData('0'+datas[2]);
  102.    
  103.     LcdWriteCom(0x89+0x40); //显示速度十位
  104.     LcdWriteData('0'+datas[3]);
  105.    
  106.     LcdWriteCom(0x8a+0x40); //显示速度个位
  107.     LcdWriteData('0'+datas[4]);
  108. }

  109. void Timer0Init()        //12.000MHz
  110. {
  111.     TMOD = 0x01;        
  112.     TH0 = 0x0FF;//定时10us
  113.    TL0 = 0x0F6;
  114.    EA = 1;
  115.    ET0 = 1;
  116.    TR0 = 1;
  117.    
  118.     IT1=1;//跳变沿出发方式(下降沿)
  119.     EX1=1;//打开INT1的中断允许。
  120.    
  121.     EN_A = 0;
  122.     IN_2 = 0;
  123.     IN_2 = 0;
  124. }
  125. void InitTimer1(void)
  126. {
  127.     //定时1ms
  128.     TMOD = 0x10;
  129.      TH1 = 0x0D8;
  130.     TL1 = 0x0F0;
  131.     EA = 1;
  132.     ET1 = 1;
  133.     TR1 = 1;
  134. }


  135. void Motor(uint duty,uchar direction)
  136. {
  137.      if(direction == 1)
  138.      {
  139.                 Speed_1 = duty;

  140.      }
  141.      else
  142.      {
  143.                 Speed_1 = duty;  
  144.      }              
  145. }


  146. void TIME_0(void) interrupt 1 /* T0中断产生pwm */
  147. {
  148.     //定时10us
  149.      TH0 = 0x0FF;
  150.     TL0 = 0x0F6;
  151.          if(count == 0) /* 1个PWM周期完成后才会接受新数值 */
  152.         {        
  153.                 Speed_d = duty;
  154.          
  155.         }
  156.         /* 产生电机1的PWM信号 */
  157.         if(count < Speed_d) IN_1 = 1;
  158.         else IN_1 = 0;  
  159.         
  160.         count++;
  161.         if(count >= 100)
  162.               count = 0; /* 1个PWM信号由100次中断产 */     

  163. }

  164. void Int1()    interrupt 2        //外部中断1的中断函数
  165. {
  166.     pulse++;  //外部中断1记录电机的转速 电机转一圈pulse加一
  167. }


  168. void Timer1Interrupt(void) interrupt 3 /* T1记录转速 */
  169. {
  170.     //定时1ms
  171.      TH1 = 0x0D8;
  172.     TL1 = 0x0F0;
  173.      time++;
  174.    
  175.      if(time==100)                                   //计时到达1s
  176.     {
  177.           LcdDisplay(pulse);     //显示转速
  178.         pulse=0;                                          //转速置0
  179.         time=0;
  180.         }
  181.    
  182. }


  183. void main(void)
  184. {
  185.     u8 i;

  186.     LcdInit();
  187.     Timer0Init();
  188.     InitTimer1();
  189.    
  190.    LcdWriteCom(0x80);//第一行显示占空比
  191.     for(i=0;i<18;i++)
  192.     {
  193.         LcdWriteData(CDIS1[i]);   
  194.     }
  195.     LcdWriteCom(0x80+0x40);//第二行显示转速
  196.     for(i=0;i<18;i++)
  197.     {
  198.         LcdWriteData(CDIS2[i]);   
  199.     }

  200.     while(1)
  201.         {
  202.             
  203.          keyscan();                                //键盘扫描程序            
  204.     }               
  205. }

复制代码

所有程序51hei提供下载(仿真文件不提供,请自己画):
L298输出PWM控制电机转速.zip (59.38 KB, 下载次数: 105)

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

使用道具 举报

沙发
ID:495287 发表于 2020-7-5 13:08 | 只看该作者
五一电机快慢跑
IO控制正反妙
多点耐心与调试
智能转速显示鸟!
回复

使用道具 举报

板凳
ID:328014 发表于 2020-7-5 13:42 | 只看该作者
Jeff_BlindCat 发表于 2020-7-5 13:08
五一电机快慢跑,
IO控制正反妙,
多点耐心与调试,

我是特意来看诗歌的哦
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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