概述
MCU:STM32F334C8T6
最近因某些原因,需要用到任意角度移相的PWM波形来驱动全桥电路,本文记录实现过程。
类似于全桥整流器,将四个二极管换成开关器件,就是全桥逆变器,两个桥臂,需要用四路,两组互补的PWM波形来驱动,但此次的要求中,两组互补PWM波形不是完全相同的,而是有一定的相位差,而且此相位差可能是任意值。
关于互补PWM波的产生,比较简单,上一篇文章中讲了使用通用定时器的方法,本文使用高级定时器或者具有互补输出功能的通用定时器的TIMx_CHy和TIMx_CHyN通道产生,两个定时器分别产生两组互补PWM,并且占空比和频率都可以调节
(参见上一篇文章:如何利用STM32通用定时器实现输出两路占空比和频率可调的互补PWM )
本文重点在于如何产生任意角度的移相。
于是开始翻阅STM32F334的官方手册,寻找相关定时器同步和主从模式的功能!
Slave mode: Gated mode
The counter can be enabled depending on the level of a selected input.
意思就是一个计时器可以利用输入信号来使能或失能
官方手册中给出了一个例子:
Using one timer to enable another timer
In this example, we control the enable of TIM2 with the output compare 1 of Timer 3. Refer
to Figure 205 for connections. TIM2 counts on the divided internal clock only when OC1REF
of TIM3 is high. Both counter clock frequencies are divided by 3 by the prescaler compared
to CK_INT (fCK_CNT = fCK_INT/3).
1. Configure TIM3 master mode to send its Output Compare 1 Reference (OC1REF)
signal as trigger output (MMS=100 in the TIM3_CR2 register).
2. Configure the TIM3 OC1REF waveform (TIM3_CCMR1 register).
3. Configure TIM2 to get the input trigger from TIM3 (TS=000 in the TIM2_SMCR
register).
4. Configure TIM2 in gated mode (SMS=101 in TIM2_SMCR register).
5. Enable TIM2 by writing ‘1 in the CEN bit (TIM2_CR1 register).
6. Start TIM3 by writing ‘1 in the CEN bit (TIM3_CR1 register).
Note: The counter 2 clock is not synchronized with counter 1, this mode only affects the TIM2
counter enable signal.
STM32F334C8T6这款芯片中,TIM2和TIM3都没有互补PWM输出功能,有互补输出功能的有高级定时器TIM1,通用定时器TIM15,16,17,
而要使用主从模式连接两个定时器,需要两个之间有输出和输入信号
从这三个表可以看出,只能选用TIM1和TIM15,并且TIM15为主TIM1为从
使用TIM1和TIM15的CH1和CH1N分别输出一组互补PWM,用TIM15_CH2输出触发信号OC2REF
确定了选用的定时器,接下来就是写程序,程序大概有以下几个部分:
- 计算参数 //参见上一篇文章
- 配置输出引脚
- 时钟基本配置 //参见上一篇文章
- 输出模式和参数配置 //参见上一篇文章
- 互补输出配置
- 主从模式和触发信号配置
- 使能时钟
- 修改触发信号//非常重要,否则输出出错
void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t
TIM_TRGOSource);
void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t
TIM_MasterSlaveMode);
2. Configure the Slave Timers using the following functions:
void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t
TIM_InputTriggerSource);
void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode);
部分代码:
//#include "***"
//function name
{
uint16_t pulse=0 ,Period=0,shiftphase=0,deadtime=0;
uint16_t freq = 100000;//需要的频率,设定100k
//计算各个参数并赋值给对应变量,不使用死区,所以deadtime=0
Period = 72*1000000 / freq; //计时器时钟为72MHz 时PWM 一个周期内的总计数次数
pulse= Period * 45 /100 ; // 脉冲宽度的计数次数,= 总次数* 占空比,占空比45?,可调
shiftphase = Period *90/360;//设移相90度
shiftphase += 340*72/1000;//移相补偿,此处补偿0.34us,见注释1
//配置GPIO 各引脚和相应的复用功能
//时钟基本配置,参见上一篇文章
TIM_TimeBaseInit(PWM12_TIM, & TIM_TimeBaseInitStruct);
TIM_TimeBaseInit(PWM34_TIM, & TIM_TimeBaseInitStruct);
//输出模式和参数配置,参见上一篇文章
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_Pulse = pulse ;//脉宽
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
//..........写入其他参数
//PWM1,2
TIM_OC1Init(TIM15, & TIM_OCInitStruct);
TIM_OC1PreloadConfig(TIM15, TIM_OCPreload_Enable);
//PWM3,4
TIM_OC1Init(TIM1, & TIM_OCInitStruct);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
//触发信号
TIM_OCInitStruct.TIM_Pulse =shiftphase;//触发信号的脉宽,也就是移相的量
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OC2Init(TIM15, &TIM_OCInitStruct);
TIM_OC2PreloadConfig(TIM15, TIM_OCPreload_Enable);
//配置主从模式
//Master slave mode
TIM_SelectOutputTrigger(TIM15, TIM_TRGOSource_OC2Ref);
TIM_SelectMasterSlaveMode(TIM15, TIM_MasterSlaveMode_Enable);
TIM_SelectInputTrigger(TIM1, TIM_TS_ITR0);
TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Gated);
//使能定时器和PWM 输出
//TIM_Cmd();
//TIM_CtrlPWMOutputs();
//使触发信号始终保持有效,非常重要的一步,见注释2
while(TIM_GetFlagStatus(TIM15, TIM_FLAG_Trigger) == RESET);
TIM_OCInitStruct.TIM_Pulse =Period;
TIM_OC2Init(PWM12_TIM, &TIM_OCInitStruct);
//完成
}
注释1:移相补偿,由于打开时钟,代码执行等都需要时间,会造成移相不准确,所以需要对移相值进行修正,也就是补偿,代码中给出的值0.34us是在频率100K情况下经测算得到的补偿值,此值在0~300度范围内具有较高精度,能达到+-0.003us(或+-0.02度),补偿值受很多因素影响,如频率,代码执行效率(汇编效率高),芯片芯能等。
完整代码:
wind
2015,04,03
最后
以上就是呆萌歌曲为你收集整理的STM32实现任意角度移相全桥PWM完整代码:的全部内容,希望文章能够帮你解决STM32实现任意角度移相全桥PWM完整代码:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复