找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1462|回复: 0
收起左侧

单片机+L298驱动步进电机运转不稳定

[复制链接]
ID:516452 发表于 2019-5-14 09:15 | 显示全部楼层 |阅读模式
50黑币
我的步进电机正转稳定反转不稳定,老师 说是频率不对,输出的波形可能有偏差,让我改程序,可是我不知道要怎么改程序才能输出正确的波形,我是用51单片机和 L298驱动模块控制两相步进电机,求大神指点

单片机源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit RS=P2^0;
  5. sbit RW=P2^1;
  6. sbit E=P2^2;

  7. sbit key1=P3^2;
  8. //sbit key2=P3^3;
  9. //sbit key3=P3^4;

  10. #define RIGHT_RUN 1      //正转值
  11. #define LEFT_RUN 0       //反转值

  12. static unsigned int count;
  13. static unsigned int endcount;
  14. uchar flag;
  15. //八拍驱动方式正转表 A-B---> B- --> B-A --> A --> AB --> B
  16. // --> BA- --> A- --> A-B-
  17. ucharupstep8_table[]={0x05,0x01,0x09,0x08,0x0A,0x02,0x06,0x04};


  18. char SpeedChar[]="SPEED(n/min):";
  19. char StateChar[]="RUN SET:";
  20. char STATE_CW[]=" FAN ";
  21. char STATE_CCW[]="ZHENG";
  22. char SPEED[3]="999";
  23. uchar RunState=LEFT_RUN;  //运行状态标志位
  24. //******************************
  25. //     步进电机停止函数
  26. //作用:停止
  27. //******************************
  28. void MotorStop(void)
  29. {
  30.     P1= 0x00;
  31. }


  32. //******************************
  33. //     外部中断0初始化函数
  34. //作用:初始化外部中断
  35. //******************************
  36. void Interrupt0_Init()
  37. {
  38.     EA= 1;
  39.     TMOD= 0x11;
  40.     ET0= 1;

  41. //  TH0=0xFF;
  42. //  TL0=0x28;
  43.     TH0=(65536-500)/256;
  44.     TL0=(65536-500)%256;

  45.     TR0=1;
  46. }
  47. //******************************
  48. //
  49. //延时i ms
  50. //******************************
  51. void delay(uint ims)
  52. {
  53.     endcount=ims;
  54.     count=0;
  55.     do{}while(count<endcount);
  56. }

  57. //******************************
  58. //     步进电机驱动函数
  59. //作用:通过变量var控制电动机的转速高低,通过变量state判断电动机的正反转
  60. //         state:0 正转,state: 1 反转
  61. //使用8拍能够实现比较平滑的转动,使用4拍时电机震动比较大。
  62. //******************************
  63. void MotorSpeedOrDirection(uint var, ucharstate)
  64. {
  65.     uchari=0;
  66.     if(!state)
  67.     {
  68.        for(i=0;i<8; i++)
  69.        {
  70.            P0=upstep8_table[ i];
  71.            delay(var);
  72.        }
  73.     }
  74.     else
  75.     {
  76.        for(i=7;i>0; --i)
  77.        {
  78.            P0=upstep8_table[ i];
  79.            delay(var);
  80.        }
  81.     }
  82. }
  83. //******************************
  84. //     中断处理函数
  85. //作用:定时器0的中断处理
  86. //******************************
  87. void timeint(void) interrupt 1
  88. {
  89. //  TH0=0xFF;
  90. //  TL0=0x28;   //216----234us
  91. //  定时器定时1ms
  92.     TH0=(65536-500)/256;
  93.     TL0=(65536-500)%256;
  94.     count++;
  95. }
  96. //液晶
  97. void clock(unsigned int Delay)   //1ms延时程序
  98. {  
  99.     unsignedint i;
  100.   for(;Delay>0;Delay--)
  101.    for(i=0;i<124;i++);     
  102. }
  103. void wcm(unsigned char com)//写命令
  104. {
  105.     RS=0;
  106.     E=0;
  107.     P1=com;
  108.     clock(5);
  109.     E=1;
  110.     clock(5);
  111.     E=0;
  112. }
  113. void wd(unsigned char date)//写数据
  114. {
  115.     RS=1;
  116.     E=0;
  117.     P1=date;
  118.     clock(5);
  119.     E=1;
  120.     clock(5);
  121.     E=0;
  122. }
  123. void shuzu(unsigned char *c)
  124. {
  125.     while((*c)!='\0')
  126.     {
  127.       wd(*c);
  128.       c++;
  129.     }
  130. }
  131. void ShowState()    //显示状态与速度
  132. {
  133.    if(RunState==RIGHT_RUN)
  134.        {
  135.               wcm(0x80+0x40+9);
  136.               wd('Z');
  137.        }
  138.    else
  139.        {
  140.               wcm(0x80+0x40+9);
  141.               wd('F');
  142.        }
  143. }
  144. void inti_lcd()//初始化
  145. {
  146.     RW=0;
  147.     wcm(0x38);
  148.     wcm(0x0c);
  149.     wcm(0x06);
  150.     wcm(0x01);
  151. }
  152. void main()
  153. {
  154.     unsignedint sum=0;
  155.     P1= 0x00;
  156.     count= 0;
  157.     Interrupt0_Init();
  158.     inti_lcd();      
  159.     wcm(0x80);
  160.        shuzu(SpeedChar);
  161.        wcm(0x80+13);
  162.        shuzu(SPEED);
  163.       wcm(0x80+0x40);
  164.        shuzu(StateChar);
  165.     while(1)
  166.     {
  167.            if(key1==0)
  168.            {
  169.                delay(5);
  170.               if(key1==0)//确认功能键被按下
  171.               {  
  172.                   flag++;//功能键按下次数记录
  173.                   while(!key1);//释放确认
  174.                   if(flag==3)
  175.                      flag=0;
  176.               }
  177.            }
  178.               if(flag==0)
  179.            {
  180.                MotorStop();
  181.            }         
  182.               if(flag==1)
  183.            {
  184.               RunState=RIGHT_RUN;  
  185.               MotorSpeedOrDirection(1,0);
  186.            }            
  187.            if(flag==2)
  188.            {
  189.               RunState=LEFT_RUN;
  190.               MotorSpeedOrDirection(1,1);
  191.            }   
  192.            //ShowState();
  193.     }
  194. }
复制代码


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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