[通用8051核FLASH系列] 【芯圣SDK-HC89F0541测评】+步进电机驱动

[复制链接]
 楼主| jinglixixi 发表于 2020-7-6 17:39 | 显示全部楼层 |阅读模式
本帖最后由 芯圣电子官方QQ 于 2023-7-21 09:01 编辑

步进电机是一种常用的执行器件,使用它能进行精准的定位及转速调节等工作。一个简单的步进电机驱动要由步进电机、驱动模块及单片机构成。
为了驱动步进电机,除了硬件方面的准备,还需必要的软件配合。
要手工编写步进电机驱动程序主要分为以下几步:
1)分配引脚的使用
以步进电机的MA~ MD引脚分别与P24P35P34P33相连接

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)配置延时函数
配置延时函数的工作在步进电机的驱动中十分重要,它控制着步进电机运转的快慢。
但问题也正出在这里,对于步进电机来说其速度是与驱动脉冲有关,但也并非脉冲越快,电机的转速越快。因为电机电机属于机械器件,要建立相应的磁场及达到相应的扭矩才能使电机转动。过快的脉冲只会使电机在原地震颤和抖动,并无法旋转。
使电机转动的延时函数为:
  1. void delay_ms(void)
  2. {
  3.            unsigned char b,c;
  4.            for(c=0;c<180;c++)
  5.            {
  6.                  for(b=0;b<15;b++);
  7.            }
  8. }

4)控制电机旋转方向
对于4相5线式步进电机来讲,可通过8个节拍的脉冲序列来控制其正反转。
正转的驱动函数为:
  1. void zx()
  2. {
  3.     unsigned char X,Y;  
  4.     for(X=0;X<64;X++)
  5.     {
  6.       for(Y=0;Y<8;Y++)
  7.       {
  8.          MDL;
  9.          MAH; //A
  10.          delay_ms();
  11.          MBH; //AB
  12.          delay_ms();
  13.          MAL; //B
  14.          delay_ms();
  15.          MCH; //BC
  16.          delay_ms();
  17.          MBL; //C
  18.          delay_ms();
  19.          MDH; //CD
  20.          delay_ms();
  21.          MCL; //D
  22.          delay_ms();
  23.          MAH; //DA
  24.          delay_ms();
  25.        }               
  26.     }  
  27. }

反转的驱动函数为:
  1. void fx()
  2. {
  3.     unsigned char X,Y;
  4.     for(X=0;X<64;X++)   
  5.     {
  6.       for(Y=0;Y<8;Y++)  
  7.       {
  8.          MDH;
  9.          MAH; //A
  10.          delay_ms();
  11.          MAL; //AB
  12.          delay_ms();
  13.          MCH; //B
  14.          delay_ms();
  15.          MDL; //BC
  16.          delay_ms();
  17.          MBH; //C
  18.          delay_ms();
  19.          MCL; //CD
  20.          delay_ms();
  21.          MAH; //D
  22.          delay_ms();
  23.          MBL; //DA
  24.          delay_ms();
  25.        }               
  26.     }
  27. }

5)主程序控制电机运行
  1. void main(void)
  2. {
  3.           unsigned char rdata=1,f,c;
  4.           while((CLKCON&0x20)!=0x20);
  5.           CLKSWR = 0x51;
  6.           while((CLKSWR&0xC0)!=0x40);
  7.           CLKDIV = 0x01;
  8.           P0M0 = 0xC2;
  9.           P2M4 = 0xC2;
  10.           P3M5 = 0xC2;
  11.           P3M4 = 0xC2;
  12.           P3M3 = 0xC2;
  13.           LED4 = 1;
  14.           delay_ms();
  15.           MAL;
  16.           MBL;
  17.           MCL;
  18.           MDL;
  19.           delay_ms();
  20.           LED4 = 0;
  21.           f=1;
  22.           for(c=0;c<rdata;c++)
  23.           {
  24.                   if(f==0)
  25.                        fx();
  26.                  else
  27.                   {
  28.                        zx();
  29.                   }
  30.           }
  31.           LED4 = 1;
  32.           f=0;
  33.           for(c=0;c<rdata;c++)
  34.           {
  35.                   if(f==0)
  36.                         fx();
  37.                   else
  38.                  {
  39.                        zx();
  40.                  }
  41.           }
  42.           while(1);
  43. }

经实际验证,其效果正常并如图所示。
1.png
步进电机驱动效果图
电竞孔乙己 发表于 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 | 显示全部楼层
用单片机编写步进电机的驱动程序 有哪几种方案?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

518

主题

2935

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部