以前以为编码开关和普通开关是一样的,向左旋则触发一路信号,向右则触发另一路信号.
把实物焊接好才发现不是那么回事.用万用表量根本看不出区别,把开关拆了,还是看不懂.
接上示波器,瞬间明了.
(这张图片是引用网络上的)
可以看出,在一路信号被拉低的过程中,另一路信号随旋转方向不同,会产生 方向相反的脉冲信号
我使用的是STM8S103F3P6 的单片机,
PA2 PA3 分别上拉10K,接至旋转编码器的两个输出脚,公共脚接地.
实现有两种方式,
一种是 定时检测,
在测试过程中发现就算一秒钟检测100次,也会有数据丢失的情况(旋得太快了).
只好改用中断检测:
思路是这样的,设PA3为下降沿触发中断. 在下降沿时PA2为高则判断是左转,为低则判断为右转.
看起来很简单啊?
在调试时发现仍然不妙,尝试旋转一下编码开关,从示波器中看到只有一个下降沿一个上升沿,可从调试信息来看.
它产生了数次中断.
这是什么原因呢???请大侠指教!!!
难道是硬件抖动?于是我串个电容到编码开关上,效果依然不理想.
只好软件消抖了,如下:
#include "common.h"
u8 delay_EXTI=0;
void EXTI_Init()//外部中断初始化
{
EXTI_CR1=0X02;//PA口下降沿触发中断
}
#pragma vector=0x05
__interrupt void EXTI_PA()
{
if (delay_EXTI !=0) return;
// UART1_SendU8(PA_IDR);
if (PA_IDR_IDR3 ==0)
{
if (PA_IDR_IDR2 ==1)
{
UART1_SendStr("left ");
}
else
{
UART1_SendStr("right ");
}
}
delay_EXTI = 10 ;
}
delay_EXIT 被定时器每MS一次,不断地减1,直至到0.
能看到效果了.
只是仍然产生了不少误码.
怎么办,没辄了.
|