找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

关于51单片机驱动器驱动步进电机的问题,转动很慢而且发热

查看数: 4974 | 评论数: 4 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2018-10-6 19:14

正文摘要:

现在做了一个装置,使用89c52单片机产生pwm脉冲给步进电机驱动器,然后驱动步进电机转动。现在出现两个问题,第一:电机转动很慢,而且起热。有震动,2-3秒转动一个齿。第二电机应该按照程序反转,电机却没有倒转。 ...

回复

ID:230847 发表于 2018-10-7 15:16
试验了一下高频率4kHZ,驱动器可以正常工作。但是当给驱动器反向信号时,驱动器仍然正转。在原理图上模拟无问题。始终都是低电平。最后用单片机控制5V继电器进行高低电平的切换。(原来用三极管S8050)。
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit LED_R=P1^0;        //红色指示灯
  6. sbit LED_G=P1^2;        //绿色指示灯
  7. sbit LED_B=P1^1;        //蓝色指示灯
  8. sbit key_D=P3^6;        //前进按钮
  9. sbit key_R=P3^7;        //后退按钮,目前不用
  10. sbit PUL=P2^0;          //脉冲口,连步进电机驱动器
  11. sbit DIR=P0^0;          //方向口,连步进电机驱动器
  12. uchar time;            
  13. uint count;
  14. uint temp;
  15. uint t=0;
  16. void Delay200us();
  17. void Delay10ms();
  18. void key_scan();       //按键程序
  19. void main()
  20. {
  21.   P1=0xff;
  22.        
  23.         TMOD &= 0xF0;
  24.                  
  25.   TH0 = 0xFF;               
  26.   TL0 = 0X8D;                       //0xF7       
  27.   EA=1;
  28.   ET0=1;
  29.   while(1)
  30.   {
  31.      key_scan();
  32.   }
  33.   }
  34. //***********************************************************//
  35. void Delay200us()                //@11.0592MHz
  36. {
  37. unsigned char i;

  38.         _nop_();
  39.         i = 89;
  40.         while (--i);
  41. }
  42. //***************************************************************//
  43. void Delay10ms()                //@11.0592MHz
  44. {
  45.         unsigned char i, j;

  46.         i = 18;
  47.         j = 235;
  48.         do
  49.         {
  50.                 while (--j);
  51.         } while (--i);
  52. }


  53. //*****当前进按钮按下一次,步进电机向前走100步,100走完停止,当按第二次继续向前走200步,走完停止。当按第三次,后退300步******//
  54.   void key_scan()
  55.   {
  56.      if(key_D==0)              
  57.      {
  58.         Delay10ms();
  59.        
  60.         if(key_D==0)
  61.         {
  62.            t++;
  63.            if(t>=4)
  64.            {
  65.              t=0;
  66.            }
  67.            switch(t)
  68.            {
  69.              case 1:DIR=0;TR0=0;LED_R=0;LED_G=1;LED_B=1;Delay200us();temp=10000;TR0=1;break;//前进100步
  70.              case 2:DIR=0;TR0=0;LED_R=1;LED_G=0;LED_B=1;Delay200us();temp=20000;TR0=1;break;//继续前期200步
  71.              case 3:DIR=1;TR0=0;LED_R=1;LED_G=1;LED_B=0;Delay200us();temp=30000;TR0=1;break;//后退300步。
  72.              default:break;
  73.             }
  74.          }
  75.          while(!key_D);
  76.          
  77.         }
  78. }
  79.             
  80. //*********************定时器0*******************************//
  81. void Timer0Init(void) interrupt 1 using 1               
  82. {
  83.    TH0 = 0xFF;               
  84.    TL0 = 0x8D;         //100,,0xF7
  85.    time++;
  86.    if(time>=100)
  87.       {
  88.          time=0;
  89.          count++;
  90.          if(count>=temp)
  91.             {
  92.                TR0=0;
  93.                count=0;
  94.                LED_R=1;
  95.                LED_G=1;
  96.                LED_B=1;
  97.                PUL=0;
  98.              }
  99.       }       
  100.       if(time<=10)
  101.          {
  102.             PUL=0;
  103.          }
  104.       else
  105.         {
  106.            PUL=1;
  107.         }
  108.        
  109.    }


复制代码
ID:230847 发表于 2018-10-7 15:11
今天试验了一下频率太低了。我把频率提高到4kHZ,步进电机驱动正常。
ID:386381 发表于 2018-10-6 21:46
1000Hz是频率太高了不是太低了
ID:230847 发表于 2018-10-6 19:19
刚刚发的程序注释变成乱码了,再传一边。
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED_R=P1^0;        //红色指示灯
sbit LED_G=P1^2;        //绿色指示灯
sbit LED_B=P1^1;        //蓝色指示灯
sbit key_D=P3^6;        //前进按钮
sbit key_R=P3^7;        //后退按钮,目前不用
sbit PUL=P2^0;          //脉冲口,连步进电机驱动器
sbit DIR=P2^1;          //方向口,连步进电机驱动器
uchar time;            
uchar count;
uchar temp;
uint t=0;
void Delay200us();
void Delay10ms();
void key_scan();       //按键程序
void main()
{
  P1=0xff;
  P2=0x00;
  TMOD= 0x01;

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

Powered by 单片机教程网

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