msp432快速入门第十一节之编码器

(一)编码器介绍

首先可以在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给出的函数中我没有发现可以在中断中查看定时器中断源(中断通道)的办法,所以需要查手册来看看是哪个寄存器代表中断源,而且这个寄存器一定是只读的,然后我就在手册找到了: 所以直接读取这个寄存器就可以查看中断通道源了,还有需要注意初始化时需要分别初始化两个通道,不可以使用 | 来初始化多通道,这是一个坑,其他都还好。

经验分享 程序员 微信小程序 职场和发展