|
發(fā)布時間: 2021-1-8 10:40
正文摘要:想用單片機驅(qū)動電調(diào)控制推進器轉(zhuǎn)動,用的電調(diào)不需要設(shè)置行程,但需要進行中位啟動電調(diào)的頻率是50HZ,那周期就是確定的0.02s即20000us吧,中位啟動是指設(shè)置PWM波高電平時間為1500us嗎? 以下為源程 ... |
glinfei 發(fā)表于 2021-1-8 16:22 這個最大最小油門就是最大最小行程吧?老板給的說明說不需要,只需要設(shè)置中間啟動 |
|
首先是:計時時間太短,你的寫法誤差太大,應(yīng)使用自動重裝模式,中斷中只有一句:time++;并將判斷放到主程序,它到1000自然是一個周期嘛。如果能提高主頻就更好了。 其次是:電調(diào)不是你這么用的啊,電調(diào)驅(qū)動電機轉(zhuǎn)動需要兩個步驟:1先給電調(diào)最大油門,你會聽到“嗶嗶”;2“嗶嗶”后你再給電調(diào)最小油門,會聽到”嗶嗶畢“,然后是一聲較長的”畢“;3這時電調(diào)就準(zhǔn)備好了,給一個1~2ms范圍內(nèi)的油門就可以轉(zhuǎn)動了。你的程序都沒干這些事,轉(zhuǎn)不了啊。 |
|
很多小白不明白PWM怎么回事。只能說明你們看的教程沒講。我們?nèi)巳藢W(xué)會單片機教程就講過。其實很簡單的。特分享CPU定時器模擬PWM輸出給你們 #include "STC89.H" //頭文件包含 #include <intrins.h> //頭文件包含 typedef unsigned char u8; //重新定義數(shù)據(jù)類型名 typedef unsigned short u16; //重新定義數(shù)據(jù)類型名 typedef unsigned long u32; //重新定義數(shù)據(jù)類型名 sbit PWM_OUT=P2^1; u8 idata PWM_Write_Byte[3]=0; //****************************祁緒電子 2020年5月*** // 定時器0初始化 晶振11059200,12T,輸出50Hz的PWM,占空比0~255 // 定時器初值為:256-(11059200÷12÷50Hz÷256) = 184 = 0xB8 void PWM_Init(void) { TMOD &= 0xF0; //配置定時器工作模式 TMOD |= 0x02; //配置定時器工作模式 8位自動重裝模式 TL0 = 0xB8;; //定時器初值 TH0 = 0xB8; //定時器重裝初值 TR0 = 1; //啟動定時器0 ET0=1; //允許定時器0申請中斷 EA=1; //中斷總閘閉合 } //****************************祁緒電子 2020年5月*** //定時器0的CPU處理函數(shù),位置任意寫都行 void PWM_Display_timer0() interrupt 1 { static u8 pwm_t=0; //局部變量,不丟失數(shù)據(jù) if(pwm_t<PWM_Write_Byte[0]) { PWM_OUT=1; } else PWM_OUT=0; pwm_t++; } //***************************祁緒電子 2020年5月*** // PWM 數(shù)模變換數(shù)據(jù)分配 void PWM_Allot() { static u8 kkk=0; static u8 count=0; count++; if(count>100) { count=0; kkk++; PWM_Write_Byte[0]=kkk; //kkk為占空比自動增加 PWM_Write_Byte[1]=10; PWM_Write_Byte[2]=10; } } void main() //主函數(shù) { PWM_Init(); while(1) //主函數(shù)大循環(huán) { PWM_Allot(); } } |
Powered by 單片機教程網(wǎng)