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:使能更新中断