第一次写博客,写的不好请多包涵
采用迷你编码器,采集脉冲数(不推荐使用迷你编码器,采集的脉冲数误差变化范围大,我们的两个组都采用迷你编码器,示波器测出,误差范围较大,建议使用欧姆龙,非常稳定)
由于使用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(); }