Các khối chức năng trong vi điều khiển

Một phần của tài liệu Nghiên cứu, triển khai môi trường phát triển hệ thống nhúng trong bài toán điều khiển nhà kính (Trang 89 - 92)

a, Hoạt động của bộ chuyển đổi ADC trong AVR. Thực hiện theo các bước sau: - Khai báo các cổng nhận tín hiệu analog đầu vào.

- Chọn điện áp tham chiếu.

- Khởi tạo bộ chuyển đổi ADC trong vi điều khiển. - Nhận tín hiệu từ cổng vào (ởđây là PORTC.0) - Gọi hàm thực hiện chuyển đổi giá trị analog.

Cụ thể, được thực hiện như sau với phần mềm CodevisionAVR: Khai báo và khởi tạo các cổng:

PORTB=0x00;// Xuất tín hiệu ra ở các chân PB0,PB1 của PORTB DDRB=0x03;// Cổng B là output

Khởi tạo bộ chuyển đổi ADC trong chíp ATmega8

ADMUX=ADC_VREF_TYPE & 0xff;//Chọn điện áp tham chiếu,… ADCSRA=0x85;

Trong đó ADC_VREF_TYPE là kiểu điện áp tham chiếu được khai báo ở đầu chương trình

#define ADC_VREF_TYPE 0xE0

với ý nghĩa chọn điện áp tham chiếu nội 2.56V (xem bảng 2.5 về việc chọn điện áp tham chiếu).

ADCSRA=0x85; hay ADCSRA=0100 0101, nghĩa là cho phép module ADC được sử dụng (ADCSRA.7=1), chọn hệ số chia xung nhịp cho ADC (tra bảng 2.4).

b, Hoạt động của bộ truyền nhận dữ liệu USART trong AVR Atmega8 được thực hiện theo các bước sau:

- cài đặt tốc độ baud, - định dạng khung truyền,

- kích hoạt bộ truyền, bộ nhận, ngắt.

- thực hiện việc truyền/nhận thông qua các hàm.

Khởi tạo bộ truyền nhận dữ liệu USART trong chíp ATmega8

UCSRA=0x00;//chứa các bít trạng thái UCSRB=0xD8;//điều khiển UASRT UCSRC=0x86;//

UBRRH=0x00;//

UBRRL=0x33;//tốc độ truyền dữ liệu

Có ý nghĩa: khởi tạo bộ truyền UASRT với khung truyền 8 bit dữ liệu, 1 bit stop và không kiểm tra Parity, kích hoạt việc truyền nhận, chế độ truyền không đồng bộ, tốc độ truyền 9600MHz.

3.3.2. Một số module trong chương trình cho vi điều khiển

Đọc giá trị ADC

unsigned char read_adc(unsigned char adc_input) {

ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);

// Delay needed for the stabilization of the ADC input voltage delay_us(10);

// Start the AD conversion ADCSRA|=0x40;

// Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0);

ADCSRA|=0x10; return ADCH; }

Giá trị chuyển đổi ADC được đưa vào ở chân adc_input, giá trị sau khi chuyển đổi được trả về trong thanh ghi ADCH (là một trong hai thanh ghi chứa giá trị của quá trình chuyển đổi).

Hàm ngắt phục vụ quá trình nhận dữ liệu USART

interrupt [USART_RXC] void usart_rx_isr(void) {

char status,data; status=UCSRA; data=UDR;

if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) {

rx_buffer[rx_wr_index]=data;

if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; rx_buffer_overflow=1; }; }; }

Hàm ngắt phục vụ quá trình truyền dữ liệu USART

interrupt [USART_TXC] void usart_tx_isr(void) {

if (tx_counter) {

--tx_counter;

UDR=tx_buffer[tx_rd_index];

if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0; };

}

Ngoài ra còn có các hàm char getchar(void) và void putchar(char c) phục vụ cho việc đọc/ghi dữ liệu.

Đoạn lệnh của vi điều khiển đọc dữ liệu từ cảm biến LM35, đo được ở chân PC0/ADC0 của vi điều khiển nhờ hàm read_adc() như đã trình bày ở trên. Giá trị ở trên được so sánh với các giá trị ngưỡng, nếu lớn hơn max thì điều khiển thiết bịở chân 0 của PORTB, nếu bé hơn giá trị min thì điều khiển thiết bị ở chân 1 PORTB, nếu trong ngưỡng hai thiết bị không hoạt động. Đoạn lệnh này được đặt trong một vòng lặp để thực hiện liên tục việc lấy tín hiệu từ cảm biến để điều khiển thiết bị.

nhietdo=read_adc(0);

if(nhietdo>max) PORTB.0=1; //bat led 1 - dieu khien TB1 else

{

if(nhietdo<min) PORTB.1=1;//Dieu khien TB2 else {PORTB=0x00;}//Ca 2 TB khong hoat dong }

Một phần của tài liệu Nghiên cứu, triển khai môi trường phát triển hệ thống nhúng trong bài toán điều khiển nhà kính (Trang 89 - 92)

Tải bản đầy đủ (PDF)

(102 trang)