赞
踩
使用定时器CCR0中断进行捕获脉冲,定时器有俩种中断
1.第一种的他独有的共享中断,TIMEX_A1这种中断名,进入中断后switch可以进行判断中断信号来源,当然输入捕获也可以对应使用共享中断进行配置,但是我独有中断没搞明白,就想用CCR0独有中断进行尝试捕获测量脉冲。
2.独有中断是定时器第一个通道独有的,CCR0,TIMEX_A0这种中断名,A0对应他是定时器的第一个通道,初学者用定时器中断的时候记得要区分定时器中断的AX,这个X值,这个中断向量有俩个,对应同一个定时器中断也有这俩种。
我们用oled屏幕进行显示结果,第一步配置对应使用的GPIO端口模式,第二步使用库函数进行配置定时器模式,第三步进行中断配置,写中断里面函数,第四步对应打开中断总使能;
这个是我们主函数里面配置的定时器。使用的是库函数。
- int main(void)
- { //必须关闭看门狗,导致波形超级振荡
- WDT_A_hold(WDT_A_BASE);
- int speed;
- OLED_Init();
-
- OLED_Clear();
- GPIO_setAsInputPin(GPIO_PORT_P2,GPIO_PIN6);
-
- GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P2,GPIO_PIN3);
- //开始定时器,连续计数模式;
- Timer_A_initContinuousModeParam Encode_config;
- Encode_config.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;
- Encode_config.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_1;
- //定时器不使能,只用他的捕获通道CCR0进行测量脉冲
- //1.定时器关闭,我们不用他的共享中断
- //2.使用定时器CCR0单独中断
- //3.定时器的功能可以不使能,他的中断关闭,不影响
- Encode_config.startTimer = false;
- //跳过TACL寄存器,定时器没启动,我们就不用清除。
- Encode_config.timerClear = TIMER_A_SKIP_CLEAR;
- Encode_config.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;
- Timer_A_initContinuousMode(TIMER_A2_BASE,&Encode_config);
-
- //配置捕获通道P2.3,对应TA2.0,有独有的CCR0通道,不是共享中断
- Timer_A_initCaptureModeParam Encode_config_next;
- Encode_config_next.captureInputSelect = TIMER_A_CAPTURE_INPUTSELECT_CCIxA;
- //使能中断位,打开就可以用了,不用开启定时器总中断
- Encode_config_next.captureInterruptEnable = TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE;
- //上升沿触发中断
- Encode_config_next.captureMode = TIMER_A_CAPTUREMODE_RISING_EDGE;
- Encode_config_next.captureOutputMode = TIMER_A_OUTPUTMODE_OUTBITVALUE;
- //配置定时器的通道,我们选TA2.0,对应定时器0通道才独有的中断CCR0。
- Encode_config_next.captureRegister = TIMER_A_CAPTURECOMPARE_REGISTER_0;
- //这里我们配置不同步
- Encode_config_next.synchronizeCaptureSource = TIMER_A_CAPTURE_ASYNCHRONOUS;
- Timer_A_initCaptureMode(TIMER_A2_BASE,&Encode_config_next);
- Timer_A_enableInterrupt(TIMER_A2_BASE);
- //Timer_A_startCounter(TIMER_A2_BASE, TIMER_A_CONTINUOUS_MODE);
- //给CPU.LPM0模式,GIE开启总中断使能;
- //__bis_SR_register(LPM0+GIE); 如果单独使用中断while中没程序可以用这个。这个是给CPU——> 休眠模式,GIE是开启中断总时钟。
- __bis_SR_register(GIE);
- OLED_ShowString(1,1,"Encode:",8);
- while(1){
-
- speed=Encoder_L;
- Encoder_L = 0;
- OLED_ShowNum(1,2,speed,4,30);
- //延时函数,闸门时间,对应清零Encoder_L的值;
- _delay_cycles(200000);
- }
-
- return 0;
- }
因为MSP系列没有编码器接口模式,我们只能通过上升沿判断另一个相的高低电平模式进行计算脉冲,建议同学们使用外部中断进行测量。里面Encoder_L,我们定义成全局变量,如果在中断中定义他就是局部变量,函数结束,他的内存地址就被清空了,生命周期结束。
- //定时器中断分俩种,一种是定时器共享中断,switch判断中断位然后进行运行。
- // 第二种是CCR单独中断,直接使用就行,触发中断进入中断函数,不用清除标志位。
- //示例定时器共享中断是 #pragma vector=TIMER1_A1_VECTOR A后面的数字非0;
- //我下面写的定时器TA2.0中断,TIMER2_A0,这个0代表0通道。
- #pragma vector=TIMER2_A0_VECTOR
- __interrupt void TIMER2_A0_ISR (void)
- {
- if(GPIO_INPUT_PIN_HIGH == GPIO_getInputPinValue(GPIO_PORT_P2,GPIO_PIN6))
- {
- Encoder_L++;
- }
- if(GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P2,GPIO_PIN6))
- {
- Encoder_L--;
- }
-
- }
接下来我们看看我定义的全局变量;
static给他静态全局变量;
-
- #include "driverlib.h"
- #include "msp430.h"
- #include "oled.h"
- #include "type.h"
-
- static long Encoder_L = 0;
谢谢大家,本人第一次发,希望能帮助到大家,不会的可以留言评论,知无不言言无不尽!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。