stm32f4 输出pwm波_PWM那些事儿

之所以想写PWM,是因为我觉得PWM是一个电力电子工程师入门砖,是实现所有电力电子控制的基础。同时,PWM控制很多细节可做,要想研究透彻也很难。

SPWM和SVPWM


采用PWM的变频器,是将直流电压通过调制,变成变频变幅值的电压(交流或直流)。最开始采用的是SPWM,因为实现简单,只需要将想要输出的调制波形和三角载波比较就可以了,在“远古”时代模拟电路就可以很简单的实现。
定义调制比为输出相电压和直流电压1/2的比值,SPWM的调制比为1。

1d85624cd35b4ac1adf5bec860c9b8af


SVPWM现在大家叫空间矢量PWM,它是从电机磁通正弦的角度出发,想通过电压的控制获得恒定的圆形旋转磁场,所以也叫正弦磁通PWM。磁通是电压的积分,SVPWM就是通过选择合适的电压矢量和作用时间,来使得磁通更接近圆形。SVPWM最大的好处是提高了电压利用率,调制比可以达到1.15(比SPWM提高了15%)。更通俗的理解SVPWM的调制比提升,就是输出的线电压峰值能等于直流母线电压,而SPWM最高能输出的电压峰值为直流母线电压的sqrt(3)/2.

SVPWM的数字实现


很多文献和教科书都会去讲怎么计算8个电压矢量的作用时间,怎么按顺序去作用电压矢量,该过程实在是太虐心,太考验人的耐性。而最开始搞SPWM的人不死心,想看看SVPWM这种电压矢量作用方式下,等效的载波是什么样的。于是很多大神上场发挥作用,最后研究下来,发现其调制波是在正弦波的基础上,注入了三次谐波。

bc5d78e73d404ce0827e4b9bd8c23ada


而且三次谐波很特别,并不是一个三次正弦信号,而是类似三角波的波形。很幸运,这个注入的谐波还有解析式,Uz=middle(Ua,Ub,Uc),也即是三相输出电压ua,ub,uc的中间值。那就好办了,SVPWM的数字实现时,不用再采用复杂的空间位置计算了,只需要求取中间值,进行叠加即可。
更进一步研究,对Uz采用不同的取值,除了可以得到SVPWM外,还可以变化得到5段式pwm、过调制的PWM等等。

PWM的放大倍数


相信很多搞电力电子控制的人,都会被Kpwm这个系数给困扰。它出现在很多文献和教科书中,用于推到系统的传递函数,但没有人来讲它到底是多少。Kpwm其实是来衡量pwm调制经过功率器件后的放大系数。

052c9390a7364576a91e308568c9d4d4


Kpwm=Uout/Uref。通过上图可以看到,Kpwm和很多因素有关,比如PWM调制算法、芯片的pwm逻辑电路、功率器件,每个人对这些细节的定义都不一样,所以Kpwm没有一个确切的值,我想也是很多著作不屑于讲明白的原因吧。实际应用中,应该假设如果我输出一个Uref值,通过各种闯关后,最终输出的Uout是多少,以此来得到自己Kpwm。

-----转自陈老四

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在STM32F4上输出PWM信号,可以使用定时器模块。具体步骤如下: 1. 初始化定时器模块,选择合适的时钟源和分频系数。 2. 配置定时器为PWM模式,选择合适的计数值和占空比。 3. 配置输出引脚,使其连接到定时器的输出通道。 以下是一个简单的示例代码,使用TIM3_CH1输出PWM信号: ```c // 初始化定时器模块 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_TimeBaseInitStruct.TIM_Prescaler = 0; TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStruct.TIM_Period = 999; TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct); // 配置定时器为PWM模式 TIM_OCInitTypeDef TIM_OCInitStruct; TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStruct.TIM_Pulse = 499; TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStruct); // 配置输出引脚 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_TIM3); // 启动定时器 TIM_Cmd(TIM3, ENABLE); ``` 这段代码将在PB4引脚输出一个占空比为50%的PWM信号,频率为84MHz/1000=84kHz。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值