jinglixixi 发表于 2020-7-6 17:39

【芯圣SDK-HC89F0541测评】+步进电机驱动

本帖最后由 芯圣电子官方QQ 于 2023-7-21 09:01 编辑

步进电机是一种常用的执行器件,使用它能进行精准的定位及转速调节等工作。一个简单的步进电机驱动要由步进电机、驱动模块及单片机构成。为了驱动步进电机,除了硬件方面的准备,还需必要的软件配合。要手工编写步进电机驱动程序主要分为以下几步:1)分配引脚的使用以步进电机的MA~ MD引脚分别与P24、P35、P34、P33相连接
2)定义输出高低电平的宏定义#define MAL      P2_4= 0#define MAH   P2_4= 1#define MBL      P3_5=0#define MBH   P3_5= 1#define MCL   P3_4= 0#define MCH   P3_4= 1#define MDL   P3_3= 0#define MDH   P3_3= 1
3)配置延时函数配置延时函数的工作在步进电机的驱动中十分重要,它控制着步进电机运转的快慢。但问题也正出在这里,对于步进电机来说其速度是与驱动脉冲有关,但也并非脉冲越快,电机的转速越快。因为电机电机属于机械器件,要建立相应的磁场及达到相应的扭矩才能使电机转动。过快的脉冲只会使电机在原地震颤和抖动,并无法旋转。使电机转动的延时函数为:void delay_ms(void)
{
         unsigned char b,c;
         for(c=0;c<180;c++)
         {
               for(b=0;b<15;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(void)
{
          unsigned char rdata=1,f,c;
          while((CLKCON&0x20)!=0x20);
          CLKSWR = 0x51;
          while((CLKSWR&0xC0)!=0x40);
          CLKDIV = 0x01;
          P0M0 = 0xC2;
          P2M4 = 0xC2;
          P3M5 = 0xC2;
          P3M4 = 0xC2;
          P3M3 = 0xC2;
          LED4 = 1;
          delay_ms();
          MAL;
          MBL;
          MCL;
          MDL;
          delay_ms();
          LED4 = 0;
          f=1;
          for(c=0;c<rdata;c++)
          {
                  if(f==0)
                     fx();
               else
                  {
                     zx();
                  }
          }
          LED4 = 1;
          f=0;
          for(c=0;c<rdata;c++)
          {
                  if(f==0)
                        fx();
                  else
               {
                     zx();
               }
          }
          while(1);
}
经实际验证,其效果正常并如图所示。步进电机驱动效果图

电竞孔乙己 发表于 2021-6-10 16:11

直接用延时函数只能用于一般的控制,精度太差,

jinglixixi 发表于 2021-6-10 16:26

电竞孔乙己 发表于 2021-6-10 16:11
直接用延时函数只能用于一般的控制,精度太差,

道理上的确是这么说,但实际效果有限,这种步进电机的调节空间有限,过快过慢均不相应。

yangxiaor520 发表于 2021-6-10 21:24

这个步进电机有点历史了

jinglixixi 发表于 2021-6-11 08:01

yangxiaor520 发表于 2021-6-10 21:24
这个步进电机有点历史了

的确是这样,基本是做些简单测试和使用。

勇者无惧你和我 发表于 2021-6-11 08:55

这个驱动确实不错的。很棒。

usysm 发表于 2021-7-6 14:50

两相步进电机驱动程序?

typeof 发表于 2021-7-6 14:51

步进电机驱动器怎么选的

yujielun 发表于 2021-7-6 14:52

步进电机启动器的脉冲频率与速度成正比吧

htmlme 发表于 2021-7-6 14:53

给步进电机子程序加个延时

pklong 发表于 2021-7-6 14:54

用定时的方式来控制步进电机   

touser 发表于 2021-7-6 14:54

没加延时函数效率高            

myiclife 发表于 2021-7-6 14:55

电机的最大速度会受到延时方法的影响

uytyu 发表于 2021-7-6 14:55

            

iyoum 发表于 2021-7-6 14:55

中断PWM/延时函数               

jkl21 发表于 2021-7-6 14:56

脉冲序列的产生用微处理器实现,有软件延时和硬件定时两种方法。

htmlme 发表于 2021-7-6 14:56

中断步进电机运行   

yujielun 发表于 2021-7-6 14:56

步进电机28byj48的延时程序中的值如何计算?   

typeof 发表于 2021-7-6 14:56

步进电机驱动器如何接线

usysm 发表于 2021-7-6 14:56

用单片机编写步进电机的驱动程序 有哪几种方案?
页: [1] 2
查看完整版本: 【芯圣SDK-HC89F0541测评】+步进电机驱动