如何利用STM32通用定时器实现输出两路占空比和频率可调的互补PWM

MCU:STM32F334C8T6

PWM即脉宽调制,可以用来驱动电机,驱动全桥电路等,用过STM32的知道,用它的定时器可以很容易实现PWM输出,使用高级定时器的TIMx_CHy和TIMx_CHyN可以轻易实现互补PWM(complementary PWM)波形的输出。

高级定时器资源有限,本文利用通用定时器(General-purpose timers)实现互补PWM输出,在高级定时器资源不够时不失为一个好方法。

STM32的定时器PWM有两种模式:PWM mode 1和PWM mode 2

工作原理:

PWM mode 1 - In upcounting, channel 1 is active as long as TIMx_CNT<TIMx_CCR1 else inactive. 

In downcounting, channel 1 is inactive (OC1REF=‘0’) as long as TIMx_CNT>TIMx_CCR1 else active (OC1REF=’1’).

 PWM mode 2 - In upcounting, channel 1 is inactive as long as TIMx_CNT<TIMx_CCR1 else active. 

In downcounting, channel 1 is active as long as TIMx_CNT>TIMx_CCR1 else inactive.

官方手册对channel 1 的说明,其他channel类似,考虑向上计数模式

方法一:

假设高电平为有效电平,即高电平为active,使用定时器3

PWM mode 1:TIM3_CNT<TIM3_CCR1 输出高,TIM3_CNT>TIM3_CCR1 输出低

PWM mode 2:TIM3_CNT<TIM3_CCR1 输出低,TIM3_CNT>TIM3_CCR1 输出高

可以看出,无论是mode1还是mode2,电平翻转都是在计数器TIM3_CNT中的值达到TIM3_CCR1 中的值(次数可以控制占空比,见下文)的时候

据此,可以将TIM的两个通道(如TIM3_CH1和TIM3_CH2)分别配置为mode1和mode2,那么即可输出两路互补互补PWM,此为方法一

方法二:

方法一中假设高电平为active状态,事实上active状态也可以是低电平,在这种情况下,考虑同一种模式(mode1)

acive high:TIM3_CNT<TIM3_CCR1 输出高,TIM3_CNT>TIM3_CCR1 输出低

active low:TIM3_CNT<TIM3_CCR1 输出低,TIM3_CNT>TIM3_CCR1 输出高

于是,同种模式下,分别将两个通道的有效电平配置为高和低,也可以实现互补PWM输出,此为方法二

在向下计数模式中原理类似,不再说明

频率和占空比的调节:

上面提到了两个寄存器:CNT和CCR1,(channel x 对应CRx)
CNT中是计时器当前的计数值,CCR1中是用来比较的值,当CNT达到CCR1的值时,将发生电平转变
另一个寄存器ARR,自动装载寄存器,存储的是自动装载的值,向上计数中当CNT递加达到ARR的值时将被复位,从0从新开始,而向下计数时,当CNT到达0时,ARR中的值将被自动装载到CNT重新开始递减,也就是说ARR中的值是计数周期(中心对其计数模式此处不考虑)
 
假设我们需要的频率为freq,占空比dutycycle,定时器使用系统频率SYSCLK,有如下关系:
 
ARR = SYSCLK/freq,dutycycle=CCR1/ARR
 
可见,通过更改ARR实现频率可调,更改CCR1实现占空比可调
 

部分代码:

uint16_t period=0,pulsewidth=0;
	
GPIO_InitTypeDef  GPIO_InitStruct;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;
TIM_OCInitTypeDef  TIM_OCInitStruct;

period = 72*1000000/(100*1000);//计数周期,系统频率72M,PWM输出频率100k
pulsewidth = 45*period/100;  //脉宽,占空比45%

//开启外设时钟
//配置GPIO

TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period = period - 1;//ARR
</pre><pre name="code" class="html">//填充TIM_TimeBaseInitStruct其他参数
<span style="font-family: Arial, Helvetica, sans-serif;">TIM_TimeBaseInit(TIM3, & TIM_TimeBaseInitStruct);</span>
//OCInit结构体初始化,填充完所有参数
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_Pulse = pulsewidth;		//CCR1
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
//TIM_OC1Init()开启通道1

//OC2 方法1 : 修改Mode
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
/***********************************
//OC2 方法2 : 修改 Polarity
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;
***********************************/
//TIM_OC2Init()开启通道2

//最后打开时钟
TIM_Cmd(TIM3, ENABLE);

 

附图为亲自测试效果,两种方法效果相同

测试基于STM32F334C8T6,频率100k,占空比45%,互补波占空比55%

完整代码下载:

http://download.csdn.net/detail/wind4study/8559157
 
 
wind
2015,04,02
 
 
 
 
 
 

 

  • 17
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
STM32F103上实现两路带死区的互补PWM输出的方法如下: 1. 首先,根据引用和引用,你可以使用STM32的高级定时器实现带死区的PWM输出。高级定时器是专门用于生成PWM波的定时器,并且支持互补输出和死区控制。 2. 配置PWM波的频率占空比。通过设置高级定时器的预分频器和重载值,可以确定PWM波的频率。通过设置占空比寄存器,可以控制PWM波的占空比。引用中提到了配置PWM寄存器的步骤。 3. 配置PWM波的互补输出和死区时间。对于互补输出,你可以通过设置高级定时器互补输出模式来实现。对于死区时间,你可以通过设置死区寄存器来控制。 4. 配置GPIO引脚使能PWM输出。根据引用中的说明,你需要将互补输出通道的GPIO配置为复用推挽输出模式,以确保PWM波能够从相应的引脚输出。 总结起来,你需要使用STM32的高级定时器来配置和控制带死区的互补PWM输出,并且需要设置相应的PWM寄存器、互补输出模式和死区寄存器来实现所需的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [STM32F103输出两路PWM波并带死区](https://download.csdn.net/download/wzainyu/10729525)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [stm32 高级定时器-PWM互补输出带死区时间](https://download.csdn.net/download/qq_37108937/10362359)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [[标准库]STM32F103R8T6 高级定时器--PWM输出和带死区互补PWM输出](https://blog.csdn.net/qq_36415628/article/details/128919371)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值