SPWM原理及STM32生成

SPWM原理及STM32生成本文详细介绍了 spwm 生成原理 后通过 stm32f1 实例代码生成 spwm 可以直接复制测试 spwm

大家好,欢迎来到IT知识分享网。

一.什么是SPWM

要说SPWM先得说PWM,英文全名Pluse Width Modulation,即脉冲宽度调制,实际上就是周期的矩形波,然后每个周期的占空比都可以自己设置就叫调制。比如Buck电路中开关管的PWM波,当输入不变时可以将它的占空比从40%变到60%就能提高母线输出电压。

在这里插入图片描述
图一 .占空比固定pwm波与载波

在这里插入图片描述

如图,我们将正弦函数和三角载波都归一化处理,正弦波幅值要小于三角波,这里取0.8。在一个很小的Δt时段内正弦函数值和占空比的值相等。例如图中Δt时段正弦波的值是0.8左右(A点电压值),它的矩形波占空比也是80%。同时我们可以看出矩形波的频率和三角波相等。正弦波被三角波“切割”成高频的spwm,用以控制开关管,然后spwm通过低通滤波滤除高次谐波后,得到原来的正弦波。图示情况下从0开始半个期内SPWM占空比是0->0.8->0按照正弦函数变化,要得到某时的占空比,得到此时的sine值就可以了,sine值可以事先放入表中。

二.SPWM软件生成

在这里插入图片描述
在这里插入图片描述

如图所示,要注意因为是单极性调制,spwm和三角载波都是大于0的。在单相全桥逆变电路中,开关管交替导通时输出电压Ud自然会倒过来为负,Ud经过滤波就是一个正弦波。

三.实例分析

下面我们来看一个例子,来生成一个开环的三相spwm。单相逆变需生成两组相差180度的spwm,三相即生成三组两两相差120度的spwm,且每组的spwm都是互补的。

在这里插入图片描述

如图,将生成的三组spwm分别加到1、2、3组桥臂,每组spwm互补防止了同一桥臂上下管同时导通会引起短路。

 uint16_t Counter_sine1 = 0; //A相 uint16_t Counter_sine2 = 83; //滞后A相120度 uint16_t Counter_sine3 = 166; //超前A相120度 / * 说明 TIM1GPIO初始化 CH1--A8 CH2--A9 CH3--A10 * CH1N-B13 CH2N-B14 CH3N-B15 * * 入口参数 None * * 出口参数 None / void TIM1_GPIO_Config(void) { 
    GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9| GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13| GPIO_Pin_14 | GPIO_Pin_15; GPIO_Init(GPIOB, &GPIO_InitStructure); } #define CKTIM ((u32)uL) //主频 #define PWM_PRSC ((u8)0) //TIM1分频系数 #define PWM_FREQ ((u16) 10000) //PWM频率(Hz) #define PWM_PERIOD ((u16) (CKTIM / (u32)(2 * PWM_FREQ *(PWM_PRSC+1)))) #define MODULAT (float)0.7 //调制度 / * 说明 TIM1模式 * * 入口参数 None * * 出口参数 None / void TIM1_Mode_Config(void) { 
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_BDTRInitTypeDef TIM1_BDTRInitStructure; NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseStructure.TIM_Period = PWM_PERIOD; //计数周期 TIM_TimeBaseStructure.TIM_Prescaler = PWM_PRSC; //分频系数 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能CHx的PWM输出 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//互补输出使能,使能CHxN的PWM输出 TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set; TIM_OC1Init(TIM1, &TIM_OCInitStructure); //配置CH1 TIM_OCInitStructure.TIM_Pulse = 0; TIM_OC2Init(TIM1, &TIM_OCInitStructure); //配置CH2 TIM_OCInitStructure.TIM_Pulse = 0; TIM_OC3Init(TIM1, &TIM_OCInitStructure); //配置CH3 //死区时间 TIM1_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; TIM1_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable; TIM1_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1; TIM1_BDTRInitStructure.TIM_DeadTime = 360; //设置死区时间 TIM1_BDTRInitStructure.TIM_Break = TIM_Break_Disable; TIM1_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High; TIM1_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable; TIM_BDTRConfig(TIM1, &TIM1_BDTRInitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //4个抢先级、4个子优先级  NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_ITConfig(TIM1,TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3,ENABLE); //使能中断 TIM_CtrlPWMOutputs(TIM1, ENABLE); //PWM输出使能  TIM_Cmd(TIM1, ENABLE); //使能TIM1 } void TIM1_PWM_Init(void) { 
    TIM1_GPIO_Config(); TIM1_Mode_Config(); } //定时器1中断服务函数 void TIM1_CC_IRQHandler(void) { 
    if(Counter_sine1>=250) { 
    Counter_sine1 = 0; } if(Counter_sine2>=250) { 
    Counter_sine2 = 0; } if(Counter_sine3>=250) { 
    Counter_sine3 = 0; } //CCR1  if (TIM_GetITStatus(TIM1, TIM_IT_CC1)!=RESET) { 
    TIM_SetCompare1(TIM1,(uint32_t)(talab[Counter_sine1])*MODULAT); //A相  Counter_sine1++; TIM_ClearITPendingBit(TIM1 , TIM_IT_CC1); } //CCR2 if (TIM_GetITStatus(TIM1, TIM_IT_CC2) !=RESET) { 
    TIM_SetCompare2(TIM1,((uint32_t)talab[Counter_sine2])*MODULAT); //B相 Counter_sine2++; TIM_ClearITPendingBit(TIM1 , TIM_IT_CC2); } //CCR3  if (TIM_GetITStatus(TIM1, TIM_IT_CC3) !=RESET) { 
    TIM_SetCompare3(TIM1,(uint32_t)(talab[Counter_sine3])*MODULAT); //C相 Counter_sine3++; TIM_ClearITPendingBit(TIM1 , TIM_IT_CC3); } } 
int const talab[250]= { 
    100 , 102 , 108 , 116 , 126 , 140 , 154 , 172 , 194 , 216 , 242 , 270 , 300 , 334 , 370 , 408 , 448 , 490 , 536 , 582 , 632 , 684 , 738 , 794 , 854 , 914 , 976 ,1040 ,1108 ,1176 , 1246 ,1320 ,1394 ,1470 ,1548 ,1626 ,1708 ,1790 ,1874 ,1960 , 2046 ,2136 ,2224 ,2316 ,2408 ,2502 ,2596 ,2690 ,2786 ,2884 , 2982 ,3080 ,3180 ,3280 ,3382 ,3482 ,3584 ,3686 ,3788 ,3892 , 3994 ,4096 ,4200 ,4304 ,4406 ,4508 ,4612 ,4714 ,4816 ,4918 , 5018 ,5120 ,5220 ,5320 ,5418 ,5516 ,5614 ,5710 ,5804 ,5898 , 5992 ,6084 ,6176 ,6264 ,6354 ,6440 ,6526 ,6610 ,6692 ,6774 , 6852 ,6930 ,7006 ,7080 ,7154 ,7224 ,7292 ,7360 ,7424 ,7486 , 7546 ,7606 ,7662 ,7716 ,7768 ,7818 ,7864 ,7910 ,7952 ,7992 , 8030 ,8066 ,8100 ,8130 ,8158 ,8184 ,8206 ,8228 ,8246 ,8260 , 8274 ,8284 ,8292 ,8298 ,8300 ,8300 ,8298 ,8292 ,8284 ,8274 , 8260 ,8246 ,8228 ,8206 ,8184 ,8158 ,8130 ,8100 ,8066 ,8030 , 7992 ,7952 ,7910 ,7864 ,7818 ,7768 ,7716 ,7662 ,7606 ,7546 , 7486 ,7424 ,7360 ,7292 ,7224 ,7154 ,7080 ,7006 ,6930 ,6852 , 6774 ,6692 ,6610 ,6526 ,6440 ,6354 ,6264 ,6176 ,6084 ,5992 , 5898 ,5804 ,5710 ,5614 ,5516 ,5418 ,5320 ,5220 ,5120 ,5018 , 4918 ,4816 ,4714 ,4612 ,4508 ,4406 ,4304 ,4200 ,4096 ,3994 , 3892 ,3788 ,3686 ,3584 ,3482 ,3382 ,3280 ,3180 ,3080 ,2982 , 2884 ,2786 ,2690 ,2596 ,2502 ,2408 ,2316 ,2224 ,2136 ,2046 , 1960 ,1874 ,1790 ,1708 ,1626 ,1548 ,1470 ,1394 ,1320 ,1246 , 1176 ,1108 ,1040 , 976 , 914 , 854 , 794 , 738 , 684 , 632 , 582 , 536 , 490 , 448 , 408 , 370 , 334 , 300 , 270 , 242 , 216 , 194 , 172 , 154 , 140 , 126 , 116 , 108 , 102 , 100 }; 

在这里插入图片描述
将程序下载到stm32f103单片机,PA8、PA9两个引脚输出spwm波形是相差120度的,如图。
互补通道波形相反,且有死区时间。
将以上程序加到一起就可以实现啦!


免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/130224.html

(0)
上一篇 2025-08-18 18:10
下一篇 2025-08-18 18:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信