STM32F4定时器CH3和CH4通道进行PWM捕获问题

STM32F4定时器CH3和CH4通道进行PWM捕获问题

近日由于硬件改变问题,原本位于STM32F407单片机timer4的CH2通道的PWM捕获的引脚改为timer5的CH4通道,之前评审原理图的时候曾核对过管脚功能,并未发现有啥问题,但今天在写驱动的时候意外发现,驱动库中没有CH3和CH4的从模式触发选项,很是意外,开始上网查询资料,发现网上关于这个问题的资料很少,也在交流群中进行了简单沟通未果,最后在和同事的讨论中发现了可能的问题原因。接下来我们看下具体情况:
Ttimer5的定时器结构图
上图为stm32f407参考手册中timer5的结构图,从图中看CH4并没有特别的地方,下方为定时器通道的PWM输入模式的描述
在这里插入图片描述
简述一下上图中的配置步骤,上图以CH1为例子
1、设置CCR1的输入为TI1
2、TI1FP1为上升沿有效
3、设置CCR2的输入也为TI1,及使用TI1FP2通路,且设置为下降沿有效
4、设置SMCR寄存器,选择TI1FP1为外部触发信号
5、配置从模式控制器为复位模式
6、最后使能捕获模式
通过上述流程可以看出,pwm捕获的工作原理为,将CH1最为CCR1和CCR2两路捕获的输入,且触发边沿相反,同时设置TI1FP1为从模式控制器的外部触发,从模式控制器为复位模式的作用为在有外部触发时会清零计数器,当CH1通道第一个上升沿来临时IC1和IC2开始捕获,同时复位计数器,当第一个下降沿来临时,IC2会捕获到下降沿同时将计数器写入CCR2计数器中,当第二个上升沿来临时IC1捕获,将计数器的值写入CCR1中,同时再次触发从模式控制器复位,开始新的一路,有上图可知CCR2存入的为PWM高电平的计数器数值,CCR1存储的位PWM一个完整周期的计数器数值,再根据计数器的节拍时间可以计算出PWM的周期和占空比等信息。
当我想用CH4通道实现上述过程的一个关键步骤为配置从模式控制器的触发信号,我在查看寄存器时竟然没有TI4FP4和TI3FP3的触发选项,timer5的原理图中也只有TI1FP1和TI2FP2两个信号,图下图所示
在这里插入图片描述
在这里插入图片描述
这可能就是CH4和CH3通道无法使用PWM输入捕获的原因吧,不知道STM是基于什么的考虑,没有预留CH3和CH4的PWM的输入捕获功能,其实TI3FP3/TI3FP4和TI4FP3/TI4FP4这些信号已经预留好了。还请了解这方面信息的大佬给小弟指教一下,一起探讨一下。

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
以下是使用STM32的定时器2(TIM2)的CH3和CH4输出PWM波的代码示例。该代码将PWM占空比设置为50%,并将高电平持续时间设置为1秒钟。 ``` #include "stm32f4xx.h" void TIM2_PWM_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructure.TIM_Period = 999; // PWM频率 = (84000000 / (Period + 1)) Hz TIM_TimeBaseStructure.TIM_Prescaler = 83; // 时钟预分频 = (84MHz / (Prescaler + 1)) Hz TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 499; // 占空比 = (Pulse + 1) / (Period + 1) TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC3Init(TIM2, &TIM_OCInitStructure); // CH3 PWM波 TIM_OC4Init(TIM2, &TIM_OCInitStructure); // CH4 PWM波 TIM_Cmd(TIM2, ENABLE); } int main(void) { TIM2_PWM_Init(); while(1) { TIM_SetCompare3(TIM2, 499); // CH3高电平持续时间 = (Pulse + 1) / PWM频率 = 0.006s = 6ms TIM_SetCompare4(TIM2, 499); // CH4高电平持续时间 = (Pulse + 1) / PWM频率 = 0.006s = 6ms Delay(1000); // 延时1秒钟 } } ``` 在此示例中,使用TIM2定时器,将频率设置为84MHz,并使用时钟预分频器将其分为1MHz。然后,将计数器模式设置为向上计数,并将周期设置为999,以实现1kHz的PWM频率。使用TIM_OC3Init和TIM_OC4Init函数初始化CH3和CH4 PWM输出通道,并将占空比设置为50%(即PWM脉冲持续时间为500)。在主循环中,将CH3和CH4的高电平持续时间设置为1秒钟,并使用Delay函数延迟1秒钟。请注意,此代码仅为示例,您需要根据实际需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值