当前位置:   article > 正文

CCS配置MSPM0G3507(八)GPIO中断方式模拟编码器计数与测速_mspm0g3507编码器测速

mspm0g3507编码器测速

因为MSPM0G3507只有TimerG8有QEI功能,当需要外接多个编码器时,可采用GPIO中断方式实现计数。

一.sysconfig

(1)Basic Config

1.创建一组GPIO,并加入两个引脚进行配置(两个引脚的配置是一样的)

2.将引脚设置为输入模式

3.设置为浮空输入

(2)Interrupt Config

1.使能中断

2.设置为上升沿触发

(3)PinMux

选择要使用的引脚

二.代码

1.初始化

  1. volatile uint32_t gpioA;
  2. volatile int32_t gEncoderCount = 0;
  3. float speed = 0;
  4. int main(void)
  5. {
  6. SYSCFG_DL_init();
  7. NVIC_EnableIRQ(GPIO_EncoderA_INT_IRQN);//使能外部中断
  8. while (1)
  9. {
  10. }
  11. }

2.编写外部中断服务函数

  1. void GROUP1_IRQHandler(void)
  2. {
  3. //获取中断信号
  4. gpioA = DL_GPIO_getEnabledInterruptStatus(GPIOA,
  5. GPIO_EncoderA_PIN_0_PIN | GPIO_EncoderA_PIN_1_PIN);
  6. //如果是GPIO_EncoderA_PIN_0_PIN产生的中断
  7. if((gpioA & GPIO_EncoderA_PIN_0_PIN) == GPIO_EncoderA_PIN_0_PIN)
  8. {
  9. //Pin0上升沿,看Pin1的电平,为低电平则判断为反转,高电平判断为正转
  10. if(!DL_GPIO_readPins(GPIOA,GPIO_EncoderA_PIN_1_PIN))//P1为低电平
  11. {
  12. gEncoderCount--;
  13. }
  14. else//P1为高电平
  15. {
  16. gEncoderCount++;
  17. }
  18. }
  19. //类似于Stm32中编码器模式的AB两相都测,可得到2倍的计数
  20. else if((gpioA & GPIO_EncoderA_PIN_1_PIN) == GPIO_EncoderA_PIN_1_PIN)
  21. {
  22. //Pin1上升沿
  23. if(!DL_GPIO_readPins(GPIOA,GPIO_EncoderA_PIN_0_PIN))//P0为低电平
  24. {
  25. gEncoderCount++;
  26. }
  27. else//P1为高电平
  28. {
  29. gEncoderCount--;
  30. }
  31. }
  32. //最后清除中断标志位
  33. DL_GPIO_clearInterruptStatus(GPIOA, GPIO_EncoderA_PIN_0_PIN|GPIO_EncoderA_PIN_1_PIN);
  34. }

3.获取速度

  1. int main(void)
  2. {
  3. SYSCFG_DL_init();
  4. NVIC_EnableIRQ(GPIO_EncoderA_INT_IRQN);
  5. while (1)
  6. {
  7. /* 每次获取完计数值后清零,则可获得以执行周期为单位的速度值 */
  8. speed = gEncoderCount;
  9. gEncoderCount = 0;
  10. delay_cycles(320000);
  11. }
  12. }

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号