当前位置:   article > 正文

MSP430F5529自主开发笔记1:编码器测速_定时器中断捕获法测速\测正反转_msp430f5529编码器模式

msp430f5529编码器模式

使用定时器CCR0中断进行捕获脉冲,定时器有俩种中断

1.第一种的他独有的共享中断,TIMEX_A1这种中断名,进入中断后switch可以进行判断中断信号来源,当然输入捕获也可以对应使用共享中断进行配置,但是我独有中断没搞明白,就想用CCR0独有中断进行尝试捕获测量脉冲。

2.独有中断是定时器第一个通道独有的,CCR0,TIMEX_A0这种中断名,A0对应他是定时器的第一个通道,初学者用定时器中断的时候记得要区分定时器中断的AX,这个X值,这个中断向量有俩个,对应同一个定时器中断也有这俩种。

我们用oled屏幕进行显示结果,第一步配置对应使用的GPIO端口模式,第二步使用库函数进行配置定时器模式,第三步进行中断配置,写中断里面函数,第四步对应打开中断总使能;

这个是我们主函数里面配置的定时器。使用的是库函数。

  1. int main(void)
  2. { //必须关闭看门狗,导致波形超级振荡
  3. WDT_A_hold(WDT_A_BASE);
  4. int speed;
  5. OLED_Init();
  6. OLED_Clear();
  7. GPIO_setAsInputPin(GPIO_PORT_P2,GPIO_PIN6);
  8. GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P2,GPIO_PIN3);
  9. //开始定时器,连续计数模式;
  10. Timer_A_initContinuousModeParam Encode_config;
  11. Encode_config.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;
  12. Encode_config.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_1;
  13. //定时器不使能,只用他的捕获通道CCR0进行测量脉冲
  14. //1.定时器关闭,我们不用他的共享中断
  15. //2.使用定时器CCR0单独中断
  16. //3.定时器的功能可以不使能,他的中断关闭,不影响
  17. Encode_config.startTimer = false;
  18. //跳过TACL寄存器,定时器没启动,我们就不用清除。
  19. Encode_config.timerClear = TIMER_A_SKIP_CLEAR;
  20. Encode_config.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;
  21. Timer_A_initContinuousMode(TIMER_A2_BASE,&Encode_config);
  22. //配置捕获通道P2.3,对应TA2.0,有独有的CCR0通道,不是共享中断
  23. Timer_A_initCaptureModeParam Encode_config_next;
  24. Encode_config_next.captureInputSelect = TIMER_A_CAPTURE_INPUTSELECT_CCIxA;
  25. //使能中断位,打开就可以用了,不用开启定时器总中断
  26. Encode_config_next.captureInterruptEnable = TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE;
  27. //上升沿触发中断
  28. Encode_config_next.captureMode = TIMER_A_CAPTUREMODE_RISING_EDGE;
  29. Encode_config_next.captureOutputMode = TIMER_A_OUTPUTMODE_OUTBITVALUE;
  30. //配置定时器的通道,我们选TA2.0,对应定时器0通道才独有的中断CCR0
  31. Encode_config_next.captureRegister = TIMER_A_CAPTURECOMPARE_REGISTER_0;
  32. //这里我们配置不同步
  33. Encode_config_next.synchronizeCaptureSource = TIMER_A_CAPTURE_ASYNCHRONOUS;
  34. Timer_A_initCaptureMode(TIMER_A2_BASE,&Encode_config_next);
  35. Timer_A_enableInterrupt(TIMER_A2_BASE);
  36. //Timer_A_startCounter(TIMER_A2_BASE, TIMER_A_CONTINUOUS_MODE);
  37. //给CPU.LPM0模式,GIE开启总中断使能;
  38. //__bis_SR_register(LPM0+GIE); 如果单独使用中断while中没程序可以用这个。这个是给CPU——> 休眠模式,GIE是开启中断总时钟。
  39. __bis_SR_register(GIE);
  40. OLED_ShowString(1,1,"Encode:",8);
  41. while(1){
  42. speed=Encoder_L;
  43. Encoder_L = 0;
  44. OLED_ShowNum(1,2,speed,4,30);
  45. //延时函数,闸门时间,对应清零Encoder_L的值;
  46. _delay_cycles(200000);
  47. }
  48. return 0;
  49. }

 因为MSP系列没有编码器接口模式,我们只能通过上升沿判断另一个相的高低电平模式进行计算脉冲,建议同学们使用外部中断进行测量。里面Encoder_L,我们定义成全局变量,如果在中断中定义他就是局部变量,函数结束,他的内存地址就被清空了,生命周期结束。

  1. //定时器中断分俩种,一种是定时器共享中断,switch判断中断位然后进行运行。
  2. // 第二种是CCR单独中断,直接使用就行,触发中断进入中断函数,不用清除标志位。
  3. //示例定时器共享中断是 #pragma vector=TIMER1_A1_VECTOR A后面的数字非0;
  4. //我下面写的定时器TA2.0中断,TIMER2_A0,这个0代表0通道。
  5. #pragma vector=TIMER2_A0_VECTOR
  6. __interrupt void TIMER2_A0_ISR (void)
  7. {
  8. if(GPIO_INPUT_PIN_HIGH == GPIO_getInputPinValue(GPIO_PORT_P2,GPIO_PIN6))
  9. {
  10. Encoder_L++;
  11. }
  12. if(GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P2,GPIO_PIN6))
  13. {
  14. Encoder_L--;
  15. }
  16. }

 接下来我们看看我定义的全局变量;

static给他静态全局变量;

  1. #include "driverlib.h"
  2. #include "msp430.h"
  3. #include "oled.h"
  4. #include "type.h"
  5. static long Encoder_L = 0;

谢谢大家,本人第一次发,希望能帮助到大家,不会的可以留言评论,知无不言言无不尽!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/656507
推荐阅读
相关标签
  

闽ICP备14008679号