【15系列】SYK-0806-A2S1 工业自动化控制之【11-步进电机转动指定圈数】
大家好,我是『芯知识学堂』的SingleYork,前一篇文章给大家介绍了“SYK-0806-A2S1 工业自动化控制之【10-步进电机加减速】”,这一篇中,笔者要给大家介绍如何让步进电机运行我们指定的圈数。
那么,首先我们来看下步进电机的定义:步进电机是一种专门用于速度和位置精确控制的特种电机,
它是以固定的角度(称为步距角)一步一步运行的,故称步进电机。
在没有细分的情况下,一个脉冲信号,电机转子就转过一个步距角的角位移。
通常这个步距角为0.9°或1.8°。如果按照步距角为1.8°来计算,电机转动一圈所需要的脉冲数即为:360°/1.8°=200个。
当然咯,为了提高步进电机的步距分辨率,减小转矩波动,避免低频共振及降低运行噪声,很多步进电机厂家往往会采用细分驱动技术。
其基本思想是控制每相绕组电流的波形,使其阶梯上升或下降,即在0和最大值之间给出多个稳定的中间状态,
定子磁场的旋转过程中也就有了多个稳定的中间状态,对应与电机转子旋转的步数就会增多、步距角减小。
常见的步进电机驱动器上的细分有两种表达方式,一种是直接以1、2、4、8等这种方式,
另外一种就是直接以脉冲数200、400、800、1600等这种方式来表示,甚至有些驱动器上这两种方式都包含在内:
当然咯,笔者所使用的这块驱动器,有点特殊,能做的细分比较少,仅仅只是通过两个拨码开关来最多设置4种细分:
根据该驱动板的使用说明,SET1、SET2的设置及对应的细分(脉冲数)分别对应如下:
本例中,将SET1和SET2均设置成了1,也就是对应800个脉冲数电机转动一圈。假设我们现在要让电机运行两圈,
那么我就需要发送1600个脉冲,这里笔者用一个宏定义来表示这个数:
#define M0_Max_PUL 1600 //电机运行最大脉冲数
另外,还定义了一些其他的变量:
#define M0_PUL P30 //定义电机0脉冲对应的GPIO
#define M0_DIR P31 //定义电机0方向对应的GPIO
#define M0_Start X00 //定义电机0 启动 信号对应的GPIO
#define M_Run_CW 0 //电机顺时针运行
#define M_Run_CCW 1 //电机逆时针运行
#define M0_Level_Low0 //低电平
#define M0_Level_High 1 //高电平
bit F_M0_Run = 0; //电机运行标志
u32 M_PUL_Cnt= 0; //电机脉冲计数
u32 Timer0_Fre = 2000UL; //timer0频率初值
u32 Timer2_Fre = 500UL; //timer2频率初值
app_int()函数依然跟前进一讲的内容一样:
/********************* APP初始化 ***********************/
void app_init(void)
{
GPIO_Config(); //GPIO配置
Timer0_config(Timer0_Fre); //定时器0配置
Timer2_config(Timer2_Fre); //定时器2配置
TR0= 0; //定时器0停止运行
EA = 1; //开启总中断
}
接下来,笔者是想通过X00来控制电机的启动,脉冲依然是由timer0来产生。整个动作逻辑如下:
当X00由低电平变成高电平时,电机0以初始频率(2kHz)顺时针启动,电机0转完2圈后,停止运行。
X00的控制逻辑是在app_run()函数里面实现,代码如下:
void app_run(void)
{
static bit F_M0_Start= 0;
/**************************************************
X00由低电平变成高电平时,电机0以初始2kHz频率顺时针启动
电机0转2圈后,停止运行
**************************************************/
if(!F_M0_Run)//电机未运行
{
if(!F_M0_Start)
{
if(!M0_Start) //X00低电平
{
delay_ms(10); //10ms消抖
if(!M0_Start)
{
F_M0_Start = 1;//X00低电平标志置“1”
}
}
}
else
{
if(M0_Start) //X00高电平
{
delay_ms(10); //10ms消抖
if(M0_Start)
{
F_M0_Start = 0; //X00低电平标志清“0”
TR0 = 1; //定时器0开始运行
M0_DIR = M_Run_CW; //电机0运行方向:顺时针
M0_PUL = M0_Level_High;//将电机脉冲电平保持为高电平
M0_DIR = M0_Level_High;//将电机方向电平保持为高电平
M_PUL_Cnt= 0; //电机脉冲计数清零
F_M0_Run = 1; //电机运行标志置“1”
}
}
}
}
}
脉冲的产生以及判断脉冲计数等操作,则是直接放到了timer0的中断函数里面来完成,代码如下:
/********************* Timer0中断函数************************/
void timer0_int (void) interrupt TIMER0_VECTOR //频率可变
{
M0_PUL = !M0_PUL; //电机脉冲信号P30状态翻转
if(M0_PUL == M0_Level_Low)//脉冲有效电平为低电平
{
M_PUL_Cnt ++;//脉冲计数加“1”
if(M_PUL_Cnt>=M0_Max_PUL)//当前脉冲数达到设定值,电机停止运行
{
M_PUL_Cnt = 0;
F_M0_Run= 0; //电机运行标志清“0”
TR0 = 0; //定时器0停止运行,电机停止
M0_PUL = M0_Level_High;//将电机脉冲电平保持为高电平
M0_DIR = M0_Level_High;//将电机方向电平保持为高电平
}
}
}
当然咯,其实在中断函数里面本来是不应该放太多其他跟逻辑相关代码,只是这里整个程序的代码都比较少,
而且timer0中断的频率也不是很高,所以将这部分放在timer0的中断函数里面也没太大的问题。
好了,关于使用本节内容笔者就介绍到这里了,有疑问的小伙伴们可以给笔者留言或者直接参与评论,
下一节笔者将给大家介绍“如何让步进电机实现精确定位”,详见“【STC15系列】SYK-0806-A2S1 工业自动化控制之【12-步进电机精确定位】”,感谢大家的支持!
本章附件:
大家好,我是『芯知识学堂』的SingleYork,今天我们将继续探讨SYK-0806-A2S1在工业自动化控制中的应用,特别是如何实现步进电机转动指定圈数的控制。
步进电机的基本原理
步进电机是一种将电脉冲信号转换为角位移或线位移的执行元件。每输入一个脉冲信号,电机就转动一个固定的角度,这个角度称为步距角。步进电机的步距角通常为1.8°或0.9°,这意味着在没有细分的情况下,电机转动一圈需要200个脉冲(360°/1.8°)或400个脉冲(360°/0.9°)。
细分驱动技术
为了提高步进电机的控制精度和运行平稳性,现代步进电机驱动器通常采用细分驱动技术。细分驱动通过控制每相绕组的电流波形,使其在0和最大值之间产生多个稳定的中间状态,从而增加电机转子的步数和减小步距角。例如,一个1.8°步距角的电机在4细分驱动下,每转需要800个脉冲(200×4)。
SYK-0806-A2S1的细分设置
在SYK-0806-A2S1驱动板上,细分设置通过两个拨码开关(SET1和SET2)来实现。根据驱动板的使用说明,SET1和SET2的不同组合对应不同的细分设置。例如:
SET1=OFF, SET2=OFF:1细分,每转200个脉冲
SET1=ON, SET2=OFF:2细分,每转400个脉冲
SET1=OFF, SET2=ON:4细分,每转800个脉冲
SET1=ON, SET2=ON:8细分,每转1600个脉冲
实现步进电机转动指定圈数
要实现步进电机转动指定圈数,我们需要根据电机的步距角和驱动器的细分设置计算出所需的脉冲数。假设我们使用1.8°步距角的电机,并设置驱动器为4细分,那么电机每转需要800个脉冲。如果我们需要电机转动5圈,那么所需的脉冲数为:
\[ \text{脉冲数} = \text{每转脉冲数} \times \text{圈数} = 800 \times 5 = 4000 \]
在SYK-0806-A2S1的控制程序中,我们可以通过以下步骤实现这一功能:
1. 初始化电机和驱动器:设置电机的步距角和驱动器的细分模式。
2. 计算脉冲数:根据所需的圈数和细分设置计算出所需的脉冲数。
3. 发送脉冲信号:通过控制器的输出端口发送相应数量的脉冲信号。
4. 监控电机状态:在电机运行过程中,实时监控其状态,确保其按照预期运行。
示例代码
以下是一个简单的示例代码,展示了如何在SYK-0806-A2S1上实现步进电机转动指定圈数:
c
include
// 定义电机参数
define STEPSPERREV 800// 每转脉冲数
define TARGETREVS 5 // 目标圈数
// 初始化电机和驱动器
void setup() {
SYK0806A2S1.init();
SYK0806A2S1.setMicrostepping(4);// 设置4细分
}
// 主循环
void loop() {
int totalSteps = STEPSPERREVTARGETREVS;// 计算总脉冲数
SYK0806A2S1.step(totalSteps);// 发送脉冲信号
delay(1000);// 等待1秒
}
总结
通过合理设置步进电机的细分模式和计算所需的脉冲数,我们可以精确控制步进电机转动指定的圈数。SYK-0806-A2S1提供了灵活的细分设置和强大的控制功能,使其在工业自动化控制中具有广泛的应用前景。希望本文能帮助大家更好地理解和应用步进电机控制技术。
感谢大家的阅读,我们下期再见!
SingleYork
『芯知识学堂』
[本文内容由国芯人工智能辅助生成,仅供参考] SYK-0806-A2S1 工业自动化控制之【11-步进电机转动指定圈数】
大家好,我是『芯知识学堂』的SingleYork。在上一篇文章中,我们详细探讨了“SYK-0806-A2S1 工业自动化控制之【10-步进电机加减速】”,今天我们将进一步深入,介绍如何实现步进电机按照指定圈数运行。
步进电机的基本原理
步进电机是一种将电脉冲信号转换为角位移或线位移的特种电机。其核心特点在于,每接收到一个脉冲信号,电机转子就会按照固定的步距角旋转一步。常见的步距角为1.8°或0.9°。以1.8°步距角为例,电机旋转一圈(360°)所需的脉冲数为:
\[ \text{脉冲数} = \frac{360°}{\text{步距角}} = \frac{360°}{1.8°} = 200 \]
细分驱动技术
为了提高步进电机的控制精度和运行平稳性,细分驱动技术被广泛应用。其基本原理是通过控制每相绕组的电流波形,使其在0和最大值之间产生多个稳定的中间状态,从而将步距角进一步细分。例如,在4细分模式下,步距角从1.8°减小到0.45°,旋转一圈所需的脉冲数则增加到800。
细分驱动器的设置方式通常有两种:
1. 以倍数表示,如1、2、4、8等;
2. 以脉冲数表示,如200、400、800、1600等。
SYK-0806-A2S1 驱动器的细分设置
在本文中,笔者使用的SYK-0806-A2S1驱动器通过两个拨码开关(SET1和SET2)实现细分设置。根据驱动板的使用说明,其细分设置及对应的脉冲数如下:
| SET1 | SET2 | 细分倍数 | 脉冲数/圈 |
|------|------|----------|-----------|
| OFF| OFF| 1 | 200 |
| ON | OFF| 2 | 400 |
| OFF| ON | 4 | 800 |
| ON | ON | 8 | 1600 |
实现步进电机转动指定圈数
要实现步进电机按照指定圈数运行,需要根据细分设置计算出所需的脉冲总数。计算公式如下:
\[ \text{脉冲总数} = \text{每圈脉冲数} \times \text{指定圈数} \]
例如,在4细分模式下(每圈800脉冲),若需要电机旋转5圈,则脉冲总数为:
\[ \text{脉冲总数} = 800 \times 5 = 4000 \]
控制逻辑与代码实现
在工业自动化控制中,通常通过微控制器或PLC生成脉冲信号,并控制脉冲的频率和数量。以下是一个简单的控制逻辑示例:
1. 根据细分设置确定每圈脉冲数;
2. 根据目标圈数计算脉冲总数;
3. 生成指定频率的脉冲信号,并计数至脉冲总数;
4. 停止脉冲输出,完成电机转动。
以某微控制器为例,其伪代码如下:
c
int pulsesPerRevolution = 800; // 4细分模式下每圈脉冲数
int targetRevolutions = 5; // 目标圈数
int totalPulses = pulsesPerRevolutiontargetRevolutions; // 计算脉冲总数
for (int i = 0; i < totalPulses; i++) {
generatePulse(); // 生成一个脉冲
delayMicroseconds(pulseInterval); // 控制脉冲频率
}
注意事项
1. 脉冲频率:脉冲频率决定了电机的转速,需根据电机和负载的特性合理设置;
2. 加减速控制:在启动和停止时,建议采用加减速控制,以避免失步或过冲;
3. 细分设置:细分倍数越高,控制精度越高,但也会增加脉冲生成的计算量。
总结
通过合理设置细分参数并计算脉冲总数,我们可以精确控制步进电机的转动圈数。这一技术在工业自动化领域具有广泛的应用,如数控机床、3D打印机、机器人等。希望本文能为大家提供实用的参考,也欢迎大家在评论区交流讨论。
——SingleYork,『芯知识学堂』
[本文内容由国芯人工智能辅助生成,仅供参考]
页:
[1]