[APM32F0] APM32F003 TIM多通道输入捕获测试

[复制链接]
 楼主| Alden 发表于 2024-10-23 15:19 | 显示全部楼层 |阅读模式
本帖最后由 Alden 于 2024-10-23 15:19 编辑

#申请原创# #技术资源#
APM32F003输入封装只有20pin,看起来是功能很简单的芯片,但外设功能都很全面。比如定时器模块,输入输出、计数、编码器接口模式等,都是支持的。
接下来就在SDK的基础上测试了下定时器的多通道输入捕获。
1e07736a7e8614a26ac73759e7e3d52.png
首先需要对定时器进行初始化,我测试开了TIM2的三个通道同时作输入捕获功能。
  1. void TMR2_Init(void)
  2. {
  3.     TMR2_ICConfig_T icConfig;
  4.     GPIO_Config_T gpio_struct;

  5.        
  6.             gpio_struct.pin = GPIO_PIN_5;
  7.     gpio_struct.speed = GPIO_SPEED_10MHz;
  8.     gpio_struct.mode = GPIO_MODE_IN_FLOATING;
  9.     gpio_struct.intEn = GPIO_EINT_DISABLE;

  10.     GPIO_Config(GPIOC, &gpio_struct);
  11.        
  12.     gpio_struct.pin = GPIO_PIN_2|GPIO_PIN_3;
  13.     gpio_struct.speed = GPIO_SPEED_10MHz;
  14.     gpio_struct.mode = GPIO_MODE_IN_FLOATING;
  15.     gpio_struct.intEn = GPIO_EINT_DISABLE;

  16.     GPIO_Config(GPIOD, &gpio_struct);

  17.     /* Set counter = 0XFF, divider = 4 */
  18.   //  TMR2_ConfigTimerBase(47, 500);
  19.     /* Set Input Capture Channel */
  20.     icConfig.channel = TMR2_CHANNEL_1;
  21.     /* Set Input Capture filter */
  22.     icConfig.filter = 0;
  23.     /* Set Input Capture divider */
  24.     icConfig.div = TMR2_IC_DIV_1;
  25.     /* Set Input Capture polarity */
  26.     icConfig.polarity = TMR2_IC_POLARITY_FALLING;
  27.     /* Set Input Capture selection */
  28.     icConfig.selection = TMR2_IC_SELECT_DIRECTTI;
  29.                 TMR2_ConfigInputCapture(&icConfig);
  30.                  icConfig.channel = TMR2_CHANNEL_2;
  31.     /* Set Input Capture filter */
  32.     icConfig.filter = 0;
  33.     /* Set Input Capture divider */
  34.     icConfig.div = TMR2_IC_DIV_1;
  35.     /* Set Input Capture polarity */
  36.     icConfig.polarity = TMR2_IC_POLARITY_FALLING;
  37.     /* Set Input Capture selection */
  38.     icConfig.selection = TMR2_IC_SELECT_DIRECTTI;
  39.                 TMR2_ConfigInputCapture(&icConfig);
  40.                
  41.                 icConfig.channel = TMR2_CHANNEL_3;
  42.     /* Set Input Capture filter */
  43.     icConfig.filter = 0;
  44.     /* Set Input Capture divider */
  45.     icConfig.div = TMR2_IC_DIV_1;
  46.     /* Set Input Capture polarity */
  47.     icConfig.polarity = TMR2_IC_POLARITY_FALLING;
  48.     /* Set Input Capture selection */
  49.     icConfig.selection = TMR2_IC_SELECT_DIRECTTI;
  50.                 TMR2_ConfigInputCapture(&icConfig);

  51.                 TMR2_EnableInterrupt(TMR2_INT_UPDATE|TMR2_INT_CH1CC|TMR2_INT_CH2CC|TMR2_INT_CH3CC);
  52.     NVIC_EnableIRQRequest(TMR2_UO_IRQn, 0x0f);
  53.     NVIC_EnableIRQRequest(TMR2_CC_IRQn, 0x0f);
  54.     /* Enable TMR2  */
  55.     TMR2_Enable();
  56. }
然后是在定时器 中断服务函数中进行处理。
  1. void TMR2_CC_IRQHandler(void)
  2. {
  3.     TMR2_CC_Isr();
  4. }
  5. void TMR2_UO_IRQHandler(void)
  6. {
  7.     TMR2_UO_Isr();
  8. }
  9. void TMR2_UO_Isr(void)
  10. {
  11.     if(TMR2_ReadStatusFlag(TMR2_FLAG_UPDATE) == SET)
  12.     {
  13.         overflowCNT_CH1++;
  14.                           overflowCNT_CH2++;
  15.                                 overflowCNT_CH3++;
  16.         TMR2_ClearStatusFlag(TMR2_FLAG_UPDATE);
  17.     }
  18. }

  19. void TMR2_CC_Isr(void)
  20. {
  21.             if(TMR2_ReadStatusFlag(TMR2_FLAG_CH1CC) == SET)
  22.     {
  23.         /* Read capture value */
  24.         icValue_CH1[icOffset_CH1] = TMR2_ReadCompareCapture(TMR2_CHANNEL_1);
  25.         if(icOffset_CH1 == 0)
  26.         {
  27.             overflowCNT_CH1 = 0;
  28.             icOffset_CH1++;
  29.             TMR2_ClearStatusFlag(TMR2_FLAG_UPDATE);
  30.         }
  31.         else
  32.         {
  33.             /* calculate the LIRC clock frequency */
  34.             freqLIRC_CH1 = (clockFreqTMR2) / (icValue_CH1[1] + overflowCNT_CH1 * 65536 - icValue_CH1[0]);
  35.             icOffset_CH1 = 0;
  36.         }
  37.         /* Clear Channel3 Input Capture flag  */
  38.         TMR2_ClearStatusFlag(TMR2_FLAG_CH2CC);
  39.     }
  40.     if(TMR2_ReadStatusFlag(TMR2_FLAG_CH2CC) == SET)
  41.     {
  42.         /* Read capture value */
  43.         icValue_CH2[icOffset_CH2] = TMR2_ReadCompareCapture(TMR2_CHANNEL_2);
  44.         if(icOffset_CH2 == 0)
  45.         {
  46.             overflowCNT_CH2 = 0;
  47.             icOffset_CH2++;
  48.             TMR2_ClearStatusFlag(TMR2_FLAG_UPDATE);
  49.         }
  50.         else
  51.         {
  52.             /* calculate the LIRC clock frequency */
  53.             freqLIRC_CH2 = (clockFreqTMR2) / (icValue_CH2[1] + overflowCNT_CH2 * 65536 - icValue_CH2[0]);
  54.             icOffset_CH2 = 0;
  55.         }
  56.         /* Clear Channel3 Input Capture flag  */
  57.         TMR2_ClearStatusFlag(TMR2_FLAG_CH2CC);
  58.     }
  59.                
  60.                     if(TMR2_ReadStatusFlag(TMR2_FLAG_CH3CC) == SET)
  61.     {
  62.         /* Read capture value */
  63.         icValue_CH3[icOffset_CH3] = TMR2_ReadCompareCapture(TMR2_CHANNEL_3);
  64.         if(icOffset_CH3 == 0)
  65.         {
  66.             overflowCNT_CH3 = 0;
  67.             icOffset_CH3++;
  68.             TMR2_ClearStatusFlag(TMR2_FLAG_UPDATE);
  69.         }
  70.         else
  71.         {
  72.             /* calculate the LIRC clock frequency */
  73.             freqLIRC_CH3 = (clockFreqTMR2) / (icValue_CH3[1] + overflowCNT_CH3 * 65536 - icValue_CH3[0]);
  74.             icOffset_CH3 = 0;
  75.         }
  76.         /* Clear Channel3 Input Capture flag  */
  77.         TMR2_ClearStatusFlag(TMR2_FLAG_CH3CC);
  78.     }
  79. }
用TMR2_INT_UPDATE来进行计数,TMR2_INT_CHxCC中断来触发输入的电平变化。计算电平变化间计数是多少。
  1. int main(void)
  2. {
  3.     APM_MINI_LEDInit(LED2);
  4.     APM_MINI_LEDInit(LED3);
  5.     APM_DelayInit(APM_DELAY_MS);
  6.     APM_MINI_PBInit(BUTTON_KEY1, BUTTON_MODE_GPIO);
  7.                 USART_Init();
  8.                 AFConfig();
  9.     TMR2_Init();
  10.     /* TMR1 clock = Master clock  */
  11.     clockFreqTMR2 = RCM_GetMasterClockFreq();
  12.     while(1)
  13.     {

  14.                            printf("freqLIRC_CH1=%d freqLIRC_CH2=%d freqLIRC_CH3=%d\r\n", freqLIRC_CH1,freqLIRC_CH2,freqLIRC_CH3);
  15.         /* if LIRC clock frequency in [1k ~ 150k]hz  */
  16.         if((freqLIRC_CH1< 150000) && (freqLIRC_CH1 > 1000))
  17.         {
  18.             APM_MINI_LEDOn(LED2);
  19.         }
  20.         else
  21.         {
  22.             APM_MINI_LEDToggle(LED2);
  23.         }
  24.         APM_Delay(500);
  25.     }
  26. }
然后就能在main中打印结果。
微信图片_20241023151724.png
APM32F00x_SDK_V1.4 -INpwm.zip (8.37 MB, 下载次数: 4)

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

本版积分规则

49

主题

113

帖子

2

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

49

主题

113

帖子

2

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