1、pwm實(shí)現(xiàn)調(diào)速的原理與介紹
PWM(Pulse Width Modulation)脈沖寬度調(diào)制。 1)占空比pwm占空比就是一個(gè)脈沖周期內(nèi)有效電平在整個(gè)周期所占的比例。 通過(guò)調(diào)節(jié)PWM的占空比就能調(diào)節(jié)IO口上電壓的持續(xù)性變化,因此也能夠控制外設(shè)的功率進(jìn)行持續(xù)性變化,也就能控制直流電機(jī)的轉(zhuǎn)速快慢。 那么重點(diǎn)就在于如何調(diào)節(jié)PWM波形的輸出。如下圖所示  圖中的ARR是我們給定時(shí)器的一個(gè)預(yù)裝載值,CCRx的上下變化是產(chǎn)生PWM波的關(guān)鍵。我們假設(shè)ARR大于CCRx的部分輸出為高電平(即t1-t2、t3-t4、t5-t6),ARR小于CCRx的部分輸出為低電平(即0-t1、t2-t3、t4-t5),則改變CCRx的值就能改變輸出PWM的占空比。 只要弄明白了上面那幅圖,那就不難理解想要控制PWM的輸出波形,重要的就是如何設(shè)置ARR與CCRx這兩個(gè)寄存器的值了。(此處如何設(shè)置寄存器的值我代碼里會(huì)注釋得非常清楚,可以先看看原理) 前面我們假設(shè)ARR大于CCRx時(shí)輸出為高電平,ARR小于CCRx時(shí)輸出為低電平,但在實(shí)際運(yùn)用中可能并非如此,有可能是相反的情況——ARR大于CCRx時(shí)輸出為低電平,ARR小于CCRx時(shí)輸出為高電平,至于到底是哪種情況,還要看PWM是哪種模式、有效電平又設(shè)置的是何種極性了。 模式1:ARR小于CCRx時(shí)輸出為“有效”電平,ARR大于CCRx時(shí)輸出為“無(wú)效”電平。 模式2:ARR小于CCRx時(shí)輸出為“無(wú)效”電平,ARR大于CCRx時(shí)輸出為“有效”電平。
注意,我這里用的是“有效”和“無(wú)效”,而不是“高”和“低”,也就是說(shuō)有效電平可高可低,并非一定就是高電平。PWM模式、效電平極性,需要程序員自己配置相關(guān)的寄存器來(lái)實(shí)現(xiàn)。 2)配置模式● 向上計(jì)數(shù)配置 當(dāng)TIM1_CR1寄存器中的DIR位為低的時(shí)候執(zhí)行向上計(jì)數(shù)。 下面是一個(gè)PWM模式1的例子。當(dāng)TIM1_CNT<TIM1_CCRi時(shí),PWM參考信號(hào)OCiREF為高,否則為低。如果TIM1_CCRi中的比較值大于自動(dòng)重裝載值(TIM1_ARR),則OCiREF保持為’1’。如果比較值為0,則OCiREF保持為’0’。下圖為T(mén)IM1_ARR=8時(shí)邊沿對(duì)齊的PWM波形實(shí)例。  ● 向下計(jì)數(shù)的配置 當(dāng)TIM1_CR1寄存器的DIR位為高時(shí)執(zhí)行向下計(jì)數(shù)。 在PWM模式1時(shí),當(dāng)TIM1_CNT>TIM1_CCRi時(shí)參考信號(hào)OCiREF為低,否則為高。如果TIM1_CCRi中的比較值大于TIM1_ARR中的自動(dòng)重裝載值,則OCiREF保持為’1’。該模式下不能產(chǎn)生0%的PWM波形。 需要stm8寄存器參考手冊(cè)的可以去csdn下載或者評(píng)論一下 2、pwm信號(hào)配置流程(此處以stm8配置TIM1為例) 1)設(shè)置自動(dòng)重裝載數(shù)值既TIM1_ARR寄存器ARR[15:0]   2)設(shè)置捕獲比較數(shù)值既TIM1_CCRx寄存器CCRi[15:0]   3)設(shè)置pwm輸出模式及對(duì)齊方式既TIM1_CCMRx寄存器OCiM[1:0]和TIM1_CR1寄存器CMS[1:0]位   4)配置信號(hào)輸出極性并使能輸出既TIM1_CCERx寄存器CCiP和CCiE  5)使能計(jì)數(shù)器打開(kāi)總開(kāi)關(guān)既TIM1_CR1寄存器CEN位和TIM1_BKR寄存器MOE位(TIM3沒(méi)有MOE位)   需要stm8寄存器參考手冊(cè)的可以去csdn下載或者評(píng)論一下 3、pwm調(diào)速代碼(此處以stm8配置TIM3位例子) /****************************************************************///TIM3輸出比較功能初始化函數(shù)TIM3_init(),有形參F_PWM_SET,無(wú)返回值//Duty_CH1為通道一PD2的占空比//Duty_CH2為通道二PD0的占空比//F_PWM_SET為自動(dòng)重裝載寄存器數(shù)值/****************************************************************/void Motor_SpeedSet(unsigned long F_PWM_SET,float Duty_CH1,float Duty_CH2){
//配置自動(dòng)重裝載寄存器
TIM3_ARRH=F_PWM_SET/256;//配置自動(dòng)重裝載寄存器高位“ARRH”
TIM3_ARRL=F_PWM_SET%256;//配置自動(dòng)重裝載寄存器低位“ARRL”
TIM3_CH1_PWM_SET(F_PWM_SET,Duty_CH1);
TIM3_CH2_PWM_SET(F_PWM_SET,Duty_CH2);
TIM3_CR1|=0x01;//使能TIM1計(jì)數(shù)器功能“CEN=1”}//Duty_CH1為占空比//F_SET_CH1為輸出比較的數(shù)值//TIM3_CH1為PD2void TIM3_CH1_PWM_SET(unsigned long F_PWM_SET,float Duty_CH1){
// F_SET_CH1 = 16000; //TIM1輸出比較功能初始化配置
// printf('start\n');
float CompareNum; //變量為比較值,用于配置比較寄存器
CompareNum=Duty_CH1*F_PWM_SET; //利用占空比和預(yù)裝載數(shù)值來(lái)反求比較寄存器所需要設(shè)定的值
/*
//配置自動(dòng)重裝載寄存器
TIM3_ARRH=F_PWM_SET/256;
TIM3_ARRL=F_PWM_SET%256;
*/
//配置比較計(jì)數(shù)器
TIM3_CCR1H=((u16)(CompareNum))/256;//配置捕獲/比較寄存器1高位“CCR1H”
TIM3_CCR1L=((u16)(CompareNum))%256;//配置捕獲/比較寄存器1低位“CCR1L”
//printf('計(jì)數(shù)器配置完成...\n');
//配置向上計(jì)數(shù)模式邊沿對(duì)齊,不用設(shè)置,默認(rèn)向上計(jì)數(shù)
//TIM1_CR1&=0x8F;
//配置為PWM模式1,OC1M[2:0]=110,需要注意這里只是設(shè)置了有效電平,但是并沒(méi)有說(shuō)有效電平是高電平還是低電平
//PWM模 - 在 計(jì)數(shù) 式1 向上無(wú)效電平;在向下計(jì)數(shù)時(shí),一旦TIMx_CNT>則為有效電平(OC1REF=1)。
//CC1通道被配置為輸出,CC1S[1:0]=00
TIM3_CCMR1=0x60;
//配置CC1P=0,OC1信號(hào)有效電平為高電平
//也就是比TIM3_CCR小時(shí)輸出高電平,比TIM3_CCR大時(shí)輸出低電平
TIM3_CCER1&=0xFD;
//配置CC1E=1,OC1信號(hào)輸出到對(duì)應(yīng)的輸出引腳
TIM3_CCER1|=0x01;
//空閑狀態(tài)時(shí)OC1為高電平,不需要設(shè)置
//TIM1_OISR|=0x01;
//TIM3_CR1|=0x01;//使能TIM1計(jì)數(shù)器功能“CEN=1”}//Duty_CH1為占空比//F_SET_CH1為輸出比較的數(shù)值//TIM3_CH1為PD0void TIM3_CH2_PWM_SET(unsigned long F_PWM_SET,float Duty_CH2){
// F_SET_CH1 = 16000; //TIM1輸出比較功能初始化配置
// printf('start\n');
float CompareNum; //變量為比較值,用于配置比較寄存器
CompareNum=Duty_CH2*F_PWM_SET; //利用占空比和預(yù)裝載數(shù)值來(lái)反求比較寄存器所需要設(shè)定的值
/*
//配置自動(dòng)重裝載寄存器
TIM3_ARRH=F_PWM_SET/256;
TIM3_ARRL=F_PWM_SET%256;
*/
//配置比較計(jì)數(shù)器
TIM3_CCR2H=((u16)(CompareNum))/256;//配置捕獲/比較寄存器1高位“CCR1H”
TIM3_CCR2L=((u16)(CompareNum))%256;//配置捕獲/比較寄存器1低位“CCR1L”
//配置為PWM模式1,OC1M[2:0]=110,需要注意這里只是設(shè)置了有效電平,但是并沒(méi)有說(shuō)有效電平是高電平還是低電平
//PWM模 - 在 計(jì)數(shù) 式1 向上無(wú)效電平;在向下計(jì)數(shù)時(shí),一旦TIMx_CNT>則為有效電平(OC1REF=1)。
//CC1通道被配置為輸出,CC1S[1:0]=00
TIM3_CCMR2=0x60;
//配置CC2P=0,OC2信號(hào)有效電平為高電平
//也就是比TIM3_CCR小時(shí)輸出高電平,比TIM3_CCR大時(shí)輸出低電平
TIM3_CCER1&=0xDF;
//配置CC2E=1,OC2信號(hào)輸出到對(duì)應(yīng)的輸出引腳
TIM3_CCER1|=0x10;
//TIM3_CR1|=0x01;//使能TIM1計(jì)數(shù)器功能“CEN=1”}//將pwm信號(hào)接到l298n的使能端就可以了
printf('現(xiàn)在開(kāi)始測(cè)試PWM信號(hào)產(chǎn)生...\n');
case '1':
Motor_SpeedSet(20000,0.2,0.2); //一檔速
break;
case '2':
Motor_SpeedSet(20000,0.4,0.4); //二檔速
break;
Motor_SpeedSet(60000,0.8,0.8); //可以配置不同當(dāng)?shù)乃俣?,只要你想?00檔速的小車(chē)都可以
printf('信號(hào)已產(chǎn)生...\n'); 4、為什么pwm可以調(diào)速這里參考一篇文章—“STM32 PWM輸出原理和直流電機(jī)PWM驅(qū)動(dòng)原理詳解及例程”,在最下面的參考鏈接可以查看,這位博主寫(xiě)得非常好,這里我提取一些關(guān)鍵原理。  意思就是說(shuō)當(dāng)燈熄滅了的一瞬間,其實(shí)你還感覺(jué)他是亮著的,當(dāng)燈不停的發(fā)亮再熄滅,只要中間間隔的時(shí)間極其短,我們看上去就像是它一直在亮著的一樣。
那么這個(gè)時(shí)候思考一下,有兩個(gè)燈,供電電壓相同,在一段固定的時(shí)間內(nèi),A燈在不停地閃爍,頻率及其之快以至于人眼無(wú)法分別,其中有50%的時(shí)間亮著,50%熄滅,B燈一直亮著。那么這樣觀察上去就會(huì)明顯地感覺(jué)到A燈比B燈暗很多。那么這就是一種控制小燈亮度的辦法了。 當(dāng)然你也可以理解為在相同的功率下,AB兩個(gè)燈都是在做把電能轉(zhuǎn)化為光能的工作,在一天里A燈斷斷續(xù)續(xù)地工作了12小時(shí),B燈連續(xù)不停工作了24小時(shí)。那么誰(shuí)轉(zhuǎn)化的光能更多就顯而易見(jiàn)了,誰(shuí)更亮也就不言而喻了  這個(gè)時(shí)候只要能在極短時(shí)間內(nèi)控制燈的亮與滅就可以控制亮度了。 在上圖中AB兩個(gè)燈的供電端電壓可以看成下圖這樣  并不是!電機(jī)的線圈呢,你懂的哈,像電感類(lèi)似的結(jié)構(gòu),它具有電流的不可突變性,這個(gè)性質(zhì)呢也就是像高中老師說(shuō)的,電感線圈,通直流阻交流,它內(nèi)部產(chǎn)生的磁場(chǎng)不允許電流的突變,他會(huì)將電流產(chǎn)生的磁場(chǎng)用來(lái)抑制電流的變化。 所以說(shuō)用PWM控制電機(jī)的話,不講驅(qū)動(dòng)電路板原理的話,可以簡(jiǎn)化理解為這樣:用芯片生成的PWM去使電機(jī)兩端的電源圖像變得像PWM信號(hào)一樣。至于他是怎么變得我們下回分解。 意思就是說(shuō)如果用PWM控制電機(jī),那么電機(jī)兩端的電壓是010101這么突變的,但是電機(jī)電流卻不是,即使電壓為0,因線圈自感電動(dòng)勢(shì)的存在,電機(jī)中依舊有電流流過(guò),電機(jī)依舊繼續(xù)轉(zhuǎn)動(dòng),那么我們使用PWM 為什么可以控制轉(zhuǎn)速呢? 你也許會(huì)想到高中物理老師說(shuō)的一個(gè)詞語(yǔ):等效電壓。 我們通過(guò)PWM去控制等效電壓。這樣你就能理解了。 你也可以根據(jù)能量守恒來(lái)想啊,電機(jī)轉(zhuǎn)起來(lái)過(guò)后,線圈電阻恒定不變,功率恒定不變,兩端電壓峰值也恒定不變,那么這樣情況下,電源電壓圖形上占空比的不同將導(dǎo)電機(jī)在這段時(shí)間內(nèi)致消耗能量的不同,以此達(dá)到轉(zhuǎn)化的機(jī)械能的不同,轉(zhuǎn)速是不是也不同了。這樣是不是很好理解了。 大概截取就帶這里,如果想看全部的介紹,可以點(diǎn)擊一下文章底部的參考鏈接。 參考鏈接: STM32 PWM輸出原理和直流電機(jī)PWM驅(qū)動(dòng)原理詳解及例程
|