做STM32智能小車(chē)的實(shí)驗(yàn)中會(huì)用到定時(shí)器PWM輸出,來(lái)改變直流電機(jī)的轉(zhuǎn)速。分享本文了解如何通過(guò)PWM實(shí)現(xiàn)對(duì)電機(jī)速度的控制。
PWM控制電機(jī)速度的基本原理
PWM(Pulse Width Modulation),也就是脈沖寬度調(diào)制。
PWM中有一個(gè)比較重要的概念,占空比:是一個(gè)脈沖周期內(nèi)有效電平在整個(gè)周期所占的比例。
為了實(shí)現(xiàn)IO口上電壓的持續(xù)性變化,可以調(diào)節(jié)PWM的占空比。這也能夠使外設(shè)的功率進(jìn)行持續(xù)性變化,最終控制直流電機(jī)轉(zhuǎn)速的快慢。如何調(diào)節(jié)PWM波形的輸出就是重點(diǎn)。相關(guān)推薦:STM32中PWM的配置與應(yīng)用詳解。
上圖中的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è)寄存器的值了。
STM32定時(shí)器中斷
為了便于理解接下來(lái)關(guān)于PWM應(yīng)用的內(nèi)容,先插一段定時(shí)器中斷的知識(shí)。
產(chǎn)生定時(shí)中斷是定時(shí)器的用法之一,與定時(shí)器用來(lái)進(jìn)行PWM輸出和輸入捕獲相比,定時(shí)器中斷更容易理解、掌握。
原理簡(jiǎn)介
使用通用定時(shí)器進(jìn)行中斷的原理,其實(shí)和開(kāi)發(fā)板Systick定時(shí)器進(jìn)行中斷延時(shí)很相似(Stm32入門(mén)——Systick定時(shí)器),即:用psc(預(yù)分頻系數(shù))設(shè)置好定時(shí)器時(shí)鐘后,arr(預(yù)裝載值)在每個(gè)時(shí)鐘周期內(nèi)減1,當(dāng)arr減為0時(shí)觸發(fā)中斷然后進(jìn)入中斷處理程序進(jìn)行中斷處理。以下代碼為例:
void TIM3_Int_Init(u16 arr,u16 psc){ RCC->APB1ENR|=1<<1; //TIM3時(shí)鐘使能 TIM3->ARR=arr; //設(shè)定計(jì)數(shù)器自動(dòng)重裝值 TIM3->PSC=psc; //預(yù)分頻器設(shè)置 TIM3->DIER|=1<<0; //允許更新中斷 TIM3->CR1|=0x01; //使能定時(shí)器3 MY_NVIC_Init(1,3,TIM3_IRQn,2);//搶占1,子優(yōu)先級(jí)3,組2 }
RCC->APB1ENR|=1<<1
解釋一下上面這行代碼,由于定時(shí)器3(TIM3)是掛在APB1上的外設(shè),所以要打開(kāi)APB1,這里的預(yù)分頻器值psc是來(lái)設(shè)置TIM3的時(shí)鐘頻率的,如果系統(tǒng)時(shí)鐘(SYSTICK)頻率為72MHz、psc為7199,則TIM3的時(shí)鐘頻率就為:
72MHz/(7199+1)Hz = 10KHz //這里的“+1”是手冊(cè)中規(guī)定的。
10KHz是什 么意思呢?就是一秒鐘會(huì)產(chǎn)生10K個(gè)周期,那么一個(gè)周期的時(shí)間長(zhǎng)度就是1/10KHz,如果你想將定時(shí)器中斷的時(shí)間間隔設(shè)置為0.5秒,那么你將arr設(shè)置為5000即可,因?yàn)閍rr每減1就需要一個(gè)周期的時(shí)間,減5000次就經(jīng)過(guò)了5000*(1/10KHz)=0.5秒。
TIM3->DIER|=1<<0
再解釋下上面這一行,設(shè)置允許更新中斷,即arr減到0以后可以觸發(fā)更新中斷,還有其他類(lèi)型的中斷。
MY_NVIC_Init(1,3,TIM3_IRQn,2);//搶占1,子優(yōu)先級(jí)3,組2
看上面這行代碼,中斷優(yōu)先級(jí)有搶占優(yōu)先級(jí)和響應(yīng)(即子優(yōu)先級(jí))優(yōu)先級(jí)兩種,搶占優(yōu)先級(jí)即:若程序1正在使用CPU,這時(shí)如果程序2要求使用CPU,并且程序2的搶占優(yōu)先級(jí)高,則CPU被程序2搶占;若兩者搶占優(yōu)先級(jí)相同,則就算程序2的響應(yīng)優(yōu)先級(jí)高于程序1,CPU也不能被搶占;若程序1正在使用CPU,程序2和程序3的搶占優(yōu)先級(jí)等于或低于程序1,且程序2的響應(yīng)優(yōu)先級(jí)高于程序三,則待CPU空出后,程序2先運(yùn)行,程序3最后運(yùn)行。TIM3_IRQn是指定將要運(yùn)行的中斷處理程序號(hào)?!敖M2”是設(shè)置中斷優(yōu)先級(jí)分組的,這是因?yàn)榧拇嫫魈峁┝怂奈粊?lái)設(shè)置優(yōu)先級(jí),組2代表的是前兩位給搶占優(yōu)先級(jí),后兩位給響應(yīng)優(yōu)先級(jí)。
PWM模式、有效電平
前面介紹完中斷,再說(shuō)一下PWM工作原理。相關(guān)文章:淺析PWM控制電機(jī)轉(zhuǎn)速的原理。
假設(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í)輸出為“有效”電平。
這里說(shuō)的是“有效”和“無(wú)效”,而不是“高”和“低”,也就是說(shuō)有效電平可高可低,并非一定就是高電平。PWM模式、效電平極性,需要程序員自己配置相關(guān)的寄存器來(lái)實(shí)現(xiàn)。通過(guò)下面的代碼來(lái)講解。
TIM1_PWM_Init(899,0);//不分頻。PWM頻率=72000/(899+1)=80Khz
上一小節(jié)講過(guò)關(guān)于定時(shí)器參數(shù)的設(shè)置。使用定時(shí)器1的通道1來(lái)輸出一路PWM波,這里的899設(shè)置的就是ARR的值,至于那個(gè)0是用來(lái)設(shè)置TIM1的頻率的,不分頻就代表TIM1的時(shí)鐘頻率和系統(tǒng)時(shí)鐘相同,這里假設(shè)為72MHz。
void TIM1_PWM_Init(u16 arr,u16 psc){ //此部分需手動(dòng)修改IO口設(shè)置 RCC->APB2ENR|=1<<11; //TIM1時(shí)鐘使能 GPIOA->CRH&=0XFFFFFFF0; //PA8清除之前的設(shè)置 GPIOA->CRH|=0X0000000B; //復(fù)用功能輸出 TIM1->ARR=arr; //設(shè)定計(jì)數(shù)器自動(dòng)重裝值 TIM1->PSC=psc; //預(yù)分頻器設(shè)置 TIM1->CCMR1|=7<<4; //CH1 PWM2模式 TIM1->CCMR1|=1<<3; //CH1預(yù)裝載使能 TIM1->CCER|=0<<1; //OC1 輸出使能 //TIM1->CCER|=1<<1; TIM1->BDTR|=1<<15; //MOE 主輸出使能 TIM1->CR1=0x0080; //ARPE使能 TIM1->CR1|=0x01; //使能定時(shí)器1 }
下文具體分析上面的代碼。
前面4-6行是用來(lái)配置GPIO口的。
TIM1->ARR=arr; //設(shè)定計(jì)數(shù)器自動(dòng)重裝值TIM1->PSC=psc; //預(yù)分頻器設(shè)置
這兩行就是我上門(mén)提到的設(shè)置定時(shí)器的頻率和重裝載值。
TIM1->CCMR1|=7<<4; //CH1 PWM2模式TIM1->CCMR1|=1<<3; //CH1預(yù)裝載使能TIM1->CCER|=0<<1; //OC1 輸出使能
這三行是用來(lái)設(shè)置PWM輸出模式和設(shè)置通道的,通道是什么呢?簡(jiǎn)單地講就是輸出PWM波的GPIO口,代碼一開(kāi)始不是設(shè)置了PA8這個(gè)GPIO口嘛,這個(gè)PA8就是通道1。使用通道的話(huà)要先進(jìn)行輸入輸出方向、通道使能的設(shè)置。
TIM1->CCER|=1<<1;
這行代碼是用來(lái)設(shè)置“有效電平”極性的,根據(jù)手冊(cè),當(dāng)TIM1->CCER[1]這位置1時(shí),有效電平為低電平,置0時(shí)有效電平為高電平,而默認(rèn)情況下置0。
TIM1->BDTR|=1<<15; //MOE 主輸出使能
這行代碼只要對(duì)高級(jí)定時(shí)器進(jìn)行設(shè)置,普通定時(shí)器無(wú)需設(shè)置。
TIM1->CR1=0x0080; //ARPE使能
這行代碼是用來(lái)使能ARPE,ARPE是什么呢,就是當(dāng)它被置1時(shí),你自己設(shè)置的CCRx會(huì)立即生效,如果它被置為0,那么你自己設(shè)置的CCRx值不會(huì)立即生效(可能之前ARPE已經(jīng)有值了),而是當(dāng)之前設(shè)置的CCRx生效后才會(huì)使用你最新設(shè)置的CCRx值。
上面的代碼里沒(méi)有對(duì)CCRx進(jìn)行設(shè)置,這是因?yàn)镃CRx常常是一個(gè)變化的值,你可以在主函數(shù)中用一個(gè)for循環(huán)+if判斷語(yǔ)句對(duì)它進(jìn)行++或–的操作,從而達(dá)到連續(xù)改變CCRx值得目的,例如:
for(i=0;i<300;i++){ TIM1->CCR1=i;if(i==300){ i=0; }}
PWM波的周期是由定時(shí)器時(shí)鐘頻率和預(yù)裝載值兩者決定的,預(yù)裝載值就是ARR。
預(yù)裝載值PSC設(shè)置為899,那么,當(dāng)定時(shí)器的當(dāng)前值val從0增加到899時(shí),一共經(jīng)過(guò)了900個(gè)時(shí)鐘周期,這900個(gè)時(shí)鐘周期會(huì)產(chǎn)生一個(gè)PWM波形,也就是說(shuō)900個(gè)定時(shí)器時(shí)鐘周期才相當(dāng)于一個(gè)PWM周期,那么PWM的頻率就為72MHz/900=80KHz,周期為1/80KHz。
審核編輯 :李倩
-
直流電機(jī)
+關(guān)注
關(guān)注
36文章
1710瀏覽量
70289 -
PWM
+關(guān)注
關(guān)注
114文章
5196瀏覽量
214370 -
電機(jī)
+關(guān)注
關(guān)注
142文章
9053瀏覽量
145924
原文標(biāo)題:STM32通過(guò)PWM控制電機(jī)速度
文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論