[APM32F4] 编码器的问题

[复制链接]
Tom952331 发表于 2025-8-26 16:46 | 显示全部楼层 |阅读模式
我写了个编码器的程序

输入捕捉和定时器程序
  1. GPIO_Config_T    gpioConfig;

  2.     TMR_BaseConfig_T baseConfig;
  3.     TMR_ICConfig_T   ICConfig;

  4.     BOARD_LEDInit(LED2);
  5.                 BOARD_LEDInit(LED3);
  6.     BOARD_LEDOff(LED2);
  7.                 BOARD_LEDOff(LED3);
  8.                
  9.                
  10.    

  11.    


  12.     /* Enable GPIOA Periph Clock */
  13.     RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);

  14.     /* Config GPIO */
  15.     gpioConfig.pin = GPIO_PIN_12 | GPIO_PIN_13;
  16.     gpioConfig.mode = GPIO_MODE_AF;
  17.     gpioConfig.speed = GPIO_SPEED_100MHz;
  18.     gpioConfig.otype = GPIO_OTYPE_OD;
  19.     gpioConfig.pupd = GPIO_PUPD_UP;
  20.     GPIO_Config(GPIOD,&gpioConfig);


  21.                 gpioConfig.pin = GPIO_PIN_6;
  22.     gpioConfig.mode = GPIO_MODE_OUT;
  23.     gpioConfig.speed = GPIO_SPEED_100MHz;
  24.     gpioConfig.otype = GPIO_OTYPE_PP;
  25.     gpioConfig.pupd = GPIO_PUPD_NOPULL;
  26.     GPIO_Config(GPIOD,&gpioConfig);
  27.     /* Config GPIOA  Alernate Function for TMR1  */
  28.     GPIO_ConfigPinAF(GPIOD,GPIO_PIN_SOURCE_12,GPIO_AF_TMR4);
  29.     GPIO_ConfigPinAF(GPIOD,GPIO_PIN_SOURCE_13,GPIO_AF_TMR4);

  30.     /* Enable TMR1,TMR2 Periph Clock */
  31.     RCM_EnableAPB2PeriphClock(RCM_APB1_PERIPH_TMR4);
  32.     RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR3);

  33.     /* Config TMR1 */
  34.     baseConfig.clockDivision = TMR_CLOCK_DIV_1;
  35.     baseConfig.countMode = TMR_COUNTER_MODE_UP;
  36.     baseConfig.division = DIV;
  37.     baseConfig.period = 0x0008;
  38.     baseConfig.repetitionCounter = 0;
  39.     TMR_ConfigTimeBase(TMR4, &baseConfig);

  40.     /* Config TMR2 */
  41.     baseConfig.clockDivision = TMR_CLOCK_DIV_1;
  42.     baseConfig.countMode = TMR_COUNTER_MODE_UP;
  43.     baseConfig.division = DIV;
  44.                
  45.     baseConfig.period = 9999;
  46.     baseConfig.repetitionCounter = 1;
  47.     TMR_ConfigTimeBase(TMR3, &baseConfig);

  48.     /* Encoder */
  49.     TMR_ConfigEncodeInterface(TMR4,TMR_ENCODER_MODE_TI1,TMR_IC_POLARITY_RISING,TMR_IC_POLARITY_RISING);

  50.     /* Input Capture */
  51.     ICConfig.channel = TMR_CHANNEL_1;
  52.     ICConfig.polarity = TMR_IC_POLARITY_RISING;
  53.     ICConfig.selection = TMR_IC_SELECTION_DIRECT_TI;
  54.     ICConfig.prescaler = TMR_IC_PSC_1;
  55.     ICConfig.filter = 0;
  56.     TMR_ConfigIC(TMR4,&ICConfig);

  57.     ICConfig.channel = TMR_CHANNEL_2;
  58.     TMR_ConfigIC(TMR4,&ICConfig);
  59.    
  60.     /* Counter */
  61.     TMR_ConfigCounter(TMR4,0x0004);
  62.     TMR_ClearStatusFlag(TMR4,TMR_FLAG_UPDATE);
  63.     TMR_ClearStatusFlag(TMR3,TMR_FLAG_UPDATE);

  64.     /* Enable TMR1,TMR2 Interrupt */
  65.     TMR_EnableInterrupt(TMR4, TMR_INT_UPDATE);
  66.     TMR_EnableInterrupt(TMR3, TMR_INT_UPDATE);
  67.     NVIC_EnableIRQRequest(TMR4_IRQn, 0, 0);
  68.     NVIC_EnableIRQRequest(TMR3_IRQn, 0, 0);

  69.     /* Enable TMR1,TMR2 */
  70.     TMR_Enable(TMR4);
  71.     TMR_Enable(TMR3);
  72.                 PWM();
其中PWM()是产生PWM波的。
输入捕捉中断
  1. void TMR4_IRQHandler(void)
  2. {
  3.     if((TMR4->CTRL1_B.CNTDIR)!=0)
  4.     {
  5.         //encoderNum--;
  6.                         encoderNum--;
  7.     }
  8.     else
  9.     {
  10.        encoderNum++;
  11.     }
  12.     //printf("encoderNum: %08x\r\n", encoderNum);
  13.     TMR_ConfigCounter(TMR4,0x0004);
  14.     TMR_ClearIntFlag(TMR4,TMR_FLAG_UPDATE);
  15. }
定时器中断
  1. void TMR3_IRQHandler(void)
  2. {
  3.     if(TMR_ReadIntFlag(TMR3, TMR_INT_UPDATE) == SET)
  4.     {
  5.         tick++;
  6.                                 tick1++;
  7.                                 if(tick1>=800)
  8.                                 {
  9.                                                 flag=1;
  10.                                                 encoderNum1 = encoderNum;
  11.                                                 encoderNum=0;
  12.                                                 tick1=0;
  13.                                                 BOARD_LEDToggle(LED2);
  14.                                 }
  15.         TMR_ClearIntFlag(TMR3, TMR_INT_UPDATE);
  16.     }
  17. }
PWM波程序
  1. void PWM(void)
  2. {
  3.        
  4.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_TMR1);
  5.     RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA | RCM_AHB1_PERIPH_GPIOB | RCM_AHB1_PERIPH_GPIOE);

  6.     /* TMR1_CH1 */
  7.     GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_8, GPIO_AF_TMR1);
  8.     /* TMR1_CH2 */
  9.    

  10.     /* Config TMR1 GPIO for complementary output PWM */
  11.     GPIO_ConfigStruct.pin = GPIO_PIN_7| GPIO_PIN_8;
  12.     GPIO_ConfigStruct.mode = GPIO_MODE_AF;
  13.     GPIO_ConfigStruct.otype = GPIO_OTYPE_PP;
  14.     GPIO_ConfigStruct.speed = GPIO_SPEED_100MHz;
  15.     GPIO_Config(GPIOA, &GPIO_ConfigStruct);

  16.    

  17.                
  18.     /* config TMR1 */
  19.     TMR_TimeBaseStruct.clockDivision = TMR_CLOCK_DIV_1;
  20.     TMR_TimeBaseStruct.countMode = TMR_COUNTER_MODE_UP;
  21.     TMR_TimeBaseStruct.division = DIV;
  22.                 per1=1999;
  23.     TMR_TimeBaseStruct.period =per1;
  24.                 TMR_TimeBaseStruct.repetitionCounter=0xff;
  25.     TMR_ConfigTimeBase(TMR1, &TMR_TimeBaseStruct);

  26.     /* Configure channel */
  27.     OCcongigStruct.mode = TMR_OC_MODE_PWM1;
  28.     OCcongigStruct.pulse = 1000;
  29.     OCcongigStruct.idleState = TMR_OC_IDLE_STATE_RESET;
  30.     OCcongigStruct.outputState = TMR_OC_STATE_ENABLE;
  31.     OCcongigStruct.polarity = TMR_OC_POLARITY_HIGH;
  32.     OCcongigStruct.nIdleState = TMR_OC_NIDLE_STATE_RESET;
  33.     OCcongigStruct.outputNState = TMR_OC_NSTATE_ENABLE;
  34.     OCcongigStruct.nPolarity = TMR_OC_NPOLARITY_HIGH;

  35.     TMR_ConfigOC1(TMR1, &OCcongigStruct);

  36.     OCcongigStruct.pulse = 1000;
  37.     TMR_ConfigOC2(TMR1, &OCcongigStruct);

  38.    

  39.     TMR_Enable(TMR1);
  40.     TMR_EnablePWMOutputs(TMR1);

  41. }
转速值一开始为74转,目标值不管设大设小,实际转速值都变小。各位大神看看,哪里错了?谢谢!
编码器一圈产生1000个脉冲。

忘了发大循环程序了:
  1. if(flag==1)
  2.                                 {
  3.                                         flag=0;
  4.                                         RotationSpeed=encoderNum1*60/1000;
  5.                                         if(RotationSpeed>RotationSpeed1)
  6.                                         {
  7.                                                 per1-=10;
  8.                                                 TMR_TimeBaseStruct.period = per1;
  9.                                                 TMR_ConfigTimeBase(TMR1, &TMR_TimeBaseStruct);
  10.                                         }
  11.                                         else if(RotationSpeed<RotationSpeed1)
  12.                                         {
  13.                                                 per1+=10;
  14.                                                 TMR_TimeBaseStruct.period = per1;
  15.                                                 TMR_ConfigTimeBase(TMR1, &TMR_TimeBaseStruct);
  16.                                         }
  17.                                 }



您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

157

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部