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

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条回答
terencechang
1楼-- · 2019-12-16 00:55
ZJSXHWL000000 发表于 2014-4-29 05:24
我想问:是不是PWM输出需要H桥驱动伟力的仪表用步进电机。
因为直接驱动仪表的M9S12HY内部都带,而通用单片 ...

不是的。看我上面代码应该就知道。一个电机需要2个PWM 跟两个普通IO驱动,不需要专用IC 。我用瑞萨8路PWM的同时驱动4个电机做仪表盘 ,效果妥妥的。
如果你用飞思卡尔的 仪表专用 芯片 就不需要驱动了啊,他内部带驱动的。
ZJSXHWL000000
2楼-- · 2019-12-16 00:55
楼上是汽车仪表的专家,我用ATMEL 16的两路PWM驱动都有问题。PWM电流驱动小于10ma.而步进电机为17ma,无法正常驱动。
噪声也太大。
瑞萨8路PWM没用过。
我看网上有加与门74HC08驱动。
还有楼上怎么联系。
terencechang
3楼-- · 2019-12-16 02:00
 精彩回答 2  元偷偷看……
terencechang
4楼-- · 2019-12-16 04:15
/**************************************************************
步进电机速度控制函数
***************************************************************/
void Speed_Control(void)
{
           unsigned int angle_difference = 0;
        unsigned int Speed_control_temp = 0;
        if(current_angle == set_angle)
        {
                 Speed_control_Val = 50;
                 return;
        }  
        else
        {
            if(direction_flag==CCW)
                  angle_difference = current_angle - set_angle;
        else if(direction_flag==CW)
                 angle_difference = set_angle - current_angle;
                if(angle_difference>=100) //>=9
                {
                     if(angle_difference>=1080)             //>90
                          Speed_control_temp  =  1;         
                         else if(angle_difference>=720)         //60
                              Speed_control_temp  =  2;
                         else if(angle_difference>=540)         //>45
                              Speed_control_temp  =  3;
                 else
                      Speed_control_temp  =  2160/angle_difference;    //根据当前误差求出速度
                                  if(Speed_control_temp>=20) Speed_control_temp = 20;
                     if(Speed_control_Val>Speed_control_temp)   //加速
                     {
                                  Speed_control_Val -= 1;
                              if(Speed_control_Val<=Speed_control_temp)
                                  {
                                       Speed_control_Val = Speed_control_temp;       
                                  }
                     }
                         else                                 
                         {
                               if(angle_difference<=120&&Speed_control_Val<=4)           //<10   减速
                                   {
                                            Speed_control_Val += 1;
                                   }           
                         }                 
                }
        }       
}
terencechang
5楼-- · 2019-12-16 05:36
本帖最后由 terencechang 于 2014-5-4 08:37 编辑

加减速控制 。梯形加减速。
const unsigned char add_speed_val[7]= {0xac,0xcc,0xdb,0xde,0xe2,0xe5,0xe7};//,0xe9};//,0xea};//加速曲线672,417,324,276,244,221,204,190.--us
//一个全步之后换一次速度。回零最佳曲线。
terencechang
6楼-- · 2019-12-16 07:32
ZJSXHWL000000 发表于 2014-4-29 17:18
楼上是汽车仪表的专家,我用ATMEL 16的两路PWM驱动都有问题。PWM电流驱动小于10ma.而步进电机为17ma,无法 ...

顺便说说 伟利的步进 电机噪音确实不小。想要噪音小,推荐台达步进电机。内部没有任何齿轮的。噪音基本为零。
抄小日本的技术。据说日系车上大部分用的都是这种电机。
噪音小,寿命厂。

一周热门 更多>