GTIM有编码器模式,并且还有上溢与下溢中断,两者结合似乎可以扩展编码器位数到32位,
用一个有符号的RAM变量表示高16位,即:上溢时,变量+1,下溢时,变量-1,合在一起为一个32位编码器。
关键代码:
编码器设置程序:
GTIM->CR0 = 0x018001; // 编码器模式3,启动计数器
GTIM->ICR = 0x00; //写0清0
GTIM->IER = 0x05; //开下溢UD、上溢OV中断
NVIC->ISER[0] = 0x010000; //开NVIC_GTIM中断
中断处理程序:
void GTIM_IRQHandler(void) // GTIM编码器上溢下溢中断处理
{
if(GTIM->ISR & 0x0001) mgw++; // 上溢
if(GTIM->ISR & 0x0004) mgw--; // 下溢
GTIM->ICR = 0x00; // 中断标志写0清0
mzdcs++; // 观察进入中断情况
}
然而想法没有实现,观察到的现象有3点:
1. CR0.EN 在编码器模式无效,为0时,编码器仍然可以计数。
2. CNT在65535,死在中断上(反复进入中断),中断似乎不是计数值跳变触发的。在调试中,将CNT设置为65535也这样,不是信号抖动造成的。
3. CR0.EN 对中断有影响,为1时,UD与OV同时产生。
哪里有问题呢?
|