当前位置:首页 > stm32 PWM输入捕获
脉宽低于 8 个采样周期的脉冲信号,从而达到滤波的效果。这里,我们不做滤波处理,所以设 置 IC1F[3:0]=0000,只要采集到上升沿,就触发捕获。 TIMx的CHx 在输入捕获模式下就变味TIx了...
刚刚看了一下手册,好像有点了解,不知道对不对。
CCx是指4各通道当中的一个通道,而ICx对应的这个输入通道,TI1、TI2、TI3、TI4,是指定时器的4个通道的引脚(比如:TIM4_REMAP=0,没有重映像(TIM4_CH1/PB6,TIM4_CH2/PB7,TIM4_CH3/PB8,TIM4_CH4/PB9))。
//=========================================================================
定时器从0开始计数,计数到TIM_Period后,重新归零再计数。
捕获只是把发生捕获时刻的计数器当前值拷贝下来,你的IC2Value就是这个数值。
如果配置了 发生捕获时复位计数器,则计数器没有计数到TIM_Period时也被归零并重新计数。
如果你配置比较小的TIM_Period数值,则可能在还没有发生捕获时,计数器就被归零,所以你要在软件中记录下计数器被归零的次数。
当计数器的时钟频率为F时,计数器每计数一次表示1/F的时间,因此从捕获寄存器中读出的数值表示了一个时间。如果配置了发生捕获时复位计数器,则这个时间恰好就是要捕获信号的周期。
从上面原理可以看出,TIM_Period的数值与捕获的精度没有关系。 发生捕获时复位计数器》》》》这个如何实现?通过TI1-->TI1F_ED
//======================================================================================================= TIM通用定时器(二):输出比较——翻转模式
一、基本概念理解
1. 输出比较:打开一个TIMx计数器,再打开TIMx的一路或几路输出比较器(共4路),都配置好以后,计数器开始计数,当计数器里的值和比较寄存器里的值相等时,产生输出比较中断,在中断中将计数器中的值读出,与翻转周期相加再写道比较寄存器中,使得和下一个事件有相同的翻转周期。
2. 举例说明:例如TIM时钟频率设置为12MHZ,输出比较寄存器中的自装载值为600(高电平或低电平计数值),则输出的PWM频率为
frequency = 12MHZ/(600*2)=10KHZ。
二、程序设计与分析
1. TIM计数器和输出比较器的配置
uint16_t capture = 0;
extern __IO uint16_t CCR1_Val; extern __IO uint16_t CCR2_Val; extern __IO uint16_t CCR3_Val; extern __IO uint16_t CCR4_Val;
void TIM_Configuration(void) {
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 65535; //这里必须是65535 TIM_TimeBaseStructure.TIM_Prescaler = 2; //3分频 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化TIM3
/* Output Compare Toggle Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; //输出比较翻转模式 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能通道1 TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //待装入输出比较寄存器中的脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出为正逻辑 TIM_OC1Init(TIM3, &TIM_OCInitStructure); //写入配置
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable); //使能或者失能TIMx在CCR1上的预装载寄存器
/* Output Compare Toggle Mode configuration: Channel2 */
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);
/* Output Compare Toggle Mode configuration: Channel3 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Disable);
/* Output Compare Toggle Mode configuration: Channel4 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Disable);
/* TIM enable counter */
TIM_Cmd(TIM3, ENABLE); //开启计数器
/* TIM IT enable */ //TIM1中断源设置,开启相应通道的捕捉比较中断 TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE); }
2. 时钟配置
3. GPIO配置
4. 中断服务程序
void TIM3_IRQHandler(void) {
/* TIM3_CH1 toggling with frequency = 183.1 Hz */
if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET) 与否 {
TIM_ClearITPendingBit(TIM3, TIM_IT_CC1 );
capture = TIM_GetCapture1(TIM3); 的计数值
TIM_SetCompare1(TIM3, capture + CCR1_Val ); 输出比较寄存器中,以保证下一个TIM事
冲数 }
/* TIM3_CH2 toggling with frequency = 366.2 Hz */ if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET) {
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2); capture = TIM_GetCapture2(TIM3);
TIM_SetCompare2(TIM3, capture + CCR2_Val); }
/* TIM3_CH3 toggling with frequency = 732.4 Hz */
//检查指定的TIM中断发生 //清除TIMx的中断待处理位 //获得输入捕获值,即计数器中将计数值加上翻转的脉冲值写入 //件也是相同的脉 //
共分享92篇相关文档