打印
[APM32F4]

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

[复制链接]
211|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], 设置捕获通道的输入通道选择(即选择输入信号)
               
        2.2 TMRx_CCM1[ICnPSC], 配置捕获通道的预分频
               
        2.3 TMRx_CCM1[ICnF], 配置捕获通道的滤波器
               
        2.4 TMRx_CCEN[CCnPOL], 配置捕获信号的极性
               
        2.5 TMRx_CCEN[CCnEN], 使能捕获
               
三、编程思路
          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 主要实现代码
/** TMR5 PWM Input mode */
    ICConfig.channel = TMR_CHANNEL_2;                        /* TMR5_CH2作为捕获通道 */
    ICConfig.polarity = TMR_IC_POLARITY_RISING;           /* 设置输入信号的极性 */
    ICConfig.selection = TMR_IC_SELECTION_DIRECT_TI;      /* 选择输入通道 */
    ICConfig.prescaler = TMR_IC_PSC_1;                         /* 设置预分频 */
    ICConfig.filter = 0x00;
    TMR_ConfigPWM(TMR5, &ICConfig);
   
    /** Get the Input Capture value */
    IC2Value[irqFlag] = TMR_ReadCaputer2(TMR5);

    if(irqFlag != 0)
    {
        irqFlag = 0;

        /** Capture computation */
        if(IC2Value[1] > IC2Value[0])
        {
            tempValue = IC2Value[1] - IC2Value[0];
        }
        else if(IC2Value[1] < IC2Value[0])
        {
            tempValue = 0xFFFFFFFF - IC2Value[0] + IC2Value[1];
        }
        else
        {
            tempValue = 0;
        }

        /** Frequency computation */
        Frequency = (RCM_ReadHCLKFreq()/2) / tempValue;
    }
    else
    {
        irqFlag++;
    }

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








使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

21

帖子

0

粉丝