[APM32F4] APM32F4系列,定时器的输入捕获模式的分析

[复制链接]
1124|0
 楼主| guiyan 发表于 2023-7-30 17:42 | 显示全部楼层 |阅读模式
本帖最后由 guiyan 于 2023-7-31 09:06 编辑

前言
本文旨在分析APM32F4系列芯片定时器的输入捕获模式的工作原理,以TMR5为例进行分析。
详细代码可参考APM32F4xx_SDK_v1.3例程TMR_InputCapture.

一、输入捕获模式简介
        1.1 TMR5 有4个输入通道,和4个捕获通道。它们存在一定的映射关系,可由CCM寄存器配置。
              输入通道是输入信号的,经过滤波边沿检测器后,分成2个输入信号,可同时进入2个捕获通道。
        1.2 输入滤波器和边沿检测器
              输入滤波器,是对输入信号进行滤波。
              边沿检测器,是决定捕获哪种边沿的信号,就是输入信号的极性。
        1.3 预分频器
              预分频器,是针对输入信号而言的。即发生多少次事件才进行一次捕获。
        1.4 捕获寄存器
              当发生捕获时,会把计数器的值锁存在捕获寄存器CCn中。若使能了中断,则会发生中断请求。

二、主要寄存器分析
        2.1 TMRx_CCM1[CCnSEL], 设置捕获通道的输入通道选择(即选择输入信号)
                选择通道.png
        2.2 TMRx_CCM1[ICnPSC], 配置捕获通道的预分频
                预分频.png
        2.3 TMRx_CCM1[ICnF], 配置捕获通道的滤波器
                滤波器.png
        2.4 TMRx_CCEN[CCnPOL], 配置捕获信号的极性
                极性.png
        2.5 TMRx_CCEN[CCnEN], 使能捕获
                使能.png
三、编程思路
          3.1. 把定制器配置为输入捕获模式,并选择输入通道(配置TMRx_CCM1[CCnSEL]])
          3.2. 配置滤波器(配置TMRx_CCM1[ICnF])
          3.3. 配置捕获通道的预分频(配置TMRx_CCM1[ICnPSC])
          3.4. 配置捕获信号的极性(配置TMRx_CCEN[CCnPOL])
          3.5. 使能开启捕获(配置TMRx_CCEN[CCnEN])
四、例程演示
          利用输入捕获模式功能,计算出输入信号的频率。
          4.1 主要实现代码
  1. /** TMR5 PWM Input mode */
  2.     ICConfig.channel = TMR_CHANNEL_2;                        /* TMR5_CH2作为捕获通道 */
  3.     ICConfig.polarity = TMR_IC_POLARITY_RISING;           /* 设置输入信号的极性 */
  4.     ICConfig.selection = TMR_IC_SELECTION_DIRECT_TI;      /* 选择输入通道 */
  5.     ICConfig.prescaler = TMR_IC_PSC_1;                         /* 设置预分频 */
  6.     ICConfig.filter = 0x00;
  7.     TMR_ConfigPWM(TMR5, &ICConfig);
   
  1.     /** Get the Input Capture value */
  2.     IC2Value[irqFlag] = TMR_ReadCaputer2(TMR5);

  3.     if(irqFlag != 0)
  4.     {
  5.         irqFlag = 0;

  6.         /** Capture computation */
  7.         if(IC2Value[1] > IC2Value[0])
  8.         {
  9.             tempValue = IC2Value[1] - IC2Value[0];
  10.         }
  11.         else if(IC2Value[1] < IC2Value[0])
  12.         {
  13.             tempValue = 0xFFFFFFFF - IC2Value[0] + IC2Value[1];
  14.         }
  15.         else
  16.         {
  17.             tempValue = 0;
  18.         }

  19.         /** Frequency computation */
  20.         Frequency = (RCM_ReadHCLKFreq()/2) / tempValue;
  21.     }
  22.     else
  23.     {
  24.         irqFlag++;
  25.     }

           4.2 效果
                能正确计算出输入信号的频率。
                演示.png








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

本版积分规则

7

主题

24

帖子

0

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