基本原理
SPWM的全稱是(Sinusoidal PWM),正弦脈沖寬度調(diào)制是一種非常成熟,使用非常廣泛的技術(shù);
之前在PWM的文章中介紹過(guò),基本原理就是面積等效原理,即沖量相等而形狀不同的窄脈沖加在具有慣性的環(huán)節(jié)上時(shí),其效果基本相同 。
換句話說(shuō)就是通過(guò)一系列形狀不同的窄脈沖信號(hào),相對(duì)應(yīng)時(shí)間的積分相等(面積相等),其最終效果相同;

所以SPWM就是輸入一段幅值相等的脈沖序列去等效正弦波,因此輸出為高的脈沖時(shí)間寬度基本上呈正弦規(guī)律變化;
這里通常使用的采樣方法是:自然采樣法和規(guī)則采樣法;
自然采樣法
自然采樣法是用需要調(diào)制的正弦波與載波鋸齒波的交點(diǎn),
來(lái)確定最終PWM脈沖所需要輸出的時(shí)間寬度,最終由此生成SPWM波;
具體如下圖所示,這里會(huì)對(duì)局部①部分進(jìn)行簡(jiǎn)單分析,下面進(jìn)一步介紹;

SPWM波形
局部①的情況如下圖所示;簡(jiǎn)單分析一下整個(gè)圖形的情況;
鋸齒波和調(diào)制正弦波的交點(diǎn)為A和B;
因此A點(diǎn)所需時(shí)間為T1,B點(diǎn)所需時(shí)間為T2;
所以在該周期內(nèi),PWM所需要的脈沖時(shí)間寬度Ton滿足:
最終結(jié)論就是,只要求出A點(diǎn)和B點(diǎn)位置,就可以求出;

自然采樣法
這里對(duì)于求解A,B位置的推導(dǎo)不做介紹,但是計(jì)算量比較大,因此在微處理器中進(jìn)行運(yùn)算會(huì)占用大量資源,下面再介紹另一種優(yōu)化的采樣方法:規(guī)則采樣法。
規(guī)則采樣法
根據(jù)載波PWM的電壓極性,一般可以分為單極性SPWM和雙極性SPWM;下面進(jìn)一步介紹;
單極性
單極性SPWM在正弦波的正版周期,PWM只有一種極性,在正弦波的負(fù)半周期,PWM同樣只有一種極性,但是與正半周期恰恰相反,具體如下圖所示;
下面取正弦波的正半周期的情況進(jìn)行分析;

單極性SPWM
正弦波的正半周期整體如下所示;由圖中我們可以知道以下幾點(diǎn);
載波PWM的周期為T;
線段BO為當(dāng)前這個(gè)等腰三角形的垂線;
線段BO與正弦曲線 相較于點(diǎn)A;
所以在該周期內(nèi),PWM所需要的脈沖時(shí)間寬度Ton滿足:

單極性正半周期
具體的推導(dǎo)過(guò)程如下:
第一步:由于O點(diǎn)的位置比較好確認(rèn),因此,線段
第二步:這里載波鋸齒波的最大幅值為1,因此線段
第三步:根據(jù)初中學(xué)過(guò)的相似三角形定理,滿足:
最終簡(jiǎn)化得到:
這里對(duì)載波的幅值做了歸一化處理,如果鋸齒波的最大值為,正弦波的幅值最大為,則;
雙極性
只要符合面積等效原理,PWM還可以是雙極性的,具體如下圖所示;這種調(diào)制方式叫雙極性SPWM,在實(shí)際應(yīng)用中更為廣泛。

雙極性SPWM
如何編寫程序
上面講到這里PWM的時(shí)間滿足:
其中為正弦波幅值,為載波鋸齒波幅值;
那么下面以STM32為例,介紹以下如何進(jìn)行程序編寫;
首先得先STM32是如何產(chǎn)生PWM?
通過(guò)數(shù)據(jù)手冊(cè)可以知道,STM32通過(guò)TIM輸出PWM,這里有幾個(gè)寄存器;
計(jì)數(shù)寄存器:CNT
比較寄存器:CCR(決定了占空比,決定了脈沖寬度)
自動(dòng)重裝寄存器:AAR(決定了PWM的周期)
可能這么說(shuō),還是云里霧里的,先看下圖;

STM32的PWM產(chǎn)生原理
STM32中PWM的模式有普通的PWM,和中央對(duì)齊的PWM,上圖使用的就是中央對(duì)齊PWM;
產(chǎn)生PWM的過(guò)程可以分為以下幾個(gè)過(guò)程;
第一步:配置好TIM,通常時(shí)基和ARR都會(huì)配置好,這時(shí)候PWM的周期就已經(jīng)被設(shè)定好了,另外時(shí)基決定了CNT計(jì)數(shù)寄存器增加一次技術(shù)所需的時(shí)間;
第二步:剛開(kāi)始,CNT
第三步:當(dāng)CNT的值等于AAR之后,CNT開(kāi)始減少,同理CNT
第四步:循環(huán)上述三個(gè)步驟;
程序中如何實(shí)現(xiàn)?
從上述STM32產(chǎn)生PWM的過(guò)程中不難發(fā)現(xiàn),滿足;
上一節(jié)推導(dǎo)的公式如下:
結(jié)合①式和②式,可以得到:
上面公式中用CCR表示CCR寄存器中的值,ARR表示ARR寄存器中的值;
最后需要做的三件事
計(jì)算出ARR,一般配置TIM定時(shí)器的時(shí)候能在數(shù)據(jù)手冊(cè)找到公式;
調(diào)制比,也就是的系數(shù);
根據(jù)③式生成正弦表,然后查表(實(shí)時(shí)計(jì)算因?yàn)樯婕暗捷^多運(yùn)算量,所以利用查表,空間換時(shí)間,提高效率),利用PWM的事件去觸發(fā)中斷,更新下一次CCR的值;
正弦函數(shù)表:
constuint16_tindexWave[]={ 0,9,18,27,36,45,54,63,72,81,89,98, 107,116,125,133,142,151,159,168,176, 184,193,201,209,218,226,234,242,249, 257,265,273,280,288,295,302,310,317, 324,331,337,344,351,357,364,370,376, 382,388,394,399,405,410,416,421,426, 431,436,440,445,449,454,458,462,465, 469,473,476,479,482,485,488,491,493, 496,498,500,502,503,505,506,508,509, 510,510,511,512,512,512,512,512,512, 511,510,510,509,508,506,505,503,502, 500,498,496,493,491,488,485,482,479, 476,473,469,465,462,458,454,449,445, 440,436,431,426,421,416,410,405,399, 394,388,382,376,370,364,357,351,344, 337,331,324,317,310,302,295,288,280, 273,265,257,249,242,234,226,218,209, 201,193,184,176,168,159,151,142,133, 125,116,107,98,89,81,72,63,54,45,36, 27,18,9,0 };
中斷服務(wù)函數(shù):
externuint16_tindexWave[]; extern__IOuint32_trgb_color; /*呼吸燈中斷服務(wù)函數(shù)*/ voidBRE_TIMx_IRQHandler(void) { staticuint16_tpwm_index=0;//用于PWM查表 staticuint16_tperiod_cnt=0;//用于計(jì)算周期數(shù) staticuint16_tamplitude_cnt=0;//用于計(jì)算幅值等級(jí) if(TIM_GetITStatus(BRE_TIMx,TIM_IT_Update)!=RESET)//TIM_IT_Update { amplitude_cnt++; //每個(gè)PWM表中的每個(gè)元素有AMPLITUDE_CLASS個(gè)等級(jí), //每增加一級(jí)多輸出一次脈沖,即PWM表中的元素多使用一次 //使用256次,根據(jù)RGB顏色分量設(shè)置通道輸出 if(amplitude_cnt>(AMPLITUDE_CLASS-1)){ period_cnt++; //每個(gè)PWM表中的每個(gè)元素使用period_class次 if(period_cnt>period_class){ //標(biāo)志PWM表指向下一個(gè)元素 pwm_index++; //若PWM表已到達(dá)結(jié)尾,重新指向表頭 if(pwm_index>=POINT_NUM){ pwm_index=0; } //重置周期計(jì)數(shù)標(biāo)志 period_cnt=0; } //重置幅值計(jì)數(shù)標(biāo)志 amplitude_cnt=0; }else{ //每個(gè)PWM表中的每個(gè)元素有AMPLITUDE_CLASS個(gè)等級(jí), //每增加一級(jí)多輸出一次脈沖,即PWM表中的元素多使用一次 //根據(jù)RGB顏色分量值,設(shè)置各個(gè)通道是否輸出當(dāng)前的PWM表元素表示的亮度 //紅 if(((rgb_color&0xFF0000)>>16)>=amplitude_cnt){ //根據(jù)PWM表修改定時(shí)器的比較寄存器值 BRE_TIMx->BRE_RED_CCRx=indexWave[pwm_index]; }else{ //比較寄存器值為0,通道輸出高電平,該通道LED燈滅 BRE_TIMx->BRE_RED_CCRx=0; } //綠 if(((rgb_color&0x00FF00)>>8)>=amplitude_cnt){ //根據(jù)PWM表修改定時(shí)器的比較寄存器值 BRE_TIMx->BRE_GREEN_CCRx=indexWave[pwm_index]; }else{ //比較寄存器值為0,通道輸出高電平,該通道LED燈滅 BRE_TIMx->BRE_GREEN_CCRx=0; } //藍(lán) if((rgb_color&0x0000FF)>=amplitude_cnt){ //根據(jù)PWM表修改定時(shí)器的比較寄存器值 BRE_TIMx->BRE_BLUE_CCRx=indexWave[pwm_index]; }else{ //比較寄存器值為0,通道輸出高電平,該通道LED燈滅 BRE_TIMx->BRE_BLUE_CCRx=0; } //必須要清除中斷標(biāo)志位 TIM_ClearITPendingBit(BRE_TIMx,TIM_IT_Update); } } }
總結(jié)
本文簡(jiǎn)單介紹了SPWM的原理和調(diào)制方法,推導(dǎo)了SPWM的PWM脈沖寬度的計(jì)算時(shí)間,最后給出了基于STM32單片機(jī)產(chǎn)生SPWM驅(qū)動(dòng)呼吸燈的部分代碼。
責(zé)任編輯:lq
-
正弦波
+關(guān)注
關(guān)注
11文章
657瀏覽量
58252 -
SPWM
+關(guān)注
關(guān)注
14文章
361瀏覽量
63200 -
脈沖信號(hào)
+關(guān)注
關(guān)注
6文章
404瀏覽量
38235
原文標(biāo)題:全網(wǎng)最通俗易懂SPWM入門教程,快來(lái)白嫖
文章出處:【微信號(hào):WW_CGQJS,微信公眾號(hào):傳感器技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
EG8010 SPWM芯片數(shù)據(jù)手冊(cè)
關(guān)于使用spwm控制電機(jī)的問(wèn)題
三種SPWM波形生成算法的分析與實(shí)現(xiàn)
基于DSP的SPWM調(diào)制的實(shí)現(xiàn)
多種空間矢量調(diào)制方法的諧波分析
正弦脈寬調(diào)制(SPWM)波的基本要素
PWM逆變器的不同調(diào)制方法對(duì)比
基于MATLAB實(shí)現(xiàn)FM調(diào)制解調(diào)
電機(jī)大范圍調(diào)速的綜合電壓調(diào)制策略
SPWM控制時(shí),三路正弦波如何轉(zhuǎn)換為PWM比較值?
調(diào)制方式對(duì)網(wǎng)絡(luò)速度的影響
調(diào)制信號(hào)的性能分析
數(shù)字調(diào)制與模擬調(diào)制的區(qū)別
調(diào)制方式的分類與比較
單極性正弦波脈寬調(diào)制方式

SPWM的原理和調(diào)制方法
評(píng)論