小時候玩的四驅車,給直流馬達接通電源就嗤嗤的跑出去了。電機種類眾多,就屬控制直流電機最簡單,只要對調正負極就能改變電機的轉向。另外,直流電機負載能力強,適合做越野車的驅動電機。為了做可調速的越野車,就有了這篇文章。
電源電壓輸出是固定的,電機的轉速也因此是固定的,為了調節電機的轉速,就得改變電源電壓的輸出(為嘛要改變電機轉速?舉個簡單的列子,雙電機驅動小車-一邊一個電機-如何實現轉向?讓兩邊輪胎上的速度不同即可)。how?用PWM調製的方法,把恆定的直流電源電壓調製成頻率一定寬度可變的脈衝電壓序列,從而可以改變平均輸出電壓的大小,以調節電機的轉速。電源電壓在此處就是51MCU的引腳輸出,4.5-5V,只要在引腳上產生頻率可調的波形即可。假設在一個周期內,就10ms吧,前5ms引腳輸出高電平,後5ms引腳輸出低電平,周而復始,引腳上輸出50%佔空比的穩定方波;再改改,前2ms輸出高電平,後8ms輸出低電平,引腳上輸出20%佔空比的穩定方波。
本文引用地址:http://www.eepw.com.cn/article/201611/318305.htmMCU產生周期性事件很簡單,用定時器定時產生中斷即可。一般差不多一下形式:
void Isr01() interrupt 1{static unsigned int cnt;cnt++;if(cnt==40){cnt=0;}}假設每250us產生一次中斷,以上中斷函數統計40次中斷,即10ms。
為了完成"可改變佔空比的方波"這個命題,來試試給這個函數增加一些統計事件,在一個統計事件中做一些事,另一個統計事件中做其他的事。unsigned int condition=20;void Isr01() interrupt 1{static unsigned int cnt;cnt++;//一個周期if(cnt==40){cnt=0;}//事件1if(cntcondition就是新增加的統計事件,前半個周期為一個事件,後半個周期為另一個事件。這裡,當cnt小於5ms,輸出高電平,當cnt大於輸出低電平,合在一起生成一個50%佔空比的方波。 unsigned int condition=20;void Isr01() interrupt 1{static unsigned int cnt;cnt++;//一個周期if(cnt==40){cnt=0;}if(cnt為了改變佔空比,只要在ISR外修改condition即可,貼出最終的代碼: #include#include sbit P2_0 = P2^0; sbit P2_1 = P2^1;#define MakeByte(target, Hi,Lo) \ do{ \ target |= (((Hi)<<4)|(Lo)); \ }while(0); \ #define SetTH(n,val) \ do{ \ TH##n = val; \ }while(0); \ #define SetTL(n,val) \ do{ \ TL##n = val; \ }while(0); \ #define EnableET(n) \ do{ \ ET##n = 0x01; \ IE |= 0x80; \ }while(0); \ enum KEYSTAT{KEYDOWN=0,KEYUP,};unsigned char iterator = 0x00;void DelayMs(unsigned int ms){int i=0,j=0;for(;i 在主函數中,通過判斷按下鍵來改變condition。
結尾部分,貼上仿真圖和仿真結果:1)佔空比100%:
2)差不多55%佔空比:
3)0%的佔空比,電機休息了: