1、在 C 博客里面看到一篇对输入捕获模式理解的文档,感觉很好,因此复制过来,以增加理解内容如下一、概念理解PWM 输入捕获模式是输入捕获模式的特例,自己理解如下1. 每个定时器有四个输入捕获通道 IC1、IC2 、IC3、IC4 。且 IC1 IC2 一组,IC3 IC4 一组。并且可是设置管脚和寄存器的对应关系。2. 同一个 TIx 输入映射了两个 ICx 信号。3. 这两个 ICx 信号分别在相反的极性边沿有效。4. 两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。5. 当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获“一个 PWM 周期(即连续的两个上升沿或下
2、降沿) ”,它等于包含 TIM 时钟周期的个数(即捕获寄存器中捕获的为 TIM 的计数个数 n) 。6. 同样另一个捕获通道捕获触发信号和下一个相反极性的边沿信号的计数个数 m,即(即高电平的周期或低电平的周期)7. 由此可以计算出 PWM 的时钟周期和占空比了frequency=f(TIM 时钟频率) /n。duty cycle=(高电平计数个数/n ) ,若 m 为高电平计数个数,则 duty cycle=m/n若 m 为低电平计数个数,则 duty cycle=(n-m )/n注:因为计数器为 16 位,所以一个周期最多计数 65535 个,所以测得的 最小频率= TIM时钟频率/655
3、35。二、程序设计与分析1. 程序概述:选择 TIM3 作为 PWM 输入捕获。IC2 设置为上升沿,并设置为有效的触发输入信号。所以 IC2 的捕获寄存器捕获 PWM 周期,IC1 的捕获寄存器捕获 PWM 的高电平周期。2.程序代码如下:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /时钟配置RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; /GPIO 配置PIO_InitStructure.
4、GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; /NVIC 配置 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCm
5、d = ENABLE;NVIC_Init(TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; /通道选择TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; /上升沿触发TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; /管脚与寄存器对应关系TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; /输入预分频。意思是控制在多少个输入周期做一次捕获,如果/输
6、入的信号频率没有变,测得的周期也不会变。比如选择 4 分频,则每四个输入周期才做一次捕获,这样在输入信号变化不频繁的情况下,/可以减少软件被不断中断的次数。TIM_ICInitStructure.TIM_ICFilter = 0x0; /滤波设置,经历几个周期跳变认定波形稳定 0x00xFTIM_PWMIConfig(TIM3, /根据参数配置 TIM 外设信息TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2); /选择 IC2 为始终触发源TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);/TIM 从模式:触发信
7、号的上升沿重新初始化计数器和触发寄存器的更新事件TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); /启动定时器的被动触发TIM_Cmd(TIM3, ENABLE); /启动 TIM2TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE); /打开中断 中断处理函数void TIM3_IRQHandler(void)TIM_ClearITPendingBit(TIM3, TIM_IT_CC2); /清楚 TIM 的中断待处理位IC2Value = TIM_GetCapture2(TIM3); /读取 I
8、C2 捕获寄存器的值,即为 PWM 周期的计数值if (IC2Value != 0)DutyCycle = (TIM_GetCapture1(TIM3) * 100) / IC2Value; /读取 IC1 捕获寄存器的值,并计算占空比Frequency = 72000000 / IC2Value; /计算 PWM 频率。elseDutyCycle = 0;Frequency = 0;注(一):若想改变测量的 PWM 频率范围,可将 TIM 时钟频率做分频处理TIM_TimeBaseStructure.TIM_Period = 0xFFFF; /周期 0FFFFTIM_TimeBaseStructure.TIM_Prescaler = 5; /时钟分频,分频数为 5+1 即 6 分频TIM_TimeBaseStructure.TIM_ClockDivision = 0; /时钟分割TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;/模式TIM_TimeBaseInit(TIM2, /基本初始化注注(二):定时器 TIM 的倍频器 X1 或 X2。在 APB 分频为 1 时,倍频值为 1,否则为2。