找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 48176|回复: 44
收起左侧

STM32控制步进电机程序+详细解说资料(通俗易懂)

  [复制链接]
ID:341601 发表于 2019-4-16 09:32 | 显示全部楼层 |阅读模式
0.png
步进电机(也称脉冲电机)(将电脉冲转换为相应的角位移或线位移的电磁机械装置,具有快速启动,停能力,在电机的负荷不超过它能提供的动态转矩时,可以通过输入脉冲来控制它在一瞬间的启动或者停止。在非超载的情况下,步距角和转速只和输入的脉冲频率有关,和环境温度,气压,振动无关,也不受电网电压的波动和负载变化的影响,因此,控制较为精准)即给电机一个脉冲信号,电机则转过一个步距角


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


步距角:控制系统每发一个步进脉冲信号,电机所转动的角度。电机出厂时给了一个步距角的值,如: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

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


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

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

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

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


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


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


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

(家用空调调节温度)

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



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

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

                   3.png

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

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

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

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

从整体的角度来看:


单片机控制电机正转源程序如下:
  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, 下载次数: 1148)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:592523 发表于 2019-8-22 21:03 | 显示全部楼层
你好,请问怎样使57步进电机旋转方向发生改变?
我现在能驱动电机逆时针旋转,要怎么做能使电机顺时针旋转呢?
我尝试过改变DIR的输入电平,但是并没有发生改变。
回复

使用道具 举报

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

改变时序就能控制正反转。
回复

使用道具 举报

ID:477269 发表于 2019-10-21 21:27 | 显示全部楼层
谢谢你分享的资料,感谢
回复

使用道具 举报

ID:561150 发表于 2019-11-4 15:51 | 显示全部楼层
看到代码眼前一亮
这样就不需要 驱动器了。
学习了
回复

使用道具 举报

ID:635700 发表于 2019-11-4 22:56 | 显示全部楼层
ths...
回复

使用道具 举报

ID:643277 发表于 2019-11-16 17:57 | 显示全部楼层
楼主威武,感谢分享。
回复

使用道具 举报

ID:346097 发表于 2019-11-19 08:16 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:620272 发表于 2019-11-19 20:00 | 显示全部楼层
f407可以控制么?
回复

使用道具 举报

ID:661807 发表于 2019-12-11 19:19 | 显示全部楼层
请问那四个引脚哪个是脉冲,哪个是方向
回复

使用道具 举报

ID:661807 发表于 2019-12-11 19:22 | 显示全部楼层
hujj 发表于 2019-8-23 10:34
改变时序就能控制正反转。

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

使用道具 举报

ID:552218 发表于 2019-12-14 23:31 | 显示全部楼层
有PID的吗?
回复

使用道具 举报

ID:224687 发表于 2020-1-2 10:18 | 显示全部楼层
楼主威武,感谢分享。
回复

使用道具 举报

ID:444035 发表于 2020-1-2 16:59 | 显示全部楼层
楼主威武,感谢分享。
回复

使用道具 举报

ID:514795 发表于 2020-1-8 11:47 | 显示全部楼层
楼主威武,感谢分享。
回复

使用道具 举报

ID:136769 发表于 2020-1-19 09:38 | 显示全部楼层
我想下来看看
回复

使用道具 举报

ID:569391 发表于 2020-1-31 11:19 | 显示全部楼层
谢谢你分享的资料
回复

使用道具 举报

ID:697863 发表于 2020-3-18 00:10 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:314952 发表于 2020-3-19 10:59 | 显示全部楼层
谢谢分享,学习一下
回复

使用道具 举报

ID:314952 发表于 2020-3-19 11:20 | 显示全部楼层
谢谢分享,学习一下
回复

使用道具 举报

ID:270740 发表于 2020-3-23 08:52 | 显示全部楼层
谢谢分享,学习一下
回复

使用道具 举报

ID:722576 发表于 2020-4-5 12:24 | 显示全部楼层
学习一下
回复

使用道具 举报

ID:744679 发表于 2020-5-14 22:42 | 显示全部楼层
不懂这个上位机的具体原理
回复

使用道具 举报

ID:764790 发表于 2020-5-30 09:44 | 显示全部楼层
厉害,感谢分享!
回复

使用道具 举报

ID:711985 发表于 2020-6-7 19:48 | 显示全部楼层
谢谢分享,学习一下
不知道怎么收藏主题,我从51开始转STM32了
回复

使用道具 举报

ID:779670 发表于 2020-6-15 10:29 | 显示全部楼层
正在学习STM32,刚好准备找些例子来联系下,看到楼主的帖子很实用,超级简单,非常感谢!!
回复

使用道具 举报

ID:774108 发表于 2020-7-3 11:19 来自手机 | 显示全部楼层
驱动模块是什么
回复

使用道具 举报

ID:799134 发表于 2020-8-11 14:13 | 显示全部楼层
hujj 发表于 2019-8-23 10:34
改变时序就能控制正反转。

反转:0001 0010 0100 1000
回复

使用道具 举报

ID:215043 发表于 2020-9-14 13:27 | 显示全部楼层
如何控制进行反转
回复

使用道具 举报

ID:730649 发表于 2020-9-17 20:54 | 显示全部楼层
kxq 发表于 2019-12-11 19:22
请问你有32控制步进电机的程序吗?

这不就是32的吗
回复

使用道具 举报

ID:822141 发表于 2020-9-22 22:18 | 显示全部楼层
还以为是A4988的驱动了,2003啊
回复

使用道具 举报

ID:862513 发表于 2020-12-26 00:02 | 显示全部楼层
超级简单,非常感谢!!
回复

使用道具 举报

ID:469589 发表于 2021-2-22 20:41 | 显示全部楼层
浪费资源,照这样可以用更简单的数字电路搭一个,连程序都不需要。
回复

使用道具 举报

ID:223257 发表于 2021-4-24 02:43 | 显示全部楼层
谢谢,正好需要,下载来看看
回复

使用道具 举报

ID:308785 发表于 2021-4-28 12:59 | 显示全部楼层
有其他更优化的算法么?
回复

使用道具 举报

ID:915795 发表于 2021-5-5 10:42 | 显示全部楼层
kxq 发表于 2019-12-11 19:22
请问你有32控制步进电机的程序吗?

他上面有连接
回复

使用道具 举报

ID:677805 发表于 2021-5-17 15:42 来自手机 | 显示全部楼层
张先生一个人 发表于 2019-8-22 21:03
你好,请问怎样使57步进电机旋转方向发生改变?
我现在能驱动电机逆时针旋转,要怎么做能使电机顺时针旋转 ...

57步进电机该怎么连接呢
回复

使用道具 举报

ID:936303 发表于 2021-6-11 13:34 | 显示全部楼层
周凯 发表于 2020-6-15 10:29
正在学习STM32,刚好准备找些例子来联系下,看到楼主的帖子很实用,超级简单,非常感谢!!

你好,请问你调试出来了吗?
回复

使用道具 举报

ID:861681 发表于 2021-6-18 10:40 来自手机 | 显示全部楼层
有protues 仿真吗
回复

使用道具 举报

ID:861681 发表于 2021-6-19 00:10 来自手机 | 显示全部楼层
怎么连接啊,没有原理图或实物图
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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