定时器a0用于pwm输出,定时器a2,b0用于编码器捕获
void tima0_init(uint16_t arr)
{
//gpio初始化
GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1,GPIO_PIN2 | GPIO_PIN3);//功能输出引脚
//定时器输出pwm初始化
Timer_A_outputPWMParam tima0_pwm={0};
tima0_pwm.clockSource=TIMER_A_CLOCKSOURCE_ACLK;//时钟源32768hz
tima0_pwm.clockSourceDivider=TIMER_A_CLOCKSOURCE_DIVIDER_1;
tima0_pwm.compareOutputMode=TIMER_A_OUTPUTMODE_RESET_SET;//复位模式
tima0_pwm.compareRegister=TIMER_A_CAPTURECOMPARE_REGISTER_1 ;//通道1
tima0_pwm.dutyCycle=0;//比较值
tima0_pwm.timerPeriod=arr;//重装载值
Timer_A_outputPWM(TIMER_A0_BASE,&tima0_pwm);
tima0_pwm.compareRegister=TIMER_A_CAPTURECOMPARE_REGISTER_2;//通道2
Timer_A_outputPWM(TIMER_A0_BASE,&tima0_pwm);
}
void tima2_init(void)
{
//配置更新中断
Timer_A_initUpModeParam tima_initparam={0};
tima_initparam.clockSource=TIMER_A_CLOCKSOURCE_SMCLK ;//时钟源16*1048576hz
tima_initparam.clockSourceDivider=TIMER_A_CLOCKSOURCE_DIVIDER_64;//64分频,262,144
tima_initparam.startTimer=false;//不立即启动
tima_initparam.timerClear=TIMER_A_DO_CLEAR;//定时器重置
tima_initparam.timerPeriod=26214;//0.1s
tima_initparam.timerInterruptEnable_TAIE=TIMER_A_TAIE_INTERRUPT_ENABLE;//中断使能
Timer_A_initUpMode(TIMER_A2_BASE,&tima_initparam);//初始化定时器,正计数模式,
Timer_A_startCounter( TIMER_A2_BASE,TIMER_A_UP_MODE);//启动定时器,递增模式
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P2,GPIO_PIN4 | GPIO_PIN5);//复用gpio
//配置输入捕获
Timer_A_initCaptureModeParam tima2_capture={0};
tima2_capture.captureInputSelect=TIMER_A_CAPTURE_INPUTSELECT_CCIxA;//决定输入选择
tima2_capture.captureInterruptEnable=TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE;//输入捕获中断使能
tima2_capture.captureMode=TIMER_A_CAPTUREMODE_RISING_EDGE;//上升沿沿触发
tima2_capture.captureOutputMode=TIMER_A_OUTPUTMODE_OUTBITVALUE;//捕获输出模式选择
tima2_capture.captureRegister=TIMER_A_CAPTURECOMPARE_REGISTER_1;//捕获通道选择1
tima2_capture.synchronizeCaptureSource=TIMER_A_CAPTURE_SYNCHRONOUS; //捕获源与计时器时钟同步
Timer_A_initCaptureMode(TIMER_A2_BASE,&tima2_capture);//输入捕获初始化
tima2_capture.captureRegister=TIMER_A_CAPTURECOMPARE_REGISTER_2;//捕获通道选择2
Timer_A_initCaptureMode(TIMER_A2_BASE,&tima2_capture);//输入捕获初始化
}
void timb0_init(void)
{
Timer_B_initUpModeParam timb_initparam={0};
timb_initparam.clockSource=TIMER_B_CLOCKSOURCE_SMCLK ;//时钟源16*1048576hz
timb_initparam.clockSourceDivider=TIMER_B_CLOCKSOURCE_DIVIDER_64;//64分频,262,144
timb_initparam.startTimer=false;//不立即启动
timb_initparam.timerClear=TIMER_B_DO_CLEAR;//定时器重置
timb_initparam.timerPeriod=26214;//0.1s
timb_initparam.timerInterruptEnable_TBIE=TIMER_B_TBIE_INTERRUPT_ENABLE;//中断使能
Timer_B_initUpMode(TIMER_B0_BASE,&timb_initparam);//初始化定时器,正计数模式,
Timer_B_startCounter( TIMER_B0_BASE,TIMER_B_UP_MODE);//启动定时器,递增模式
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P3,GPIO_PIN5 | GPIO_PIN6);//复用gpio
//配置输入捕获
Timer_B_initCaptureModeParam timb0_capture={0};
timb0_capture.captureInputSelect=TIMER_B_CAPTURE_INPUTSELECT_CCIxA;//决定输入选择
timb0_capture.captureInterruptEnable=TIMER_B_CAPTURECOMPARE_INTERRUPT_ENABLE;//输入捕获中断使能
timb0_capture.captureMode=TIMER_B_CAPTUREMODE_RISING_EDGE;//上升沿沿触发
timb0_capture.captureOutputMode=TIMER_B_OUTPUTMODE_OUTBITVALUE;//捕获输出模式选择
timb0_capture.captureRegister=TIMER_B_CAPTURECOMPARE_REGISTER_5;//捕获通道选择5
timb0_capture.synchronizeCaptureSource=TIMER_B_CAPTURE_SYNCHRONOUS; //捕获源与计时器时钟同步
Timer_B_initCaptureMode(TIMER_B0_BASE,&timb0_capture);//输入捕获初始化
timb0_capture.captureRegister=TIMER_B_CAPTURECOMPARE_REGISTER_6;//捕获通道选择6
Timer_B_initCaptureMode(TIMER_B0_BASE,&timb0_capture);//输入捕获初始化
}
int right_cap_count=0;
int left_cap_count=0;
int i=0;
//定时器A2溢出中断
#pragma vector=TIMER2_A1_VECTOR
__interrupt void TIMER2_A1_ISR (void)
{
switch(__even_in_range(TA2IV, 14))//中断事件
{
case 0: break;//无中断TA1IV_NONE
case 2: //ccr1中断TA1IV_TACCR1
if (P2IN & BIT5)
right_cap_count--;//捕获上升沿次数;
else
right_cap_count++;//捕获上升沿次数
Timer_A_clearCaptureCompareInterrupt(TIMER_A2_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1);//清除捕获中断
break;
case 4:
if (P2IN & BIT4)
right_cap_count++;//捕获上升沿次数;
else
right_cap_count--;//捕获上升沿次数
Timer_A_clearCaptureCompareInterrupt(TIMER_A2_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_2);//清除捕获中断
break;//ccr2中断TA1IV_TACCR2
case 6: break;//ccr3中断TA1IV_3
case 8: break;//ccr4中断TA1IV_4
case 10: break;//ccr5中断TA1IV_5
case 12: break;//ccr6中断TA1IV_6
case 14: //溢出中断TA1IV_TAIFG
{
i++;
if(i==10)
{
UART_printf(USCI_A0_BASE,"left_count=%d,right_count=%d\r\n",left_cap_count,right_cap_count);
i=0;
}
Timer_A_clearTimerInterrupt(TIMER_A2_BASE);//清除更新中断
break;
}
}
}
//定时器B0中断
#pragma vector=TIMER0_B1_VECTOR
__interrupt void TIMER0_B0_ISR (void)
{
switch(__even_in_range(TB0IV, 14))//中断事件
{
case 0: break;//无中断TA1IV_NONE
case 2: break;//ccr1中断TA1IV_TACCR1
case 4:break;//ccr2中断TB0IV_TBCCR2
case 6: break;//ccr3中断TB0IV_TBCCR3
case 8: break;//ccr4中断TB0IV_TBCCR4
case 10:
if (P3IN & BIT6)
left_cap_count--;//捕获上升沿次数;
else
left_cap_count++;//捕获上升沿次数
break;//ccr5中断TB0IV_TBCCR5
case 12:
if (P3IN & BIT5)
left_cap_count++;//捕获上升沿次数;
else
left_cap_count--;//捕获上升沿次数
Timer_B_clearCaptureCompareInterrupt(TIMER_B0_BASE,TIMER_B_CAPTURECOMPARE_REGISTER_6);//清除捕获中断
break;//ccr6中断TB0IV_TBCCR6
case 14: //溢出中断TB1IV_TBIFG
{
Timer_B_clearTimerInterrupt(TIMER_B0_BASE);//清除更新中断
break;
}
}
}