完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
硬件:STM32F429IGT6核心板 操作系统:RTT V4.1.5 使用设备驱动运行脉冲编码器。 运行情况:定时器10ms采集一次脉冲编码器的脉冲值并与上一次脉冲值做差,来得出速度 代码如下:【代码中的所有变量皆为int32_t 类型】 /** [url=home.php?mod=space&uid=2666770]@Brief[/url] 编码器计数,速度计算 [url=home.php?mod=space&uid=3142012]@param[/url] None @retval None @note 292 M法 */ rt_int32_t walk_count; rt_int32_t walk_last_count; static void Motor_Encoder_Calculation(void) { /* 读取脉冲编码器计数值 */ rt_device_read(pulse_encoder_dev, 0, & walk_count, 1); walk.motor.get_freq = ( walk_count - walk_last_count) * 10; walk.motor.get_speed = 60 * ( walk_count - walk_last_count) * 10 / RESOLUTION; walk_last_count = walk_count; } 问题点:脉冲编码器过零点问题 使用设备框架运行脉冲编码器,读取的值只有正数。那么在过零点的时候,将会变为一个较大的整数。例如32755等等。这就要去处理过零点问题。很麻烦。 过零时断点截图如下 解决办法:将drv_pulse_encoder.c中的宏定义 #define AUTO_RELOAD_VALUE 0x7FFF 改为 #define AUTO_RELOAD_VALUE 0xFFFF 这样在过零点时,自动溢出,将变量值变成负数。这样做出来的速度就是正确的了。 应该有个设置,速度模式或者位置模式。速度模式用0XFFFF.角度模式用0X7FFF。这样就比较合适 |
|
相关推荐
1个回答
|
|
对于过零问题,处理不好会引入相当大的误差,除了引入超大差值的判断并自动纠正,也可以根据自己counter支持的模式,设置watermark,程序上可以是read and clear。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
583 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
2207 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1227 浏览 0 评论
1776 浏览 0 评论
1462 浏览 0 评论
74797 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 16:54 , Processed in 0.735434 second(s), Total 69, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号