电机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();          //获取左轮脉冲数
           lptmr_pulse_clean();
        }
        else
        {
            val_right = lptmr_pulse_get();         //获取右轮脉冲数
            lptmr_pulse_clean();
            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()
{
    //左边脉冲计数使用ftm正交解码
    val_left = ftm_quad_get(FTM1);
    ftm_quad_clean(FTM1);
    //右边脉冲计数使用LPT脉冲计数
    val_right = lptmr_pulse_get();
    lptmr_pulse_clean();
}

 

转载于:https://www.cnblogs.com/sheng520/p/9286029.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值