新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機PWM控制電機

        51單片機PWM控制電機

        作者: 時間:2016-11-19 來源:網絡 收藏
        小時候玩的四驅車,給直流馬達接通電源就嗤嗤的跑出去了。電機種類眾多,就屬控制直流電機最簡單,只要對調正負極就能改變電機的轉向。另外,直流電機負載能力強,適合做越野車的驅動電機。為了做可調速的越野車,就有了這篇文章。

        電源電壓輸出是固定的,電機的轉速也因此是固定的,為了調節電機的轉速,就得改變電源電壓的輸出(為嘛要改變電機轉速?舉個簡單的列子,雙電機驅動小車-一邊一個電機-如何實現轉向?讓兩邊輪胎上的速度不同即可)。how?用PWM調制的方法,把恒定的直流電源電壓調制成頻率一定寬度可變的脈沖電壓序列,從而可以改變平均輸出電壓的大小,以調節電機的轉速。電源電壓在此處就是51MCU的引腳輸出,4.5-5V,只要在引腳上產生頻率可調的波形即可。假設在一個周期內,就10ms吧,前5ms引腳輸出高電平,后5ms引腳輸出低電平,周而復始,引腳上輸出50%占空比的穩定方波;再改改,前2ms輸出高電平,后8ms輸出低電平,引腳上輸出20%占空比的穩定方波。

        本文引用地址:http://www.104case.com/article/201611/318305.htm

        MCU產生周期性事件很簡單,用定時器定時產生中斷即可。一般差不多一下形式:

        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%的占空比,電機休息了:



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 丰顺县| 龙口市| 兰考县| 华容县| 富顺县| 贵港市| 广灵县| 云龙县| 当雄县| 新巴尔虎左旗| 浦城县| 凭祥市| 罗甸县| 广西| 玉门市| 阿拉尔市| 依兰县| 东丰县| 佛学| 渝北区| 宁乡县| 盐城市| 克东县| 双柏县| 开江县| 宜春市| 绥化市| 江油市| 穆棱市| 自贡市| 普陀区| 湟源县| 芮城县| 军事| 赫章县| 台南县| 神池县| 廊坊市| 全椒县| 萍乡市| 遂川县|