對于電機的轉速調整,我們是采用脈寬調制(PWM)辦法,控制電機的時候,電源并非連續地向電機供電,而是在一個特定的頻率下以方波脈沖的形式提供電能。不同占空比的方波信號能對電機起到調速作用,這是因為電機實際上是一個大電感,它有阻礙輸入電流和電壓突變的能力,因此脈沖輸入信號被平均分配到作用時間上,這樣,改變在始能端PE2 和PD5 上輸入方波的占空比就能改變加在電機兩端的電壓大小,從而改變了轉速。
此電路中用微處理機來實現脈寬調制,通常的方法有兩種:
(1)用軟件方式來實現,即通過執行軟件延時循環程序交替改變端口某個二進制位輸出邏輯狀態來產生脈寬調制信號,設置不同的延時時間得到不同的占空比。
(2)硬件實驗自動產生PWM 信號,不占用CPU 處理的時間。這就要用到ATMEGA8515L 的在PWM 模式下的計數器1,具體內容可參考相關書籍。
51單片機PWM程序經典
產生兩個PWM,要求兩個PWM波形占空都為80/256,兩個波形之間要錯開,不能同時為高電平!高電平之間相差48/256,PWM這個功能在PIC單片機上就有,但是如果你就要用51單片機的話,也是可以的,但是比較的麻煩。
可以用定時器T0來控制頻率,定時器T1來控制占空比:大致的的編程思路是這樣的:T0定時器中斷是讓一個I0口輸出高電平,在這個定時器T0的中斷當中起動定時器T1,而這個T1是讓IO口輸出低電平,這樣改變定時器T0的初值就可以改變頻率,改變定時器T1的初值就可以改變占空比。
*程序思路說明: *
* *
*關于頻率和占空比的確定,對于12M晶振,假定PWM輸出頻率為1KHZ,這樣定時中斷次數 *
*設定為C=10,即0.01MS中斷一次,則TH0=FF,TL0=F6;由于設定中斷時間為0.01ms,這樣*
*可以設定占空比可從1-100變化。即0.01ms*100=1ms *
******************************************************************************/ #include 《REGX51.H》
#define uchar unsigned char
/*****************************************************************************
* TH0和TL0是計數器0的高8位和低8位計數器,計算辦法:TL0=(65536-C)%256; *
* TH0=(65536-C)/256,其中C為所要計數的次數即多長時間產生一次中斷;TMOD是計數器* * 工作模式選擇,0X01表示選用模式1,它有16位計數器,最大計數脈沖為65536,最長時 *
* 間為1ms*65536=65.536ms *
******************************************************************************/ #define V_TH0 0XFF #define V_TL0 0XF6 #define V_TMOD 0X01
void init_sys(void); /*系統初始化函數*/ void Delay5Ms(void);
unsigned char ZKB1,ZKB2;
void main (void)
{
init_sys();
ZKB1=40; /*占空比初始值設定*/ ZKB2=70; /*占空比初始值設定*/ while(1)
{
if (!P1_1) //如果按了+鍵,增加占空比
{
Delay5Ms(); if (!P1_1)
{
ZKB1++;
ZKB2=100-ZKB1;
}
}
if (!P1_2) //如果按了-鍵,減少占空比
{
Delay5Ms(); if (!P1_2)
{
ZKB1--;
ZKB2=100-ZKB1;
}
}
/*對占空比值限定范圍*/ if (ZKB1》99) ZKB1=1; if (ZKB1《1) ZKB1=99;
}
}
/******************************************************
*函數功能:對系統進行初始化,包括定時器初始化和變量初始化*/ void init_sys(void) /*系統初始化函數*/
{
/*定時器初始化*/ TMOD=“V”_TMOD; TH0=V_TH0; TL0=V_TL0; TR0=1; ET0=1; EA=“1”;
}
//延時
void Delay5Ms(void)
{
unsigned int TempCyc = 1000; while(TempCyc--);
}
/*中斷函數*/
void timer0(void) interrupt 1 using 2
{
static uchar click=“0”; /*中斷次數計數器變量*/
TH0=V_TH0; /*恢復定時器初始值*/ TL0=V_TL0; ++click;
if (click》=100) click=“0”;
if (click《=ZKB1) /*當小于占空比值時輸出低電平,高于時是高電平,從而實現占空比的調整*/ P1_3=0;
? ? ? ??
? ? ? ? else
P1_3=1;
if (click〈=ZKB2) P1_4=0; else
P1_4=1;
} 〈
1.下面是AVR的程序,51產生PWM波麻煩,可以用AVR。主要是設置存放的TOP值 (OCR1A的值),然后你要多大的占空比 再設置OCR1B的值,至于持續時間就更簡單了,你要產生多久,就調用此函數就可以了。
2.產生方波的頻率計算公式(KHZ) f=fclk(晶振)/{*N(1+OCRNA)} N:代表分頻因子
根據你要的產生方波的頻率,就能算出OCRNA的值,就可以了!
/***************在OCR1B(PD4)上可測到100HZ的PWM波***********************/
/***************在OCR1A(PD5)上可測到50HZ的方波************************/
#include 《iom16v.h》
#include 《macros.h》 void PWM()
{
DDRD=0X30;//設置OC1B(PD4)和OC1A(PD5)為輸出 TCCR1A=0X63; TCCR1B=0X1B;
OCR1A=7;//得到10KHZ的PWM波
OCR1B=5;//得到2ms(1810/5)的高電平時間
}
評論
查看更多