MSP430F5529自主开发笔记3(库函数):编码器测速_外部中断捕获法测速\测正反转(测脉冲选择外部中断:终极篇)

对于TI板他定时器没有STM芯片对应的:编码器接口模式,他不能自动的通过定时器进行对应捕获上升下降,从而计数器计数。

电机测量脉冲数的话使用:外部中断进行捕获(下面有源码,对应库函数进行配置)

上几篇讲述了定时器的中断,了解了他的相关知识,对应他的中断就是溢出中断,或者判断IO口是否有上升下降触发中断;

这个是定时器溢出中断:

MSP430F5529(定时器中断溢出,带你深刻认识CCR0通道独有中断和共享中断溢出中断)进行区分定时器计数模式,目标值设置值;_postgraduate1887的博客-CSDN博客

这个是使用定时器的捕获模式进行测量脉冲,只是简单的把他当作一个外部中断使用了,不会的建议学一下;

这个是CCR独有中断捕获;

MSP430F5529自主开发笔记1:编码器测速_定时器中断捕获法测速\测正反转_postgraduate1887的博客-CSDN博客

这个是定时器共享中断捕获;

MSP430F5529自主开发笔记2:编码器测速_定时器中断捕获法测速\测正反转(使用共享中断)续编2_postgraduate1887的博客-CSDN博客

废话不多说,直接外部中断。

#include "driverlib.h"
#include "msp430.h"
#include "oled.h"
#include "type.h"
#include "EXIT_CAPTURE.h"
#include "TIMER_MOTOR_CLEAR.h"
#include "MOTOR_PWM.h"
#include "TIME_CLOCK.h"
static long Encoder_L = 0;
static long Encoder_R = 0;
static int speed_L = 0;
static int speed_R = 0;
void main (void)
{
    WDT_A_hold(WDT_A_BASE);
    CLOCK_Change();
    OLED_Init();
    OLED_Clear();
    //EXIT_CAPTURE;
    EXIT_init();
    //TIMER_CLEAR;
    TIMER_CLEAR_Init();
    //MOTOR_PWM
    PWM_TO_MOTOR();
    PWM_PIN();
    __bis_SR_register(GIE);
    OLED_ShowString(1,1,"Encode_L:",10);
    OLED_ShowString(1,3,"Encode_R:",10);

    while(1){
             OLED_ShowNum(70,1,speed_L,4,30);
             OLED_ShowNum(70,3,speed_R,4,30);

          }
}

//外部中断捕获编码器
#pragma vector=PORT2_VECTOR
__interrupt void PORT2(void)
{
    //都使用上升沿判断,双倍频;A相B相都进行判断脉冲;
    //P2.6A相
    if(GPIO_getInterruptStatus(GPIO_PORT_P2,GPIO_PIN6) == GPIO_PIN6 )
    {
        if(GPIO_INPUT_PIN_HIGH == GPIO_getInputPinValue(GPIO_PORT_P2,GPIO_PIN0))
        {
        Encoder_R--;
        }
        if(GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P2,GPIO_PIN0))
        {
          Encoder_R++;
        }
        GPIO_clearInterrupt(GPIO_PORT_P2,GPIO_PIN6);
    }
    //P2.0B相
    if(GPIO_getInterruptStatus(GPIO_PORT_P2,GPIO_PIN0) == GPIO_PIN0 )
       {
           if(GPIO_INPUT_PIN_HIGH == GPIO_getInputPinValue(GPIO_PORT_P2,GPIO_PIN6))
           {
           Encoder_R++;
           }
           if(GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P2,GPIO_PIN6))
           {
             Encoder_R--;
           }
           GPIO_clearInterrupt(GPIO_PORT_P2,GPIO_PIN0);
       }
}
#pragma vector=PORT1_VECTOR
__interrupt void PORT1(void)
{
    //都使用上升沿判断,双倍频;A相B相都进行判断脉冲;
    //PA相
    if(GPIO_getInterruptStatus(GPIO_PORT_P1,GPIO_PIN5) == GPIO_PIN5 )
    {
        if(GPIO_INPUT_PIN_HIGH == GPIO_getInputPinValue(GPIO_PORT_P1,GPIO_PIN4))
        {
        Encoder_L--;
        }
        if(GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P1,GPIO_PIN4))
        {
          Encoder_L++;
        }
        GPIO_clearInterrupt(GPIO_PORT_P1,GPIO_PIN5);
    }
    //PB相
    if(GPIO_getInterruptStatus(GPIO_PORT_P1,GPIO_PIN4) == GPIO_PIN4)
       {
           if(GPIO_INPUT_PIN_HIGH == GPIO_getInputPinValue(GPIO_PORT_P1,GPIO_PIN5))
           {
           Encoder_L++;
           }
           if(GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P1,GPIO_PIN5))
           {
             Encoder_L--;
           }
           GPIO_clearInterrupt(GPIO_PORT_P1,GPIO_PIN4);
       }
}
//设置闸门时间进行适当时间清除
//增计数模式,打开CCR0中断通道,关闭TAIE定时器中断;
//建议10ms
#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER1_A0_ISR (void)
{
        speed_L=Encoder_L;
        speed_R=Encoder_R;
        Encoder_L = 0;
        Encoder_R = 0;

}

注意:中断IO口不可以使用复用模式,PxSEL这个寄存器。复用打开,中断失能;

MSP里面外部中断对应的中断是统一的,对应哪个IO口发生中断要进行if判断,这个采用了二倍频的方式进行捕获脉冲数;

定时器中断选择CCR0独有中断进行10ms一次的脉冲清零,定时器中断起到的是闸门时间的作用,后续进行速度计算要在中断里面对应计算;

有什么不懂的地方随时可以评论找我;

  • 8
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值