分享:步进电机细分驱动思路及程序

2019-12-13 18:21发布

微步驱动原理:
     细分驱动,把加在线圈上的电压 从最大到最小的过程,分四次给完,产生四个中间
         状态,即四细分。伟力电机内部转子一个分步角度为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];
     }
}  
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
49条回答
ZJSXHWL000000
1楼-- · 2019-12-18 22:35
一端用PWM驱动,一端左边线圈置位,右边线圈清0。
我的程序实验会失步。
ZJSXHWL000000
2楼-- · 2019-12-19 03:50
请问楼主:PWM采用快速,相位修正,还是相频修正。
xz199264
3楼-- · 2019-12-19 09:28

最近在捣鼓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细分是如何得到的呢?
jiafulu
4楼-- · 2019-12-19 12:32
 精彩回答 2  元偷偷看……
end2000
5楼-- · 2019-12-19 14:04
步进电机。代码
pango
6楼-- · 2019-12-19 15:45
楼主,请问用表计算得到的PWM值控制相电流,如果达不到要比较的DA输出的值的话,或者高于DA输出的值的话,怎么处理?是斩波电流自动处理吗?还是需要调整PWM的数值?

一周热门 更多>