打印
[技术问答]

赛元SC95F8616单片机驱动步进电机源程序

[复制链接]
799|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mickit|  楼主 | 2023-10-16 08:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

1)分配引脚的使用
以步进电机的MA~ MD引脚分别与P32~ P35相连接
sbit MA       =   P3^2;
sbit MB       =   P3^3;
sbit MC       =   P3^4;
sbit MD       =   P3^5;

2)定义输出高低电平的宏定义
#define MAL    MA  =   0;
#define MAH    MA  =   1;
#define MBL    MB  =   0;
#define MBH    MB  =   1;
#define MCL    MC  =   0;
#define MCH    MC  =   1;
#define MDL    MD  =   0;
#define MDH    MD  =   1;

3)配置延时函数
配置延时函数的工作在步进电机的驱动中十分重要,它控制着步进电机运转的快慢。
但问题也正出在这里,对于步进电机来说其速度是与驱动脉冲有关,但也并非脉冲越快,电机的转速越快。因为电机电机属于机械器件,要建立相应的磁场及达到相应的扭矩才能使电机转动。过快的脉冲只会使电机在原地震颤和抖动,并无法旋转。
使电机转动的延时函数为:
void delay_ms(void)
{
           unsigned char b,c;
           for(c=0;c<180;c++)
           {
               for(b=0;b<8;b++);
           }
}
4)控制电机旋转方向
对于4相5线式步进电机来讲,可通过8个节拍的脉冲序列来控制其正反转。
正转的驱动函数为:
void zx()
{
    unsigned char X,Y;  
    for(X=0;X<64;X++)
    {
      for(Y=0;Y<8;Y++)
      {
         MDL;
         MAH; //A
         delay_ms();
         MBH; //AB
         delay_ms();
         MAL; //B
         delay_ms();
         MCH; //BC
         delay_ms();
         MBL; //C
         delay_ms();
         MDH; //CD
         delay_ms();
         MCL; //D
         delay_ms();
         MAH; //DA
         delay_ms();
       }               
    }  
}


反转的单片机驱动函数为:
void fx()
{
    unsigned char X,Y;
    for(X=0;X<64;X++)    // 控制节拍数
    {
      for(Y=0;Y<8;Y++)   // 控制节拍
      {
         MDH;
         MAH; //A
         delay_ms();
         MAL; //AB
         delay_ms();
         MCH; //B
         delay_ms();
         MDL; //BC
         delay_ms();
         MBH; //C
         delay_ms();
         MCL; //CD
         delay_ms();
         MAH; //D
         delay_ms();
         MBL; //DA
         delay_ms();
       }               
    }
}


5)主程序控制电机运行
void main()
{
     unsigned char rdata=9,f,c;
     delay_ms();
     //停止电机转动
     MAL;
     MBL;
     MCL;
     MDL;
     delay_ms();
     f=1;//控制转向
     while(1)
     {
                            for(c=0;c<rdata;c++)    //控制转动的位置
                            {
                                     if(f==0)
                                           fx();
                                     else
                                     {
                                          zx();
                                     }
                           }
     }
}
复制代码


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

1328

帖子

1

粉丝