使用HAL库进行电机测速滤波

如果将测得的速度值用vofa+上位机画出来,我们可能会看到这样的曲线
从图中我们可以看到,速度值在目标速度附近来回小幅度震荡,始终不稳定。这是因为编码器测速得到的速度值是离散的,如果电机的速度值刚好卡在两个离散值中间,我们测得的速度值就会在这两个离散值中间来回震荡。如果我们想要解决这个问题,最好先对测速的精度进行分析。
对于m法测速来说,测速的公式如下,其中,k是将速度换算成rpm的比例系数
由于除号后面的都是定值,所以我们只要分析每次采样的脉冲数对速度的影响即可。
我们假设现在测速频率是50hz,减速比为30,编码器线数为13,那么脉冲数每变化1,速度的变化为
所以我们测得的速度只能是1.923rpm的整数倍。如果想要提高精度,在电机不变的情况下,我们可以使用500线的gmr编码器或者降低测速频率。
在vofa+中,我们可以测得震荡时波峰和波谷的差值为1.92左右,和我们的计算相符。
为了改善这一现象,我们可以对速度采样值使用平均滤波,即将最近几次的速度采样值存放到数组中,每测得一个新的速度,就将新速度存入数组,将最早测得的速度值从数组中删除,我们使用的速度值是数组中所有速度的平均值。实现代码如下
#define speed_record_num 20 // 经测试,50hz个采样值进行滤波的效果比较好float speed_record[speed_record_num]={0};/* * 进行速度的平均滤波 * 输入新采样到的速度,存放速度的数组, * 返回滤波后的速度 */float speed_low_filter(float new_spe,float *speed_record){ float sum = 0.0f; test_speed = new_spe; for(uint8_t i=speed_record_num-1;i >0;i--)//将现有数据后移一位 { speed_record[i] = speed_record[i-1]; sum += speed_record[i-1]; } speed_record[0] = new_spe;//第一位是新的数据 sum += new_spe; test_speed = sum/speed_record_num; return sum/speed_record_num;//返回均值}void hal_tim_periodelapsedcallback(tim_handletypedef *htim)//定时器回调函数,用于计算速度{ if(htim- >instance==gap_tim.instance)//间隔定时器中断,是时候计算速度了 { motor1.direct = __hal_tim_is_tim_counting_down(&encoder_tim);//如果向上计数(正转),返回值为0,否则返回值为1 motor1.totalcount = counternum_1 + motor1.overflownum * reloadvalue_1;//一个周期内的总计数值等于目前计数值加上溢出的计数值 if(motor1.lastcount - motor1.totalcount > 19000) // 在计数值溢出时进行防溢出处理 { motor1.overflownum++; motor1.totalcount = counternum_1 + motor1.overflownum * reloadvalue_1;//一个周期内的总计数值等于目前计数值加上溢出的计数值 } else if(motor1.totalcount - motor1.lastcount > 19000) // 在计数值溢出时进行防溢出处理 { motor1.overflownum--; motor1.totalcount = counternum_1 + motor1.overflownum * reloadvalue_1;//一个周期内的总计数值等于目前计数值加上溢出的计数值 } motor1.speed = (float)(motor1.totalcount - motor1.lastcount) / (4 * motor_speed_reratio * pulse_pre_round) * 3000;//算得每秒多少转,除以4是因为4倍频 /*******************在这里添加滤波函数************************/ motor1.speed = speed_low_filter(motor1.speed,speed_record); /**********************************************************/ motor1.lastcount = motor1.totalcount; //记录这一次的计数值}经过滤波后的速度曲线如下。
绿线是原始速度,红线是目标速度,粉线是滤波后的速度。可以看到,滤波后的速度值明显要平滑很多,这对我们后期的pid调试是很有利的。

运放电路—虚短虚断介绍
关于ETAS和LABCAR系统
函数类型和函数指针类型的区别
直线模组3D打印帮助解决三叉痛
贴片电阻上数字的含义,你知道吗?
使用HAL库进行电机测速滤波
苹果发WWDC邀请函,10.5英寸的iPad Pro面世?
现场画面曝光!机器狗检查SpaceX爆炸
马自达首款轿跑MX-5RF即将上市,马自达将推两款新车
WCDMA中LMS自适应天线阵的硬件实现
图解直流电机,直流电机电机结构模型与纵向剖视图图解
高速自动测试设备的未来
DIY一种基于人工智能传感器的烟雾检测系统
国网安徽电力完成古泉换5G信号全覆盖,实现通信智能化运维
熊猫·陌果科技亮相中国水协2022/2023年会暨城镇水务技术与产品展示
折叠屏的出现打破了原有的人机交互形式
小米6之后,小米又来两款新机小米X1、红米pro2或将挑起手机市场腥风血雨
AI语音技术为何发展如此迅速
dfrobot迷你直流减速电机6V减速比1:35 570rpm简介
美的空调维修S1柜机电控说明书