标题: STM32控制步进电机程序+详细解说资料(通俗易懂) [打印本页]

作者: 尼古拉斯    时间: 2019-4-16 09:32
标题: STM32控制步进电机程序+详细解说资料(通俗易懂)

步进电机(也称脉冲电机)(将电脉冲转换为相应的角位移或线位移的电磁机械装置,具有快速启动,停能力,在电机的负荷不超过它能提供的动态转矩时,可以通过输入脉冲来控制它在一瞬间的启动或者停止。在非超载的情况下,步距角和转速只和输入的脉冲频率有关,和环境温度,气压,振动无关,也不受电网电压的波动和负载变化的影响,因此,控制较为精准)即给电机一个脉冲信号,电机则转过一个步距角


步进电机是一种感应电机,它的工作原理:利用电子电路,将直流电变成分时供电的,多相时序控制电流,用这种电流为步进电机供电,步进电机才能正常工作,驱动器就是为步进电机分时供电的,多相时序控制器,就是说:必须用由双环形脉冲信号功率驱动电路等组成的控制系统方可使用。


步距角:控制系统每发一个步进脉冲信号,电机所转动的角度。电机出厂时给了一个步距角的值,如:86BYG250A型      电机的值为0.9、1.8(表示半步工作时为0.9,整步为1.8),被称之为“电机的固有步距角”,但是不一定是      电机实际工作时的真正步距角,真正的步距角和驱动器有关


相数:电机内部的线圈组数,目前常用的有二相,三相,四相,五相步进电机。电机相数不同,其步距角也就不同了,  一般二相电机的步距角为0.9/1,8,三相为0.36/0.72,五相为0.36/0.72。在没有细分驱动器的情况下,用户主要 靠选择不同相数的步进电机来满足自己步距角的要求。如果使用细分驱动器,那么相数好像也就没有了意义

拍数:完成一个磁场周期性变化所需脉冲数或导电状态,或指电机转过一个步距角所需脉冲数。以如下的四相电机为            例,有四相四拍运行方式,AB-BC-CD-DA-AB;四相八拍:A-AB-B-BC-C-CD-D-DA-A


失步:电机运转时运转的步数不等于理论上的步数,称之为失步


开环控制与闭环控制:(主要看系统中有没有反馈环节)(反馈指的是动作所引起的效果)

(反馈简单的理解就是:“你打了别人一巴掌,我们看到了它的脸是红的,嗯嗯,这就是眼睛所得到的反馈”)

闭环控制:存在反馈环节的控制,就是当前的系统能够实时的检测控制的输出结果,并将检测到的信息通过反馈环节反映到输入端,调整输入量,达到修正控制误差,提高控制精度的目的,(对外部扰动和系统参数变化不敏感)如:

(闭环)

全自动洗衣机,给洗衣机加水时,里边有一个红外传感器,扫描到水位高低,当水位合适时,洗衣机自动停止加水


家用空调根据传感器采集到当前的温度,然后比较设定温度,通过设定指令,控制室内外机的工作情况,改变频率,压缩机的转速等进行简单的调节,然后不断地进行控制


寻迹小车时,两边的红外传感器不断的检测黑线,将返回的结果输入到相应i/o口上,我们对这些i/o口进行中断检测就可以知道,当前时刻的位置,然后可以执行相应的操作(左转,右转);


调节平衡天平的时候,其中一种方法就是利用mpu6050获取当前所处位置的角度,调用PID算法,对当前的位置或者角度进行处理,然后对调整后的角度再次进行反馈处理

(家用空调调节温度)

家用空调调节指定的温度,靠的是电子传感器,(电子传感器就是一个热敏电阻,不同的温度会有不同的阻值),利用也可以理解为电子膨胀,不同的温度会有不同的阻值。利用对入风口的空气进行取样,把数据传输到控制板上,然后,在与设定的温度进行比较,产生一个指令来实现控制。(制冷的话,比较之后:输出室内风机和室外机的开机指令,内外机开始工作(室外机包括压缩机,室外风机,四通阀等部件),工作一定温度的话,室内温度将会:1,(定频空调)达到设定值,室外机停止工作,室内机保持工作,保证空气循环,当室内温度逐渐上升,大于设定值2-3度时,室外机重新启动制冷,室内温度将又开始下降,重复这个过程,室内温度就能保持在设定温度值上下1度左右范围内波动; 2,(变频空调)接近设定值,室外机的变频板输出的频率下降,压缩机转速下降,制冷量也相应降低,室内温度保持在与设定值相同的数值下。随着室内热源的变化,室内机温度传感器实时检测温度的变化,主控板输出的控制信号使变频器跟随变化调节压缩机工作频率,从而改变瞬时制冷量,确保室内温度稳定)



开环控制:不存在反馈环节的控制,也就是控制器与被控制对象间只有顺序作业而无反方向联系且控制单方向进行,

                  ,无自动纠偏能力,不用取输出量变化信号控制输入量。

                  

                   如:在开车的过程中,我们来控制方向盘

                   人工转换电扇的档位实现转速的控制,不用反馈回来实际的转速

                   给洗衣机加水时:我们通过来观察水位来确定什么时候关掉水龙头

(所以,简单的说:就是看有没有反馈:开环没有,闭环有,对于用到机器上来说,每一件事都是有反馈的,只是情况不同而已,当反馈是人自己来判断的话,那么这个系统就是开环的,如果反馈是机器自己来判断的话,那么这个系统就是闭环的)

从整体的角度来看:


单片机控制电机正转源程序如下:
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "usart.h"

  4. //引脚连接
  5. //IN1:PC3、IN2:PC2、IN3:PC0、IN4:PC13、

  6. //步进电机初始化函数
  7. void Motor_Init(void)
  8. {
  9.         GPIO_InitTypeDef GPIO_InitStructure;
  10.         
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//开启时钟
  12.         
  13.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3;
  14.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
  15.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  16.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  17.         
  18.         GPIO_ResetBits(GPIOC,GPIO_Pin_13);//默认低电平
  19.         GPIO_ResetBits(GPIOC,GPIO_Pin_0);
  20.         GPIO_ResetBits(GPIOC,GPIO_Pin_2);
  21.         GPIO_ResetBits(GPIOC,GPIO_Pin_3);
  22.         
  23. }

  24. //步进电机正转函数(反转参考51版本)
  25. void Motorcw(void)
  26. {
  27.         GPIO_SetBits(GPIOC,GPIO_Pin_13);//依次高电平输出
  28.         GPIO_ResetBits(GPIOC,GPIO_Pin_0);
  29.         GPIO_ResetBits(GPIOC,GPIO_Pin_2);
  30.         GPIO_ResetBits(GPIOC,GPIO_Pin_3);
  31.         delay_ms(10);
  32.         
  33.         GPIO_ResetBits(GPIOC,GPIO_Pin_13);
  34.         GPIO_SetBits(GPIOC,GPIO_Pin_0);
  35.         GPIO_ResetBits(GPIOC,GPIO_Pin_2);
  36.         GPIO_ResetBits(GPIOC,GPIO_Pin_3);
  37.         delay_ms(10);
  38.         
  39.         GPIO_ResetBits(GPIOC,GPIO_Pin_13);
  40.         GPIO_ResetBits(GPIOC,GPIO_Pin_0);
  41.         GPIO_SetBits(GPIOC,GPIO_Pin_2);
  42.         GPIO_ResetBits(GPIOC,GPIO_Pin_3);
  43.         delay_ms(10);
  44.         
  45.         GPIO_ResetBits(GPIOC,GPIO_Pin_13);
  46.         GPIO_ResetBits(GPIOC,GPIO_Pin_0);
  47.         GPIO_ResetBits(GPIOC,GPIO_Pin_2);
  48.         GPIO_SetBits(GPIOC,GPIO_Pin_3);
  49.         delay_ms(10);
  50.         
  51. }

  52. int main(void)
  53. {
  54.         delay_init();//delay初始化函数
  55.         Motor_Init();
  56. while(1)
  57. {
  58.         Motorcw();
  59. }
  60. }
复制代码

正转代码与芯片资料供大家学习:
ULN2003步进电机正转代码与资料.7z (577.56 KB, 下载次数: 1160)


作者: 张先生一个人    时间: 2019-8-22 21:03
你好,请问怎样使57步进电机旋转方向发生改变?
我现在能驱动电机逆时针旋转,要怎么做能使电机顺时针旋转呢?
我尝试过改变DIR的输入电平,但是并没有发生改变。

作者: hujj    时间: 2019-8-23 10:34
张先生一个人 发表于 2019-8-22 21:03
你好,请问怎样使57步进电机旋转方向发生改变?
我现在能驱动电机逆时针旋转,要怎么做能使电机顺时针旋转 ...

改变时序就能控制正反转。
作者: zp17777    时间: 2019-10-21 21:27
谢谢你分享的资料,感谢
作者: yjglan    时间: 2019-11-4 15:51
看到代码眼前一亮
这样就不需要 驱动器了。
学习了
作者: zwl911124    时间: 2019-11-4 22:56
ths...
作者: yzh327    时间: 2019-11-16 17:57
楼主威武,感谢分享。
作者: 807964046    时间: 2019-11-19 08:16
感谢分享
作者: 4591314    时间: 2019-11-19 20:00
f407可以控制么?
作者: kxq    时间: 2019-12-11 19:19
请问那四个引脚哪个是脉冲,哪个是方向
作者: kxq    时间: 2019-12-11 19:22
hujj 发表于 2019-8-23 10:34
改变时序就能控制正反转。

请问你有32控制步进电机的程序吗?

作者: Lee_2019    时间: 2019-12-14 23:31
有PID的吗?
作者: 敲敲小木鱼    时间: 2020-1-2 10:18
楼主威武,感谢分享。
作者: 花式虐狗    时间: 2020-1-2 16:59
楼主威武,感谢分享。
作者: venjo    时间: 2020-1-8 11:47
楼主威武,感谢分享。
作者: 00750    时间: 2020-1-19 09:38
我想下来看看
作者: 156450727    时间: 2020-1-31 11:19
谢谢你分享的资料
作者: 18710841730    时间: 2020-3-18 00:10
感谢分享

作者: yaoke7941    时间: 2020-3-19 10:59
谢谢分享,学习一下
作者: yaoke7941    时间: 2020-3-19 11:20
谢谢分享,学习一下
作者: liufeng180840    时间: 2020-3-23 08:52
谢谢分享,学习一下
作者: 海底奇侠    时间: 2020-4-5 12:24
学习一下
作者: 华尔街神探    时间: 2020-5-14 22:42
不懂这个上位机的具体原理
作者: 时光LS    时间: 2020-5-30 09:44
厉害,感谢分享!
作者: bbcs852    时间: 2020-6-7 19:48
谢谢分享,学习一下
不知道怎么收藏主题,我从51开始转STM32了
作者: 周凯    时间: 2020-6-15 10:29
正在学习STM32,刚好准备找些例子来联系下,看到楼主的帖子很实用,超级简单,非常感谢!!
作者: 15532112031    时间: 2020-7-3 11:19
驱动模块是什么
作者: LYT123456    时间: 2020-8-11 14:13
hujj 发表于 2019-8-23 10:34
改变时序就能控制正反转。

反转:0001 0010 0100 1000
作者: 123456789zhangh    时间: 2020-9-14 13:27
如何控制进行反转
作者: 与我同在    时间: 2020-9-17 20:54
kxq 发表于 2019-12-11 19:22
请问你有32控制步进电机的程序吗?

这不就是32的吗

作者: 774278841    时间: 2020-9-22 22:18
还以为是A4988的驱动了,2003啊
作者: WSZXAAA    时间: 2020-12-26 00:02
超级简单,非常感谢!!

作者: GlenXu    时间: 2021-2-22 20:41
浪费资源,照这样可以用更简单的数字电路搭一个,连程序都不需要。
作者: lzlrsddz    时间: 2021-4-24 02:43
谢谢,正好需要,下载来看看
作者: suph007    时间: 2021-4-28 12:59
有其他更优化的算法么?
作者: xcza    时间: 2021-5-5 10:42
kxq 发表于 2019-12-11 19:22
请问你有32控制步进电机的程序吗?

他上面有连接
作者: 我为单片机哭泣    时间: 2021-5-17 15:42
张先生一个人 发表于 2019-8-22 21:03
你好,请问怎样使57步进电机旋转方向发生改变?
我现在能驱动电机逆时针旋转,要怎么做能使电机顺时针旋转 ...

57步进电机该怎么连接呢
作者: stm32单片机哭哭    时间: 2021-6-11 13:34
周凯 发表于 2020-6-15 10:29
正在学习STM32,刚好准备找些例子来联系下,看到楼主的帖子很实用,超级简单,非常感谢!!

你好,请问你调试出来了吗?
作者: huand123    时间: 2021-6-18 10:40
有protues 仿真吗
作者: huand123    时间: 2021-6-19 00:10
怎么连接啊,没有原理图或实物图
作者: 996658355    时间: 2021-10-18 10:45
我为单片机哭泣 发表于 2021-5-17 15:42
57步进电机该怎么连接呢

请问你弄清楚了吗?可以分享一下吗?
作者: inacdgd    时间: 2021-10-20 09:08
基于正点原子开发板的一个实验例子,感谢分享!
作者: liudi2526    时间: 2021-11-19 10:02
言过其实!就是原子的例程嘛,哪有按键控制功能了?!扣几个币无所谓,这种做法令人反胃!
作者: xinamofu    时间: 2021-12-25 08:31
yjglan 发表于 2019-11-4 15:51
看到代码眼前一亮
这样就不需要 驱动器了。
学习了

白亮了 ,去学点基础的东西吧




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1