本程序中针对的传感器具有A和C两个输出,旋转时两个都可以产生中断,只是转向不同时相位不同。程序中使用一个触发中断,在中断里面判断另外一个的电平,开始不管怎么写都会有有一些误判断,我曾经循环判断了100次,只要有一次判断与其他不同的都丢弃,结果还是会有一些误判断,后来加了两个边沿检测,基本可以算是万无一失了,我转了1一个小时都没发现有方向判断错误的。加t1、t2是防止程序死在中断里面,如果慢转丢失判断结果可以适当增大t1、t2。
[mw_shl_code=c,true]//旋转编码器旋转中断
//ROTARY_A、ROTARY_C
void EXTI3_IRQHandler(void) //中断号9(PC3)
{
u8 t1 = 50;
u16 t2 = 1000;
if ((EXTI->PR) & (1 << 3))
{
EXTI->PR = 1 << 3; //清除LINE3上的中断标志位
if (!ROTARY_C)
{
Delay_us(10);
while ((ROTARY_A == 0) && (t1--))
{
Delay_ms(1);
}
Delay_us(10);
if (ROTARY_C)
UART1_printf("顺时针转
");
}
else
{
Delay_us(10);
while ((ROTARY_A == 0) && (t2--))
{
Delay_ms(1);
}
Delay_us(10);
if (!ROTARY_C)
UART1_printf("逆时针转
");
}
}
}
[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
[mw_shl_code=applescript,true]//需要包含的头文件
#include <stdarg.h>
void UART1_printf(char *fmt,...)
{
va_list ap;
char string[256];
va_start(ap, fmt);
vsprintf(string, fmt, ap);
UART1_SendString(string);
va_end(ap);
}[/mw_shl_code]
一周热门 更多>