智能小車的直流電機控制
【實驗目的】
了解以單片機為核心的直流電機控制系統
掌握此系統中直流電機驅動與調速原理
熟悉ICCAVR 軟件編譯環境,會編寫控制程序
【實驗器材】
智能小車一部,下載線一根
【實驗原理】
直流電機驅動控制系統示意圖:
在本實驗中所分析的是以單片機ATMEGA8515L 為核心的直流電機控制系統。
ATMEGA8515L 芯片的引腳圖如下:
功放驅動電路采用基于雙極性H-橋型脈寬調整方式PWM 的集成電路L293D。L293D是單
塊集成電路,高電壓,高電流,四通道驅動,設計用來接受DTL 或者TTL 邏輯電平,驅動感
性負載(比如 繼電器,直流和步近馬達),和開關電源晶體管。其引腳圖如下:
ATMEGA8515L 利用I/O 口(PD5,PE2,PD4,PD6)向驅動電路輸出控制電平,這些I/O
口作為單片機控制指令的輸出,連接到驅動電路中L293D 的相應管腳上。
其真值表如下:
對于電機的轉速調整,我們是采用脈寬調制(PWM)辦法,控制電機的時候,電源并非
連續地向電機供電,而是在一個特定的頻率下以方波脈沖的形式提供電能。不同占空比的方
波信號能對電機起到調速作用,這是因為電機實際上是一個大電感,它有阻礙輸入電流和電
壓突變的能力,因此脈沖輸入信號被平均分配到作用時間上,這樣,改變在始能端PE2 和
PD5 上輸入方波的占空比就能改變加在電機兩端的電壓大小,從而改變了轉速。
此實驗中用微處理機來實現脈寬調制,通常的方法有兩種:
(1)用軟件方式來實現,即通過執行軟件延時循環程序交替改變端口某個二進制位輸出邏
輯狀態來產生脈寬調制信號,設置不同的延時時間得到不同的占空比。
(2)硬件電路自動產生PWM 信號,不占用CPU 處理的時間。
這就要用到ATMEGA8515L 的在PWM 模式下的計數器1,具體內容可參考相關書籍。
【實驗步驟】
(1) 連接好電路,把數據線,下載線連接好,打開電源
(2) 進入ICCAVR 編譯環境,調試程序直至沒有錯誤,編譯環境簡介請參見附錄一
(3) 下載,燒錄進單片機,觀察實驗結果
(4) 反復修改調試程序,逐漸增強其功能
(5) 寫好實驗報告,實驗心得體會
【程序示例】
1、小車前進一段——>左轉一圈——>右轉一圈——>前進一段——>后退一段——>停下
//ICC-AVR application builder : 2005-5-19 19:12:13
// Target : M8515
// Crystal: 4.0000Mhz
#include
#include
unsigned int time;
unsigned int yan;
void port_init(void)
{
PORTA = 0x00;
DDRA = 0xFF;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0xFF;
PORTE = 0x00;
DDRE = 0xFF;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
MCUCR = 0x00;
EMCUCR =0x00;
GICR = 0x00;
TIMSK = 0x00;
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void delay(unsigned int yan)
{
while(yan>0)
yan--;
}
void runforth(void)
{
while(time<1000)
{
PORTE=0x04;
PORTD=0x70;
delay(2000);
time++;
}
time=0;
}
void zuozhuanwan(void)
{while(time<1000)
{
PORTE=0x00;
PORTD=0X70;
delay(2000);
time++;
}
time=0;
}
void youzhuanwan(void)
{while(time<1000)
{
PORTE=0x04;
PORTD=0x50;
delay(2000);
time++;
}
time=0;
}
void houtui(void)
{while(time<1000)
{
PORTE=0x04;
PORTD=0x20;
delay(2000);
time++;
}
time=0;
}
void stop(void)
{
PORTE=0x00;
PORTD=0x00;
}
void main(void)
{ init_devices();
time=0;
runforth();
zuozhuanwan();
youzhuanwan();
runforth();
houtui();
stop();
}
2、調速程序
以下是用兩定時器來控制加在兩方向控制口的方波占空比,以此來對電機進行調速,而
同學們可以利用對兩始能端高低電平進行不同延時來實現調速功能。
//ICC-AVR application builder : 2005-5-18 16:45:27
// Target : M8515
// Crystal: 4.0000Mhz
#include
#include
unsigned char a;
unsigned char p;
unsigned char m;
unsigned char n;
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x70;
PORTE = 0x00;
DDRE = 0x04;
}
//TIMER0 initialize - prescale:64
// WGM: Normal
// desired value: 40Hz
// actual value: Out of range
void timer0_init(void)
{
TCCR0 = 0x00; //stop timer
TCNT0 = 0xfa /*INVALID SETTING*/; //set count value
TCCR0 = 0x03; //start timer
}
#pragma interrupt_handler timer0_ovf_isr:8
void timer0_ovf_isr(void)
{
TCNT0 = 0xfa /*INVALID SETTING*/; //reload counter value
if(m==a)
{PORTD=0x70;
TCCR1B=0x03;
TCCR0=0x00;
n=1;}
else{m++;}
}
//TIMER1 initialize - prescale:64
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 40Hz
// actual value: 40.013Hz (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xff; //setup
TCNT1L = 0xfa;
OCR1AH = 0x06;
OCR1AL = 0x1A;
OCR1BH = 0x06;
OCR1BL = 0x1A;
TCCR1A = 0x00;
TCCR1B = 0x00;
}
#pragma interrupt_handler timer1_ovf_isr:7
void timer1_ovf_isr(void)
{
TCNT1H = 0xff; //reload counter high value
TCNT1L = 0xfa; //reload counter low value
if(n==250-a)
{PORTD=0x20;
TCCR0=0x03;
TCCR1B=0x00;
m=1;
if(p==0){if(a==125){p=1;}
else{a++;}}
else{{if(a==1){p=0;}
else{a--;}}}}
else{n++;}
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer0_init();
timer1_init();
MCUCR = 0x00;
EMCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x82;
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void main(void)
{a=0;
p=0;
m=1;
n=1;
init_devices();
while(1)
{PORTE=0x04;}
}
評論
查看更多