您好,歡迎進(jìn)入深圳市穎特新科技有限公司官方網(wǎng)站!
導(dǎo)讀:PWM(Pulse Width Modulation)控制——脈沖寬度調(diào)制技術(shù),通過對一系列脈沖的寬度進(jìn)行調(diào)制,來等效地獲得所需要波形(含形狀和幅值)。 PWM控制技術(shù)在逆變電路中應(yīng)用最廣,應(yīng)用的逆變電路絕大部分是PWM型,廣泛應(yīng)用在從測量、通信到功率控制與變換的許多領(lǐng)域中。
脈寬調(diào)制(PWM)基本原理:控制方式就是對逆變電路開關(guān)器件的通斷進(jìn)行控制,使輸出端得到一系列幅值相等的脈沖,用這些脈沖來代替正弦波或所需要的波形。也就是在輸出波形的半個周期中產(chǎn)生多個脈沖,使各脈沖的等值電壓為正弦波形,所獲得的輸出平滑且低次諧波少。按一定的規(guī)則對各脈沖的寬度進(jìn)行調(diào)制,即可改變逆變電路輸出電壓的大小,也可改變輸出頻率。
例如,把正弦半波波形分成N等份,就可把正弦半波看成由N個彼此相連的脈沖所組成的波形。這些脈沖寬度相等,都等于 ∏/n ,但幅值不等,且脈沖頂部不是水平直線,而是曲線,各脈沖的幅值按正弦規(guī)律變化。如果把上述脈沖序列用同樣數(shù)量的等幅而不等寬的矩形脈沖序列代替,使矩形脈沖的中點(diǎn)和相應(yīng)正弦等分的中點(diǎn)重合,且使矩形脈沖和相應(yīng)正弦部分面積(即沖量)相等,就得到一組脈沖序列,這就是PWM波形?梢钥闯,各脈沖寬度是按正弦規(guī)律變化的。根據(jù)沖量相等效果相同的原理,PWM波形和正弦半波是等效的。對于正弦的負(fù)半周,也可以用同樣的方法得到PWM波形。
在PWM波形中,各脈沖的幅值是相等的,要改變等效輸出正弦波的幅值時,只要按同一比例系數(shù)改變各脈沖的寬度即可,因此在交-直-交變頻器中,PWM逆變電路輸出的脈沖電壓就是直流側(cè)電壓的幅值。
根據(jù)上述原理,在給出了正弦波頻率,幅值和半個周期內(nèi)的脈沖數(shù)后,PWM波形各脈沖的寬度和間隔就可以準(zhǔn)確計算出來。按照計算結(jié)果控制電路中各開關(guān)器件的通斷,就可以得到所需要的PWM波形。
下圖為輸出時的PWM波的實時波形。
PWM的一個優(yōu)點(diǎn)是從處理器到被控系統(tǒng)信號都是數(shù)字形式的,無需進(jìn)行數(shù)模轉(zhuǎn)換,讓信號保持為數(shù)字形式可將噪聲影響降到最小。噪聲只有在強(qiáng)到足以將邏輯1改變?yōu)檫壿?或?qū)⑦壿?改變?yōu)檫壿?時,也才能對數(shù)字信號產(chǎn)生影響。
對噪聲抵抗能力的增強(qiáng)是PWM相對于模擬控制的另外一個優(yōu)點(diǎn),而且這也是在某些時候?qū)WM用于通信的主要原因。從模擬信號轉(zhuǎn)向PWM可以極大地延長通信距離。在接收端,通過適當(dāng)?shù)腞C或LC網(wǎng)絡(luò)可以濾除調(diào)制高頻方波并將信號還原為模擬形式。
由NE555產(chǎn)生的PWM調(diào)速系統(tǒng)
總之,PWM既經(jīng)濟(jì)、節(jié)約空間、抗噪性能強(qiáng),是一種值得廣大工程師在許多設(shè)計應(yīng)用中使用的有效技術(shù)。
脈沖寬度模式(PWM模式)可以用來產(chǎn)生一個由TIMx_ARR寄存器確定平率,由TIMx_CCRx寄存器確定占空比的信號。在STM32開發(fā)中,由于官方提供了較為完善的庫函數(shù),使得我們的開發(fā)工作變得相當(dāng)?shù)妮p松,甚至可以在不需要太多了解硬件結(jié)構(gòu)的條件下,完成我的開發(fā)工作,實現(xiàn)我們所需要的功能。在此,筆者也建議大家,在初學(xué)的時候盡量去熟悉固件庫中提供的函數(shù)來調(diào)節(jié)PWM的頻率和占空比,對底層寄存器的操作應(yīng)盡量減少。
本文使用的STM32F103RB的芯片,輸出通道是TIM2_CH2通道,STM32有較強(qiáng)的可移植性,如果讀者的芯片類型跟我不一樣,可以做適當(dāng)?shù)男薷,完成自己的開發(fā)。
使用到的庫函數(shù)有:
stm32f10x.h:用以系統(tǒng)的初始化,無論做什么開發(fā),該庫必須包含
stm32f10x_tim.h:TIM定時器庫函數(shù)
stm32f10x_rcc.h:時鐘配置庫函數(shù)
stm32f10x_gpio.h:GPIO配置庫函數(shù)
由以上的庫函數(shù)可知,我們需要初始化的內(nèi)容有TIM2定時器,時鐘使能配置,GPIO的使能配置。
void RCC_Config(void);
void GPIO_Config(void);
void TIM_Config(void);
接下來就是編寫各個函數(shù)的函數(shù)體,在這些內(nèi)容里面,其實官方已經(jīng)給出了示例,我們按照官方給的函數(shù)庫進(jìn)行配置,然后修改一下官方的一些變量屬性即可。
RCC_Config函數(shù)體
void RCC_Config(void)
{
//使能GPIOA,TIM2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
}
GPIO_Config函數(shù)體
void GPIO_Config(void)
{
//GPIO的配置,官方庫有給出需要配置的一些參數(shù),如果忘記了,參照一下即可,我這里配置的是GPIOA_Pin_1
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
TIM_Config函數(shù)體
在配置函數(shù)體之前,先了解一下stm32的占空比以及頻率是如何計算的
①頻率:我們使用的APB1時鐘源是72MHz的,在此我們不做分頻,通過配置相關(guān)的參數(shù)來設(shè)置輸入頻率,計算方法:輸入頻率=APB1時鐘/(預(yù)分頻系數(shù)+1)=72000000Hz/360=200000Hz
②TIM_TImeBaseStructure.TIM_Period參數(shù)決定了輸出PWM波形的頻率,輸出PWM波形的頻率=定時器的輸入頻率/TIM_TImeBaseStructure.TIM_Period,本例程20000Hz/100=200Hz,即5ms一個周期
③配置占空比:占空比=配置占空比的值/ TIM_TImeBaseStructure.TIM_Period,以此計算來確定占空比,本案例的占空比為50/100=50%
④定時器使能
void TIM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TImeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//配置TIM2的時鐘輸出頻率,以及其它相關(guān)參數(shù)初始化
TIM_TImeBaseStructure.TIM_Prescaler=360-1;//設(shè)置PWM的頻率
TIM_TImeBaseStructure.TIM_CounterMode=0;
TIM_TImeBaseStructure.TIM_Period=100;
TIM_TimeBaseInit(TIM2,&TIM_TImeBaseStructure);
//設(shè)置PWM的輸出方式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
//配置占空比
TIM_OCInitStructure.TIM_Pulse=50;
TIM_OC2Init(TIM2,&TIM_OCInitStructure);
TIM_ForcedOC1Config(TIM2,TIM_ForcedAction_Active);
TIM_Cmd(TIM2,ENABLE);
TIM_CtrlPWMOutputs(TIM2,ENABLE);
}
由此,我們的整個PWM配置完成
Main函數(shù)
int main()
{
RCC_Config();
GPIO_Config();
TIM_Config();
while(1)
{
;
}
}
接下來,我們講解一下,在Keil里面看我們的GPIOA_Pin_1引腳的輸出頻率,波形
①配置調(diào)試工具
②打開調(diào)試,并設(shè)置并檢測GPIO的輸出引腳
③全速運(yùn)行,觀察示波器
掃碼關(guān)注我們
傳真:0755-82591176
郵箱:vicky@yingtexin.net
地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08