完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在将以前的旋转编码开关的轮询查状态程序改为中断触发程序。在测试过程中发现如下问题:
比如我用PA0和PA1输入上拉来接旋转编码开关,PA1开外部中断,上升下降触发中断。中断程序如下: if(GPIO_Pin == GPIO_PIN_1) { port=(GPIOA->IDR)&0x03; if(port==0) {Left[0]=0XFF;Right[0]=0X00;} else if(port==2) {Right[0]=0XFF;Left[0]=0X00;} else if((Right[0]&port)==0x01) {rowResult[0]--;Right[0]=0X00;} else if((Left[0]&port)==0x03) {rowResult[0]++;Left[0]=0X00;} } 这个配置可以准确识别编码器的旋转,在手旋转允许的情况下,快慢都可以检测旋转量,一圈20个脉冲非常准确 但是只要你将PA1的外部中断改成PA0,同时将if(GPIO_Pin == GPIO_PIN_1)改为if(GPIO_Pin == GPIO_PIN_0)。余下的判断程序不做修改。 理论上应该没有问题,但是问题却出现了,问题基本如下: 一般需要转动3到4个脉冲后,程序才能准确识别一个脉冲。每圈识别出来的脉冲数都不同的。 而且奇怪的是,我其实同时接了4个编码器,只要你的中断脚在2个脚中间数值小的那个,就会出现这种情况,比如PA4PA5接了一个,PA4中断,程序不正常,换到PA5就正常。这种情况同时出现在STM32F1和STM32F4上。 不知为何会出现这种情况。 |
|
相关推荐
6个回答
|
|
本帖最后由 努力的人 于 2018-1-19 20:53 编辑
你这个是2块钱那个模块吧,对于脉冲计数,你可以使用输入捕获来计算脉冲,这个相对于你使用外部中断更准确一些。你出现的问题看会不会是不同线的中断的优先级配置的问题 |
|
|
|
wtefewrws 发表于 2019-3-15 19:25 现在主要是在别的程序不变的情况下,只改变外部中断脚,但是就是会出现这种高位脚程序可以,低位脚程序不行的情况。有点摸不着头脑。 |
|
|
|
STM32的IO管脚中断问题,以前也遇到过类似的。
在做PS2鼠标的时候,发现直接用中断检测有时不好用。后来进中断后,加了一小点延时,然后再读取中断IO状态的,就好使了。具体什么原因没有太去关注,有可能是中断IO有抖动,或者中断沿已经触发,但IO电平还没稳定。 |
|
|
|
zhouxk 发表于 2019-3-15 20:01 你说的我也考虑了,主要是一样的程序,高位IO中断程序正常,低位IO中断程序不正常。示波器显示的波形是一样的 |
|
|
|
有几种可能,
1、端口干扰,建议加104电容。 2、端口未正确初始化。 3、对应端口的中断优先级,设置不正确。 还有,建议把编码开关两个端口对调一下, 看看问题端口是否还是不正常。 |
|
|
|
中断配置有没有错误,STM32不同的引脚的外部中断设置和外部中断程序名称都是不一样的
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2272 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
2083 浏览 3 评论
4708 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2229 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2773 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 18:11 , Processed in 0.693828 second(s), Total 81, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号