3.6.2. Code tạo xung PWM
/*
* Exercise3.c
Chương trình điều khiển 2 động cơ DC. Sử dụng hàm “delay” để điều khiển hoạt động của động cơ quay thuận – ngược.
Các động cơ được điều khiển bởi PORTA.
* Created: 02/06/2014 14:47:29
* Author: 0986865953
*/
#include <avr/io.h> //Khai báo thư viện của ATmega16
#include <util/delay.h> //Khai báo thư viện delay
int main(void) //Hàm chính
{ //Bắt đầu của hàm chính
DDRA = 0x3f; //Xuất dữ liệu ra từ chân 0–5 của PORTA
PORTA = 0x00; //Khởi tạo giá trị ban đầu của PORTA
while(1) //Vòng lặp vô hạn
{ //Bắt đầu vòng lặp
PORTA = 0B00101110; //Set bit1, 2, 3, 5 của PORTA=1
_delay_ms(3500); //Thời gian set = 3500ms
PORTA = 0B00100110; //Set bit1, 2, 5 của PORTA=1
_delay_ms(100); //Thời gian set = 100ms
PORTA = 0x00; //Clean các bit vừa set
_delay_ms(7000); //Thời gian clean = 7000ms
PORTA = 0B00011101; //Set bit0, 2, 3, 4 của PORTA=1
_delay_ms(3300); //Thời gian set = 3300ms
PORTA = 0B00011001; //Set bit0, 3, 4 của PORTA=1
_delay_ms(600); //Thời gian set = 600ms
PORTA = 0x00; //Clean các bit vừa set
_delay_ms(7000); //Thời gian clean = 7000ms
} //Kết thúc vòng lặp
return 0; //Trả về giá trị ban đầu
} //Kết thúc hàm chính
Sơ đồ nguyên lý và kết quả mô phỏng:
/*
* Exercise4.c
Chương trình sử dụng “Timer” điều khiển hoạt động của 2 động cơ DC.
Các động cơ được điều khiển bởi PORTA.
* Created: 5/23/2014 2:43:30 PM
* Author: Administrator
*/
#include <avr/io.h> //Khai báo thư viện của ATmega16
#include <util/delay.h> //Khai báo thư viện delay
#include <avr/interrupt.h> //Khai báo thư viện ngắt
ISR(TIMER0_COMP_vect) //Chương trình phụ vụ timer0
{
PORTA^=(1<<0)|(0<<1)|(1<<2)|(1<<3)|(0<<4)|(1<<5);
//So sánh các bit PORTA, bit 0 lên =1, bit 1 = 0, bit 2 = 1, bit 3 = 1, bit 4 = 0, bit 5 = 1
}
void timer_initial(int x) //Khởi tạo hàm con
{ TCCR0=(1<<WGM00)|(1<<COM00)|(1<<CS02);
TCNT0=0; //Set thanh ghi TCNT0 = 0
OCR0=x; //Đặt thanh ghi OCR0 = x (x: biến)
TIMSK=0x02; //Set thanh ghi TIMSK = 0x02
TIFR=0x02; //Thanh ghi TIFR = 0x02
sei(); //Ngắt toàn cục
}
int main(void) //Hàm chính
{ //Bắt đầu hàm chính
DDRA = 0x3f; // Xuất dữ liệu ra từ chân 0–5 của PORTA
PORTA = 0x00; //Khởi tạo giá trị cho PORTA
while(1) //Vòng lặp vo hạn
{ //Bắt đầu vòng lặp
timer_initial(64); //Tốc độ 1
_delay_ms(500); //Thời gian delay = 500ms
timer_initial(128); //Tốc độ 2
_delay_ms(500); //Thời gian delay = 500ms
timer_initial(192); //Tốc độ 3
_delay_ms(500); //Thời gian delay = 500ms
} //Kết thúc vòng lặp
return 0; //Trả về giá trị ban đầu
} //Kết thúc hàm chính
Sơ đồ nguyên lý và kết quả mô phỏng: