STM32之通用定时器输出PWM波

本文介绍如何使用STM32的通用定时器TIM2产生PWM波形,详细讲解了通过TIM2的通道1和通道2生成PWM信号的具体实现方法及代码配置过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

明确几个点:

  • STM32的四个通用定时器:TIM2、TIM3、TIM4、TIM5。
  • 定时器输出PWM波的几种方式:PWM输出模式、输出比较模式。
  • 每个通用定时器有4路捕获/比较通道,可产生四路PWM波。

  • 利用TIM2的通道1和通道2产生PWM波的代码(PWM模式产生PWM波):
void PWM2_Init(u8 duty1, u8 duty2)//利用TIM2的通道1(左电机)和通道2(右电机)产生PWM波
{
	u32 arr;
	
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	arr = 1000000 / freq;//计算频率对应的周期值(计数值)
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用强推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	TIM_TimeBaseStructure.TIM_Prescaler = 72-1;//72分频
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
	TIM_TimeBaseStructure.TIM_Period = arr - 1;//周期值,自动重装载计数值
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;//不分频
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//TIM2定时器
    
	//对通道1和通道2配置为PWM输出模式
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//输出模式配置为PWM2模式
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//低极性
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//使能输出状态
	TIM_OCInitStructure.TIM_Pulse = (arr-1) * duty1 / 100;//占空比
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);//TIM2_CH1
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//输出模式配置为PWM2模式
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//低极性
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//使能输出状态
	TIM_OCInitStructure.TIM_Pulse = (arr-1) * duty2 / 100;//占空比
	TIM_OC2Init(TIM2, &TIM_OCInitStructure);//TIM2_CH2
	
	TIM_Cmd(TIM2, ENABLE);//使能TIM2
}
  • 代码说明
  1. PWM模式下4个通道产生的PWM波的频率只能是一致的。
  2. 关于arr = 1000000 / freq;//计算频率对应的周期值(计数值)这行代码的说明:定时器的设置是72分频定时器输入频率为72MHZ,那么对应的机器周期就是72/72MHZ计一个数的时间为一个机器周期,计数频率是freq,那么计数周期就是1/freq计数周期内的计数个数就等于:计数周期/机器周期,也就是1000000/freq。
  3. 注意端口模式为复用推挽输出,PA0和PA1是具有复用功能的GPIO口,所以要设置为复用推挽输出
    在这里插入图片描述
  4. PWM输出模式配置中,输出模式配置与极性配置:常用搭配TIM_OCMode_PWM1和TIM_OCPolarity_High、TIM_OCMode_PWM2和TIM_OCPolarity_Low,如此搭配,输出的是正逻辑(比如设占空比为60%,则高电平持续时间占60%)下面是图示(图上的占空比就是高电平占的时间)。
    正逻辑:TIM_OCMode_PWM1和 TIM_OCPolarity_HighTIM_OCMode_PWM2和TIM_OCPolarity_Low
    在这里插入图片描述
    负逻辑:TIM_OCMode_PWM1和 TIM_OCPolarity_LowTIM_OCMode_PWM2和TIM_OCPolarity_High
    在这里插入图片描述
    输出模式:
    在这里插入图片描述
    PWM1:CNT<CRRx为有效电平,CNT>CRRx为无效电平。
    PWM2:CNT>CRRx为有效电平,CNT<CRRx为无效电平。
    极性:
    在这里插入图片描述
    高极性:高电平1为有效状态(active),低电平0为无效状态(inactive)
    低极性:低电平0为有效状态(active),高电平1为无效状态(inactive)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ReRrain

觉得写的不错,不妨请我喝杯~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值