Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Devices
Pulse Encoder设备问题
发布于 2020-01-18 11:17:52 浏览:2568
订阅该版
* 本帖最后由 花生米 于 2020-1-18 11:22 编辑 * 用的是stm32f103C8T6,使用编码器设备时偶尔会出现一个较大的数。我转动编码器,数字应该是连续的才对。有没有大佬遇见过,是什么问题? 以下是我的代码 static int pulse_encoder_sample(int argc, char *argv[]) { rt_err_t ret = RT_EOK; rt_device_t pulse_encoder2_dev = RT_NULL; /* 脉冲编码器设备句柄 */ rt_device_t pulse_encoder3_dev = RT_NULL; /* 脉冲编码器设备句柄 */ rt_int32_t count2,count3; rt_pin_mode(KEY_RESET_C,PIN_MODE_INPUT_PULLUP); /* 查找脉冲编码器设备 */ pulse_encoder2_dev = rt_device_find(PULSE_ENCODER2_DEV_NAME); if (pulse_encoder2_dev == RT_NULL) { rt_kprintf("pulse encoder sample run failed! can't find %s device!
", PULSE_ENCODER2_DEV_NAME); return RT_ERROR; } pulse_encoder3_dev = rt_device_find(PULSE_ENCODER3_DEV_NAME); if (pulse_encoder3_dev ==RT_NULL) { rt_kprintf("pulse encoder sample run failed! can't find %s device!
", PULSE_ENCODER3_DEV_NAME); } /* 以只读方式打开设备 */ ret = rt_device_open(pulse_encoder2_dev, RT_DEVICE_OFLAG_RDONLY); if (ret != RT_EOK) { rt_kprintf("open %s device failed!
", PULSE_ENCODER2_DEV_NAME); return ret; } ret = rt_device_open(pulse_encoder3_dev, RT_DEVICE_OFLAG_RDONLY); if (ret != RT_EOK) { rt_kprintf("open %s device failed!
", PULSE_ENCODER3_DEV_NAME); return ret; } while(1) { rt_thread_mdelay(50); if( rt_pin_read(KEY_RESET_C)==PIN_LOW ) { rt_device_control(pulse_encoder2_dev,PULSE_ENCODER_CMD_CLEAR_COUNT, RT_NULL); rt_device_control(pulse_encoder3_dev,PULSE_ENCODER_CMD_CLEAR_COUNT, RT_NULL); } rt_device_read(pulse_encoder2_dev,0,&count2,1); rt_device_read(pulse_encoder3_dev,0,&count3,1); rt_kprintf("get count2=%d, count3=%d
",count2,count3); } } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(pulse_encoder_sample, pulse encoder sample); ![360截图20200118112252468.jpg](https://oss-club.rt-thread.org/uploads/202001/18/112254u9eek9aaaojv9na9.jpg)
查看更多
25
个回答
默认排序
按发布时间排序
红枫
认证专家
2020-01-18
这家伙很懒,什么也没写!
count2,count3的类型有问题
花生米
2020-01-18
这家伙很懒,什么也没写!
>count2,count3的类型有问题 --- count2,count3在官网例程上就是“rt_int32_t”类型啊,那应该用什么类型呢?
红枫
认证专家
2020-01-19
这家伙很懒,什么也没写!
bsp驱动贴出来看看
红枫
认证专家
2020-01-19
这家伙很懒,什么也没写!
bsp层的驱动看看
花生米
2020-01-20
这家伙很懒,什么也没写!
>bsp层的驱动看看 --- rt_int32_t pulse_encoder_get_count(struct rt_pulse_encoder_device *pulse_encoder) { struct stm32_pulse_encoder_device *stm32_device; stm32_device = (struct stm32_pulse_encoder_device*)pulse_encoder; return (rt_int32_t)((rt_int16_t)__HAL_TIM_GET_COUNTER(&stm32_device->tim_handler) + stm32_device->over_under_flowcount * AUTO_RELOAD_VALUE); } void pulse_encoder_update_isr(struct stm32_pulse_encoder_device *device) { /* TIM Update event */ if (__HAL_TIM_GET_FLAG(&device->tim_handler, TIM_FLAG_UPDATE) != RESET) { __HAL_TIM_CLEAR_IT(&device->tim_handler, TIM_IT_UPDATE); if (__HAL_TIM_IS_TIM_COUNTING_DOWN(&device->tim_handler)) { device->over_under_flowcount--; } else { device->over_under_flowcount++; } } /* Capture compare 1 event */ if (__HAL_TIM_GET_FLAG(&device->tim_handler, TIM_FLAG_CC1) != RESET) { __HAL_TIM_CLEAR_IT(&device->tim_handler, TIM_IT_CC1); } /* Capture compare 2 event */ if (__HAL_TIM_GET_FLAG(&device->tim_handler, TIM_FLAG_CC2) != RESET) { __HAL_TIM_CLEAR_IT(&device->tim_handler, TIM_IT_CC2); } /* Capture compare 3 event */ if (__HAL_TIM_GET_FLAG(&device->tim_handler, TIM_FLAG_CC3) != RESET) { __HAL_TIM_CLEAR_IT(&device->tim_handler, TIM_IT_CC3); } /* Capture compare 4 event */ if (__HAL_TIM_GET_FLAG(&device->tim_handler, TIM_FLAG_CC4) != RESET) { __HAL_TIM_CLEAR_IT(&device->tim_handler, TIM_IT_CC4); } /* TIM Break input event */ if (__HAL_TIM_GET_FLAG(&device->tim_handler, TIM_FLAG_BREAK) != RESET) { __HAL_TIM_CLEAR_IT(&device->tim_handler, TIM_IT_BREAK); } /* TIM Trigger detection event */ if (__HAL_TIM_GET_FLAG(&device->tim_handler, TIM_FLAG_TRIGGER) != RESET) { __HAL_TIM_CLEAR_IT(&device->tim_handler, TIM_IT_TRIGGER); } /* TIM commutation event */ if (__HAL_TIM_GET_FLAG(&device->tim_handler, TIM_FLAG_COM) != RESET) { __HAL_TIM_CLEAR_IT(&device->tim_handler, TIM_FLAG_COM); } } 经测试问题就出在了上面这个中断函数里,感觉单片机检测不出来device->over_under_flowcount这个变量啥时候++,啥时候--
921742079
2020-01-26
这家伙很懒,什么也没写!
[i=s] 本帖最后由 921742079 于 2020-1-26 17:57 编辑 [/i] 我转的时候,也遇到了这个问题,而且不是猛转,就是一点点拨,20多突然到327xx,然后继续拨,线性增加,然后又3w多,慢慢拨动,这个情况很明显
红枫
认证专家
2020-01-26
这家伙很懒,什么也没写!
pulse_encoder_get_count函数中应加上临界防护
红枫
认证专家
2020-01-27
这家伙很懒,什么也没写!
**pulse_encoder_get_count函数中应加上临界防护,修改如下:** rt_int32_t pulse_encoder_get_count(struct rt_pulse_encoder_device *pulse_encoder) { struct stm32_pulse_encoder_device *stm32_device; rt_base_t level; rt_int32_t result; stm32_device = (struct stm32_pulse_encoder_device*)pulse_encoder; level = rt_hw_interrupt_disable(); result = (rt_int32_t)((rt_int16_t)__HAL_TIM_GET_COUNTER(&stm32_device->tim_handler) + stm32_device->over_under_flowcount * (AUTO_RELOAD_VALUE+1)); rt_hw_interrupt_enable(level); return result; } **测试结果请反馈下!!!**
921742079
2020-01-27
这家伙很懒,什么也没写!
>pulse_encoder_get_count函数中应加上临界防护,修改如下: --- [attach]13427[/attach] 貌似还是差不多
红枫
认证专家
2020-01-27
这家伙很懒,什么也没写!
是计数在0附近时频繁产生更新中断引起的,可能中断响应不够及时,把pulse_encoder_init函数中,HAL_NVIC_SetPriority(stm32_device->encoder_irqn, 3, 0)改成HAL_NVIC_SetPriority(stm32_device->encoder_irqn, 0, 0)试试,
撰写答案
登录
注册新账号
关注者
0
被浏览
2.6k
关于作者
花生米
这家伙很懒,什么也没写!
提问
8
回答
30
被采纳
0
关注TA
发私信
相关问题
1
问个问题,ili9320驱动里面rt_hw_lcd_draw_blit_line 这个函数是干什么用的
2
LCD双缓冲有什么好的办法实现
3
LCD NT35510 驱动代码
4
io设备驱动的疑惑与建议
5
液晶屏驱动 U8g2 移植
6
求助:在模板上添加LCD模块出现L6406E错误
7
hwtimer硬件定时器驱动和使用经验
8
硬件定时器超时时间计算问题
9
请教spi驱动lcd显示屏问题
10
rtt-master(3.1.1)bsp—armfly中drv_lcd.c中是不是错了啊?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
RT-Thread项目助手v0.2.0 - 支持Env Windows
2
RttreadV5.10上,GD32F450Z RTC时间显示问题
3
rt-smart启动流程分析
4
EtherKit快速上手PROFINET
5
RTThread USB转串口无法接收数据
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部