微步驱动原理:
细分驱动,把加在线圈上的电压 从最大到最小的过程,分四次给完,产生四个中间
状态,即四细分。伟力电机内部转子一个分步角度为60度。四细分之后,就变成
15度。外部指针则转1/12度。
细分方法:
根据电流等分,得到四个电压点,根据这四个电压点,预先计算出四个PWM值。
于是一个过程就需要24个点。
单片机需要处理的就是电流的方向控制。由伟力电机时序图,可以分析出每一个相的
电流方向。有四种情况。
正相增大,正相减小,反向增大,反向减小。
const unsigned char OCRnA_Val[24] =
{
5,48,94,163,220,247,250,247,220,163,94,48,5,207,161,92,34,8,5,8,34,92,161,207
}; //微步码 两个线圈中电流相位是60度,
void step_moto_control(void)
{
if(direction_flag) //正转
{
if(OCRnA_Num_L==0)
{
OCRnA_Num_L = 23;
coil_1B_ON();
}
else
OCRnA_Num_L--;
if(OCRnA_Num_L<=12) coil_1B_CLE();
OCR0A = OCRnA_Val[OCRnA_Num_L]; //左线圈电流
if(OCRnA_Num_R==0)
{
OCRnA_Num_R = 23;
coil_2B_ON();
}
else
OCRnA_Num_R--;
if(OCRnA_Num_R<=12) coil_2B_CLE();
OCR0B = OCRnA_Val[OCRnA_Num_R];
}
else //反转
{
OCRnA_Num_L++;
if(OCRnA_Num_L>=13) coil_1B_ON();
if(OCRnA_Num_L>23)
{
OCRnA_Num_L=0;
coil_1B_CLE();
}
OCR0A = OCRnA_Val[OCRnA_Num_L];
OCRnA_Num_R++;
if(OCRnA_Num_R>=13) coil_2B_ON();
if(OCRnA_Num_R>23)
{
OCRnA_Num_R=0;
coil_2B_CLE();
}
OCR0B = OCRnA_Val[OCRnA_Num_R];
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我的程序实验会失步。
最近在捣鼓42步进电机细分的时候遇到一个问题难以理解,请大侠帮忙答疑解惑。
步进电机在取细分表的时候,是应该取π/2的弧度还是π的弧度?在网上看到大家都是取π弧度的,对此十分的疑惑。比如8细分的正余弦细分表如下:
u16 sin_8_X_buf[]= //8 PWM正弦细分表
{
0,1534,2896,3770,
4096,3797,2896,1600,
};
u16 cos_8_X_buf[]= //8 PWM余弦细分表
{
4096,3797,2896,1600,
0,1534,2896,3770,
};
从图片中可以看出,每相的电流变化都是按正相增大,正相减小,反向增大,反向减小的方式去变化。
如果按π弧度取细分表的话,那不是每走π/2弧度就得换相么?在下一相的时候再重新读取细分表,这样就相当于4细分。8细分是如何得到的呢?
一周热门 更多>