【STM32编程】一个定时器生成多路PWM波形的原理和方法

PWM产生原理

PWM的周期t1是一个固定值,如1ms,10ms,100ms等,在一个周期中包含了高电平t2和低电平t3,它们的关系是t2+t3=t1。改变一个周期中高电平的时间,就能达到速度或者功率调整的目的。

定时器生成一路PWM

基于STM32用一个定时器实现一路PWM输出的方法:

1. 定义一个时间基准刻度t,这个也是计时器中断周期,一般在程序中t不改变。PWM的周期、高低电平时间由若干个基准时间t组成;

我们用的单片机是STM32F103VBT6,我们选用TIM2作为基本定时器,CobeMX中的配置如图所示:

TIM2的时钟频率是64MHZ,计数模式选择向上计数,计满之后产生定时中断,中断一次的时间是1毫秒,故基准刻度t是1毫秒。

并开启定时中断

2. 定义一个全局计时变量n,n表示这段时间经过了多少个基准时间t;后期我们在中断中定义一个全局变量CountTimer_2,每终端一次加1,即可得知定时时间。

3. 定义一个全局计时变量n1,n1表示一个PWM的周期包含多少个基准时间t,n1=t1/t。一般在程序中n1,t1是计时周期不改变。

4. 定义一个全局计时变量n2,n2表示一个PWM周期中高电平包含多少个基准时间t,n2=t2/t。由于高电平的时间受其他算法控制改变的,n2也是随时在改变。

程序的流程如下:

①初始化定时器,定时器中断时间设置为t,如设置t为1ms或其他;

②初始化变量:n=0;//计时变量n清零 

uint32_t CountTimer_2 = 0; 

n1=t1/t;     //一个PWM的周期t1包含了多少个基准时间t,假如设PWM周期为1000ms=1s,则n1=1000;

  if(CountTimer_2==1000)

n2=t2/t;     //计算一个PWM中高电平时间t2由多少个基准时间t组成。t2由其他控制算法改变。

③开始计时,打开定时器中断。定时器中断程序中n++;

可以使用STM32定时器来实现两路PWM波形输出。具体步骤如下: 1. 配置定时器的时钟源和分频系数,确定定时器的计数周期。 2. 配置定时器输出通道,选择PWM模式和输出极性,并设置占空比。 3. 通过改变定时器的计数值和占空比的设置来控制PWM波形的频率和占空比。 4. 可以使用定时器的中断来实现占空比的动态调整。 以下是一个简单的代码示例,实现了两路PWM波形输出,占空比可调: ``` #include "stm32f10x.h" void TIM3_PWM_Init(void) { // 配置GPIO口为复用推挽输出 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, 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(GPIOB, &GPIO_InitStructure); // 配置TIM3定时器 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseStructure.TIM_Period = 7199; // 计数周期为7200 TIM_TimeBaseStructure.TIM_Prescaler = 0; // 不分频 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 配置TIM3的PWM输出通道 TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 3600; // 初始占空比为50% TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC2Init(TIM3, &TIM_OCInitStructure); // 使能TIM3定时器 TIM_Cmd(TIM3, ENABLE); } int main(void) { TIM3_PWM_Init(); // 占空比调整 while (1) { TIM3->CCR1 = 3600; // 设置通道1占空比为50% TIM3->CCR2 = 720; // 设置通道2占空比为10% delay_ms(1000); // 延时1s } } ``` 在上面的代码中,我们使用了TIM3定时器,配置了两个PWM输出通道,分别对应GPIOB的0、1两个引脚。在主函数中,我们使用了一个死循环来动态改变占空比的值,从而实现了PWM波形的动态调整。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

米杰的声音

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值