飛思卡爾那些事之PWM控制直流電機(jī)
1、直流電機(jī)。當(dāng)直流電機(jī)的接線端電壓不同時(shí),會(huì)出現(xiàn)正轉(zhuǎn)或反轉(zhuǎn)的狀態(tài)。如接線柱A和B,當(dāng)A為高電平,B為低電平時(shí),電機(jī)正轉(zhuǎn);當(dāng)A為低電平,B為高電平時(shí),電機(jī)反轉(zhuǎn)。在電機(jī)允許電壓范圍內(nèi),電壓越高,輸出功率越大,轉(zhuǎn)速越快,反之,輸出功率越小,轉(zhuǎn)速越慢。
2、HCS12的PWM輸出。通過PWM輸出,可以在標(biāo)準(zhǔn)的TTL電平中,輸出不同的電壓。以控制電機(jī)的轉(zhuǎn)速和轉(zhuǎn)動(dòng)方向。
3、33886。電機(jī)驅(qū)動(dòng)芯片,內(nèi)部集成半H橋??梢酝ㄟ^TTL電平控制V+電平輸出。最高頻達(dá)10KHz。電壓范圍為0到40V。最大電流為5A??梢怨ぷ髟?60到125攝氏度的環(huán)境下。
方案:
1、HCS12中的PWM模塊,通過硬件進(jìn)行PWM輸出。
2、HCS12中的ECT的比較輸出模塊,通過比較輸出進(jìn)行PWM的輸出。
鑒于PWM模塊為輸出PWM專用模塊,通過設(shè)置相應(yīng)寄存器即可實(shí)現(xiàn)PWM輸出,簡(jiǎn)單方便,而且精確。故選用PWM模塊進(jìn)行PWM輸出。
說明:
1、驅(qū)動(dòng)芯片為33886。
2、16位PWM控制。
3、周期為1MS即輸出1KHZ。
4、對(duì)齊方式為PWM左對(duì)齊方式。
5、輸出極性為起始高電平。
6、占空比為0%~100%,在這期間分為10個(gè)檔。通過按鍵進(jìn)行變換,每按下一個(gè)按鍵,占空比提高一檔。
7、通過級(jí)聯(lián)方式實(shí)現(xiàn)16位PWM輸出。
8、通過級(jí)聯(lián)方式實(shí)現(xiàn)16位PWM輸出。通道PWM01組成通道A;通道PWM23組成通道B;
9、時(shí)鐘源選擇。
BusBlock:8MHz。
PWM輸出頻率:1KHz。
預(yù)分頻:16分頻 500kHz
PWMPRCLK=0x66
分頻:50分頻 10K
ClockSX=ClockX/(2*PWMSCLX)
PWMSCLx=ClockX/ClockSX*2=500k/(10k*2)=25=0x19
通過兩次分頻可得通道時(shí)鐘周期為:100US即10HZ
通道A時(shí)鐘頻率選擇PWMPRCLK和PWMSCLA;
通道B時(shí)鐘頻率選擇PWMPRCLK和PWMSCLB;
周期計(jì)算公式:
左對(duì)齊方式:
輸出周期=通道時(shí)鐘周期*(PWMPERx+1)
PWMPERx=輸出周期/通道時(shí)鐘周期-1
=1MS/10US-1
=9=0X09
10、占空比設(shè)置:
左對(duì)齊起始輸出高電平:
占空比=[(PWMDTYx+1)/(PWMPERx+1)]*100%
PWMDTYx=占空比*(PWMPERx+1)/100%
00%:PWMDTYx=0x00
10%:PWMDTYx=0x01
20%:PWMDTYx=0x02
30%:PWMDTYx=0x03
40%:PWMDTYx=0x04
50%:PWMDTYx=0x05
60%:PWMDTYx=0x06
70%:PWMDTYx=0x07
80%:PWMDTYx=0x08
90%:PWMDTYx=0x09
99%:PWMDTYx=0x0A
CODE:
#include
#include
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
//===========================================================//
//PWM輸出,控制直流電機(jī)轉(zhuǎn)動(dòng)方向已經(jīng)轉(zhuǎn)速
//author: Yangtze
//time:2009/4/17/2:15:45
//===========================================================//
unsigned char Ton[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x08,} ;
unsigned int Tperiod=0x09;
void main(void)
{
PWME=0x00;
PWMPRCLK=0x66; //通道時(shí)鐘預(yù)分頻, 16分頻
PWMSCLA=0x19; //時(shí)鐘A分頻 , 50分頻
PWMSCLB=0x19; //時(shí)鐘B分頻 , 50分頻
PWMCLK=0x0F; //PCLK1選擇ClockSA,PCLK選擇ClockSB
PWMPOL=0x0F; //起始輸出高電平
PWMCAE=0x00; //PWM輸出左對(duì)齊
PWMCTL=0x3C; //通8道01級(jí)聯(lián),通道23級(jí)聯(lián)
PWMPER0=0x00; //級(jí)聯(lián)通道01的周期高字節(jié)
PWMPER1=0x09; //級(jí)聯(lián)通道01的周期低字節(jié)
PWMPER0=0x00; //級(jí)聯(lián)通道23的周期高字節(jié)
PWMPER3=0x09; //級(jí)聯(lián)通道23的周期低字節(jié)
PWMDTY0=0x00; //級(jí)聯(lián)通道01的占空比高字節(jié)
PWMDTY1=Ton[8]; //級(jí)聯(lián)通道01的占空比低字節(jié)
PWMDTY2=0x00; //級(jí)聯(lián)通道01的占空比高字節(jié)
PWMDTY3=Ton[0]; //級(jí)聯(lián)通道01的占空比低字節(jié)
PWME=0x0F;
for(;;);
}
//后記:
//以上程序中,因?yàn)檩敵鲱l率不是很高,故8位PWM輸出已經(jīng)夠用,上述程序設(shè)置通道級(jí)聯(lián)完全是多次一舉。
//在選擇級(jí)聯(lián)與否時(shí),一定要具體問題具體分析,不能想當(dāng)然的使用,否則又可能會(huì)造成資源浪費(fèi)。
//上述程序中,沒有對(duì)HCS12進(jìn)行PLL分頻,使得HCS12的BusClock很長(zhǎng),在一定程度上造成了資源浪費(fèi)。
//在最后運(yùn)行過程中,出現(xiàn)了一點(diǎn)小問題,就是,PWM輸出周期并補(bǔ)時(shí)計(jì)劃中的1MS,而是3.5MS。示波器應(yīng)該沒有問題,估計(jì)是在計(jì)算周期的過程中出錯(cuò),影響了結(jié)果輸出。
//朋友,如果和我一樣,對(duì)單片機(jī)感興趣的話,和我一塊檢查一下錯(cuò)誤的原因吧??纯凑l檢查到的原因時(shí)正確的。嘿嘿。
2、HCS12的PWM輸出。通過PWM輸出,可以在標(biāo)準(zhǔn)的TTL電平中,輸出不同的電壓。以控制電機(jī)的轉(zhuǎn)速和轉(zhuǎn)動(dòng)方向。
3、33886。電機(jī)驅(qū)動(dòng)芯片,內(nèi)部集成半H橋??梢酝ㄟ^TTL電平控制V+電平輸出。最高頻達(dá)10KHz。電壓范圍為0到40V。最大電流為5A??梢怨ぷ髟?60到125攝氏度的環(huán)境下。
方案:
1、HCS12中的PWM模塊,通過硬件進(jìn)行PWM輸出。
2、HCS12中的ECT的比較輸出模塊,通過比較輸出進(jìn)行PWM的輸出。
鑒于PWM模塊為輸出PWM專用模塊,通過設(shè)置相應(yīng)寄存器即可實(shí)現(xiàn)PWM輸出,簡(jiǎn)單方便,而且精確。故選用PWM模塊進(jìn)行PWM輸出。
說明:
1、驅(qū)動(dòng)芯片為33886。
2、16位PWM控制。
3、周期為1MS即輸出1KHZ。
4、對(duì)齊方式為PWM左對(duì)齊方式。
5、輸出極性為起始高電平。
6、占空比為0%~100%,在這期間分為10個(gè)檔。通過按鍵進(jìn)行變換,每按下一個(gè)按鍵,占空比提高一檔。
7、通過級(jí)聯(lián)方式實(shí)現(xiàn)16位PWM輸出。
8、通過級(jí)聯(lián)方式實(shí)現(xiàn)16位PWM輸出。通道PWM01組成通道A;通道PWM23組成通道B;
9、時(shí)鐘源選擇。
10、占空比設(shè)置:
CODE:
#include
#include
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
//===========================================================//
//PWM輸出,控制直流電機(jī)轉(zhuǎn)動(dòng)方向已經(jīng)轉(zhuǎn)速
//author: Yangtze
//time:2009/4/17/2:15:45
//===========================================================//
unsigned char Ton[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x08,} ;
unsigned int Tperiod=0x09;
void main(void)
{
}
評(píng)論