完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
工作中经常遇到需要连续测速的应用,担心编码器“抖动”,导致速度测不准
一。 简单原理 编码器计数 ----》 数值取样 ----》 差分 ----》 FIR滤波 ----》 比例计算实际速度 二。 硬件接口 三。 差分计算 #define MAXCOUNT1 20000 //最大计数值 per 0.1s #define ENCODER_TIM_PERIOD 39999 //计数自动重装值 值在 0 到 39999之间 /*使用100ms 定时器,定时调用该函数*/ int16_t Enc_GetCount(void) { static uint16_t last_count = 0; uint16_t cur_count; cur_count = __HAL_TIM_GetCounter(&htim2); /*获取编码计数值*/ int32_t Angle = cur_count - last_count; if(Angle 》 MAXCOUNT1) /*判定上溢出*/ { Angle -= ENCODER_TIM_PERIOD; } if(Angle 《 -MAXCOUNT1) /*判定下溢出*/ { Angle += ENCODER_TIM_PERIOD; } last_count = cur_count; return Angle; /*返回差分值*/ } 四。 FIR滤波器 使用matlab 的 FDAtool工具,设计FIR滤波器 采样频率Fs = 10Hz 阶数order = 5(过长延迟增加) 导出滤波器参数 h(6) = -0.0691 0.0296 0.5204 0.5204 0.0296 -0.0691 C语言实现的FIR滤波器计算 /*简单的FIR滤波器*/ const float h[6] = {-0.0691 ,0.0296 ,0.5204 ,0.5204 ,0.0296 ,-0.0691} float Fir_Filter(int16_t xn) { static int16_t xx[6] = {0}; /*FIR 长度6*/ float ret; int16_t i; xx[0] = xn; ret = xx[0] * h[0]; for(i = 5;i 》 0;i--) { ret += h(i) * xx[i]; xx(i) = xx(i-1); } return ret; } 5. 计算速度 结合编码器一圈的脉冲数,可以换算成速度 如角频率,圈每分,圈每秒等。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1828 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1640 浏览 1 评论
1109 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
742 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1698 浏览 2 评论
1954浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
763浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
590浏览 3评论
608浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
575浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-1 20:30 , Processed in 0.749112 second(s), Total 48, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号