msp430f5529标准库学习之二倍频捕获电机编码器实现对电机正反转计数

定时器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;
           }
       }
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值