PWM输入捕获学习笔记 下载本文

内容发布更新时间 : 2024/5/29 3:18:55星期一 下面是文章的全部内容请认真阅读。

2016.4.1 7

PWM输入

STM32 输入捕获工作过程(通道 ?1为例)

一句话总结工作过程:通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。

?

步骤1:设置输入捕获滤波器(TIMx捕获/比较模式寄存器 1 (TIMx_CCMR1))

位 7:4 IC1F:输入捕获 1 滤波器 (Input capture 1 filter)此位域可定义 TI1 输入的采样频率和适用于 TI1 的数字滤波器带宽。数字滤波器由事件计数器组成,每 N 个事件才视为一个有效边沿:

0000:无滤波器,按 fDTS频率进行采样 fSAMPLING=fDTS/8, N=6

0001: fSAMPLING=fCK_INTN=2 N=8

0010: fSAMPLING=fCK_INTN=4 N=5

0011: fSAMPLING=fCK_INTN=8 N=6

0100: fSAMPLING=fDTS/2N=6

1100: fSAMPLING=fDTS/16,

1011: fSAMPLING=fDTS/16,

1010: fSAMPLING=fDTS/16,

1001: fSAMPLING=fDTS/8,

1000:

N=8

0101: fSAMPLING=fDTS/2N=8 N=5

0110: fSAMPLING=fDTS/4N=6 0111: fSAMPLING=fDTS/4N=8

1110: fSAMPLING=fDTS/32, N=6 1111: fSAMPLING=fDTS/32, N=8

1101: fSAMPLING=fDTS/32,

注意: 在当前硅版本中,当 ICxF[3:0]= 1、 2 或 3 时,将用 CK_INT 代替公式中的 fDTS。 ?

步骤2:设置输入捕获极性 (TIMx 捕获/比较使能寄存器 (TIMx_CCER))

CC1 通道配置为输出:

0: OC1 高电平有效 1: OC1 低电平有效

CC1 通道配置为输入:

该位选择是IC1还是IC1的反相信号作为触发或捕获信号 00:非反相/上升沿触发 10:保留,不使用此配置。 11:非反相/上升沿和下降沿均触发

? 步骤3:设置输入捕获映射通道(TIMx捕获/比较模式寄存器 1 (TIMx_CCMR1))

位 1:0 CC1S:捕获/比较 1 选择 (Capture/Compare 1 selection) 此位域定义通道方向(输入/输出)以及所使用的输入。 00: CC1 通道配置为输出

01: CC1 通道配置为输入, IC1 映射到 TI1 上 10: CC1 通道配置为输入, IC1 映射到 TI2 上

11: CC1 通道配置为输入, IC1 映射到 TRC 上。此模式仅在通过 TS 位( TIMx_SMCR寄存

器)选择内部触发输入时有效

注意: 仅当通道关闭时( TIMx_CCER中的 CC1E = 0),才可向 CC1S 位写入数据。

? 步骤4:设置输入捕获分频器

位 3:2 IC1PSC:输入捕获 1 预分频器 (TIMx_CCMR1)

此位域定义CC1 输入 (IC1) 的预分频比。只要 CC1E=0( TIMx_CCER寄存器),预分频器便立即复位。

00:无预分频器,捕获输入上每检测到一个边沿便执行捕获 01:每发生 2 个事件便执行一次捕获 10:每发生 4 个事件便执行一次捕获 11:每发生 8 个事件便执行一次捕获

位 0 CC1E: 捕获/比较 1 输出使能 ((TIMx_CCER)。

CC1 通道配置为输出:0:关闭––OC1 未激活1:开启––在相应输出

引脚上输出 OC1 信号

CC1 通道配置为输入:此位决定了是否可以实际将计数器值捕获到输入捕获/比较寄存器 1 (TIMx_CCR1) 中。 0:禁止捕获

1:使能捕获

? 步骤五:捕获到有效信号可以开启中断(15.4.4 TIMx DMA/中断使能寄存器 (TIMx_DIER))

位 4 CC4IE:捕获/比较 4 中断使能 (Capture/Compare 1 interrupt enable) 0:禁止 CC4 中断。

1:使能 CC4 中断。

位 3CC3IE:捕获/比较 3 中断使能 (Capture/Compare 1 interrupt enable) 0:禁止 CC3 中断

1:使能 CC3 中断

位 2 CC2IE:捕获/比较 2 中断使能 (Capture/Compare 1 interrupt enable) 0:禁止 CC2 中断

1:使能 CC2 中断

位 1CC1IE:捕获/比较 1 中断使能 (Capture/Compare 1 interrupt enable) 0:禁止 CC1 中断

1:使能 CC1 中断

位 0 UIE:更新中断使能 (Update interrupt enable) 0:禁止更新中断

void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct); typedefstruct

{ uint16_t TIM_Channel; //捕获通道1-4 uint16_t TIM_ICPolarity; //捕获极性 uint16_t TIM_ICSelection; //映射关系 uint16_t TIM_ICPrescaler; //分频系数 uint16_t TIM_ICFilter; //滤波器 } TIM_ICInitTypeDef;

例:TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1;

TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;

TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM5_ICInitStructure.TIM_ICFilter = 0x00; TIM_ICInit(TIM5, &TIM5_ICInitStructure); 1. 2. 3. 4. 5. 6. 7. 8.

初始化定时器和通道对应IO的时钟。 初始化IO口,模式为复用: GPIO_Init(); GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF; 设置引脚复用映射: GPIO_PinAFConfig(); 初始化定时器ARR,PSC TIM_TimeBaseInit(); 初始化输入捕获通道 TIM_ICInit(); 如果要开启捕获中断 TIM_ITConfig();NVIC_Init(); 使能定时器:TIM_Cmd();

编写中断服务函数:TIMx_IRQHandler();

1:使能更新中断