(一)编码器介绍
首先可以在man手册中查看TAx的功能(function),发现他不支持直连编码器,然后看了下timer32,发现timer32也不支持,不过好消息是发现TAx定时器支持输入捕获,那我们只能使用输入捕获来计算编码器的数值了,如果是步方向编码器可以直接拿来用了,如果是正交编码器需要使用D触发器鉴相,具体电路可以百度搜索,我自己使用的是正交编码器,利用74HC74D双D触发器来鉴相,这样可以直接给两个电机使用了。
(二)移植输入捕获程序
仿照TI的官方例子进行配置输入捕获:
(1)配置TAx定时器
/* Timer_A Continuous Mode Configuration Parameter */
const Timer_A_ContinuousModeConfig Encoder_continuousModeConfig =
{
TIMER_A_CLOCKSOURCE_SMCLK, // SMCLK Clock Source
TIMER_A_CLOCKSOURCE_DIVIDER_24, // SMCLK/24 = 500KHz
TIMER_A_TAIE_INTERRUPT_DISABLE, // Disable Timer ISR
TIMER_A_SKIP_CLEAR // Skup Clear Counter
};
/* Timer_A Capture Mode Configuration Parameter */
const Timer_A_CaptureModeConfig Encoder_captureModeConfig0 =
{
TIMER_A_CAPTURECOMPARE_REGISTER_1, // CC Register 1
TIMER_A_CAPTUREMODE_RISING_EDGE, // Rising Edge
TIMER_A_CAPTURE_INPUTSELECT_CCIxA, // CCIxA Input Select
TIMER_A_CAPTURE_ASYNCHRONOUS, // Asynchronoused Capture
TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE, // Enable interrupt
TIMER_A_OUTPUTMODE_OUTBITVALUE // Output bit value
};
// 初始化编码器
void Encoder_Init(void)
{
//编码器计数部分
//引脚复用
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN6,
GPIO_PRIMARY_MODULE_FUNCTION);
//配置模式
Timer_A_initCapture(TIMER_A2_BASE, &Encoder_captureModeConfig0);
//配置连续捕获
Timer_A_configureContinuousMode(TIMER_A2_BASE, &Encoder_continuousModeConfig);
//配置中断
Interrupt_enableInterrupt(INT_TA2_N);
//开始捕获
Timer_A_startCounter(TIMER_A2_BASE, TIMER_A_CONTINUOUS_MODE);
//方向部分
GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1,GPIO_PIN7);
}
(2)配置中断
/* TA0 ISR */
void TA2_N_IRQHandler(void)
{
encoder0_cnt ++;
Timer_A_clearCaptureCompareInterrupt(TIMER_A2_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1);
}
(3)主函数读取
while(1)
{
Read_Encoder();
oled_int16(0,0,encoder0_val);
delay_ms(100);
}
(4)烧录后查看现象
可以看到轮子朝一个方向转时数值为正,另外一个方向为负,而且随着速度变快数值会变化,说明成功了。
(三)优化支持双轮速度读取
双轮的话我们就需要多通道中断判断了,在TI给出的函数中我没有发现可以在中断中查看定时器中断源(中断通道)的办法,所以需要查手册来看看是哪个寄存器代表中断源,而且这个寄存器一定是只读的,然后我就在手册找到了:
所以直接读取这个寄存器就可以查看中断通道源了,还有需要注意初始化时需要分别初始化两个通道,不可以使用 | 来初始化多通道,这是一个小问题,其他都还好。
克隆空白工程请使用 git , 如果你觉得还不错欢迎点亮 star !
git clone https://github.com/YGZone/Design-a-car-with-MSP432P401R.git