电机PID控制

第一次写博客,写的不好请多包涵

采用迷你编码器,采集脉冲数(不推荐使用迷你编码器,采集的脉冲数误差变化范围大,我们的两个组都采用迷你编码器,示波器测出,误差范围较大,建议使用欧姆龙,非常稳定)

由于使用k60,发现k60脉冲采集通道只有一个,无法采集双脉冲型号

采取两种方案

方案一,采用分时方案

每隔10ms采集一次脉冲,先采集左轮脉冲,再采集右轮脉冲,采集一次控制一次电机,即间隔10ms采集一次脉冲,20ms控制一次电机

val_left //左轮脉冲数
val_right //右轮脉冲数
void pulse_count(float Speed_left_hope,speed_direction Speed_direction_left,float Speed_right_hope,speed_direction Speed_direction_right)
{
#define INT_COUNT  0xFFFF          //LPT 产生中断的计数次数

    static unsigned char time = 0;  //用于左右轮采集的切换
    if(time)
    {
        if(0 == speed_period_flag)
        {
           val_left  = lptmr_pulse_get();          //获取FTM的脉冲数
           lptmr_pulse_clean();
           if(val_left > 180)
           {
             PID_speed_left_control(0,none_left);
             return;
           }
           PID_speed_left_control(Speed_left_hope,Speed_direction_left);
           speed_period_flag = 1;
        }
        else
        {
            val_right = lptmr_pulse_get();
            lptmr_pulse_clean();
            if(val_right > 180)
            {
              PID_speed_right_control(0,none_right);
              return;
            }
            PID_speed_right_control(Speed_right_hope,Speed_direction_right);
            speed_period_flag = 0;
        }
    }
    else
    {
      time = 1;
    }

    if(0 == speed_period_flag)
    {

       lptmr_pulse_init(LPT0_ALT1, INT_COUNT, LPT_Rising);
    }
    else
    {
       lptmr_pulse_init(LPT0_ALT2, INT_COUNT, LPT_Rising);
    }

}

方案二,由于硬件设计不是很合理,导致不能使用双正交解码,所以采用飞两根线,实现一边正交解码(迷你编码器兼容正交解码),一边脉冲计数的方法

void get_pulse_count()
{
    //左边脉冲计数正交解码
    val_left = ftm_quad_get(FTM1);
    ftm_quad_clean(FTM1);
    //右边脉冲计数脉冲计数
    val_right = lptmr_pulse_get();
    lptmr_pulse_clean();
}

猜你喜欢

转载自www.cnblogs.com/sheng520/p/9286029.html