• 0-25V Digital Voltmeter using AVR Microcontroller - Vôn kế kỹ thuật số 0-25V sử dụng Vi điều khiển AVR

QC

0-25V Digital Voltmeter using AVR Microcontroller - Vôn kế kỹ thuật số 0-25V sử dụng Vi điều khiển AVR

 0-25V Digital Voltmeter using AVR Microcontroller - Vôn kế kỹ thuật số 0-25V sử dụng Vi điều khiển AVR


  Trong dự án này, chúng tôi sẽ thiết kế một vôn kế kỹ thuật số phạm vi 25V bằng cách sử dụng vi điều khiển ATMEGA32A. Trong ATMEGA, chúng ta sẽ sử dụng 10bit ADC (Analog to Digital Converter) để xây dựng một vôn kế kỹ thuật số. Bây giờ ADC trong ATMEGA không thể nhận đầu vào nhiều hơn + 5V, vì vậy để có được dải cao hơn, chúng tôi sẽ sử dụng mạch phân áp.


Bây giờ điều quan trọng cần lưu ý ở đây là, đầu vào được bộ điều khiển sử dụng để chuyển đổi ADC thấp nhất là 50µAmp. Hiệu ứng tải của bộ phân áp dựa trên điện trở này rất quan trọng vì dòng điện được rút ra từ Vout của bộ chia điện áp làm tăng tỷ lệ lỗi, hiện tại chúng ta không cần phải lo lắng về hiệu ứng tải.


Chúng ta sẽ lấy hai điện trở và tạo thành một mạch phân chia sao cho Vin 25Volt, chúng ta nhận được Vout 5Volt. Vì vậy, tất cả những gì chúng ta phải làm là nhân giá trị Vout với "5" trong chương trình để có được điện áp đầu vào thực.


Components Required

Hardware: ATMEGA32, Power supply (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16*2LCD), 100uF capacitor, 100nF capacitor (5 pieces), 10KΩ resistor, 2KΩresistor, 1KΩ pot or preset.

Software: Atmel studio 6.1, progisp or flash magic.


Circuit Diagram and Working Explanation



Sơ đồ mạch vôn kế kỹ thuật số hoàn chỉnh được hiển thị trong hình trên. Ở đây PORTB của ATMEGA32 được kết nối với cổng dữ liệu của LCD. Người ta nên nhớ vô hiệu hóa giao tiếp JTAG trong PORTC ot ATMEGA bằng cách thay đổi các byte cầu chì, nếu người ta muốn sử dụng PORTC như một cổng giao tiếp thông thường. Trong LCD 16x2 tổng cộng có 16 chân nếu có đèn đen, nếu không có đèn nền sẽ có 14 chân. Người ta có thể cấp nguồn hoặc để lại các chân đèn phía sau. Bây giờ trong 14 chân có 8 chân dữ liệu (7-14 hoặc D0-D7), 2 chân cấp nguồn (1 & 2 hoặc VSS & VDD hoặc gnd & + 5v), chân thứ 3 để điều khiển độ tương phản (VEE-điều khiển độ dày của các ký tự sẽ được hiển thị ), và 3 chân điều khiển (RS & RW & E). (Tìm hiểu thêm về LCD trong hướng dẫn này: Giao diện LCD với Vi điều khiển AVR).


 Trong mạch, bạn có thể quan sát thấy tôi chỉ lấy hai chân điều khiển, điều này cho sự linh hoạt của sự hiểu biết tốt hơn, bit tương phản và READ / WRITE không được sử dụng thường xuyên nên chúng có thể được nối đất. Điều này đặt màn hình LCD ở chế độ đọc và độ tương phản cao nhất. Chúng ta chỉ cần điều khiển các chân ENABLE và RS để gửi các ký tự và dữ liệu cho phù hợp.


Các kết nối được thực hiện cho LCD được đưa ra dưới đây:


PIN1 hoặc VSS để nối đất


PIN2 hoặc VDD hoặc VCC đến nguồn + 5v


PIN3 hoặc VEE nối đất (mang lại độ tương phản tối đa tốt nhất cho người mới bắt đầu)


PIN4 hoặc RS (Lựa chọn đăng ký) đến PD6 của uC


PIN5 hoặc RW (Đọc / Ghi) nối đất (đặt màn hình LCD ở chế độ đọc giúp giảm bớt giao tiếp cho người dùng)


PIN6 hoặc E (Bật) đến PD5 của uC


PIN7 hoặc D0 đến PB0 của uC


PIN8 hoặc D1 đến PB1 của uC


PIN9 hoặc D2 đến PB2 của uC


PIN10 hoặc D3 đến PB3 của uC


PIN11 hoặc D4 đến PB4 của uC


PIN12 hoặc D5 đến PB5 của uC


PIN13 hoặc D6 đến PB6 của uC


PIN14 hoặc D7 đến PB7 của uC


Trong mạch các bạn có thể thấy chúng ta đã sử dụng giao tiếp 8bit (D0-D7) tuy nhiên đây không phải là điều bắt buộc, chúng ta có thể sử dụng giao tiếp 4bit (D4-D7) nhưng với giao tiếp 4 bit chương trình trở nên hơi phức tạp. Chúng ta đang kết nối 10 chân của LCD với vi điều khiển trong đó 8 chân là chân dữ liệu và 2 chân để điều khiển.


Điện áp trên R2 (2,2KΩ) không hoàn toàn tuyến tính; nó sẽ là một trong những ồn ào. Để lọc tạp âm, người ta đặt các tụ điện trên mỗi điện trở trong mạch phân chia như trong sơ đồ mạch điện ở trên.


Bình 1K ở đây là chỉnh độ chính xác của ADC. Trong ATMEGA32A, chúng tôi có thể cung cấp đầu vào Analog cho bất kỳ kênh nào trong số tám kênh của PORTA, không quan trọng chúng tôi chọn kênh nào vì tất cả đều giống nhau, chúng tôi sẽ chọn kênh 0 hoặc PIN0 của PORTA.


Trong ATMEGA32A, ADC có độ phân giải 10 bit, vì vậy bộ điều khiển có thể phát hiện và cảm nhận sự thay đổi tối thiểu của Vref / 2 ^ 10, vì vậy nếu điện áp tham chiếu là 5V, chúng tôi nhận được mức tăng đầu ra kỹ thuật số cho mỗi 5/2 ^ 10 = 5mV. Vì vậy, với mỗi mức tăng 5mV ở đầu vào, chúng ta sẽ có mức tăng là một ở đầu ra kỹ thuật số.


Bây giờ chúng ta cần thiết lập sổ đăng ký ADC dựa trên các điều khoản sau:


1. Trước hết chúng ta cần kích hoạt tính năng ADC trong ADC.


2. Điện áp đầu vào tối đa để chuyển đổi ADC là + 5V (5 * (12,2 / 2,2) = 27,7V; vì R1 = 10KΩ và R2 = 2,2KΩ). Vì vậy, chúng tôi có thể thiết lập giá trị lớn nhất hoặc tham chiếu của ADC đến 5V.


3. Bộ điều khiển có tính năng chuyển đổi trình kích hoạt, có nghĩa là chuyển đổi ADC chỉ diễn ra sau trình kích hoạt bên ngoài, vì chúng tôi không muốn rằng chúng tôi cần đặt các đăng ký để ADC chạy ở chế độ chạy tự do liên tục.


4. Đối với bất kỳ bộ ADC nào, tần số chuyển đổi (giá trị Tương tự sang giá trị Kỹ thuật số) và độ chính xác của đầu ra kỹ thuật số tỷ lệ nghịch. Vì vậy, để có độ chính xác tốt hơn của đầu ra kỹ thuật số, chúng ta cần chọn tần số thấp hơn. Đối với đồng hồ ADC nhỏ hơn, chúng tôi đang đặt giá trị đặt trước của ADC thành giá trị lớn nhất (128). Vì chúng tôi đang sử dụng đồng hồ bên trong 1MHZ, đồng hồ của ADC sẽ là (1000000/128).


Đây là bốn điều duy nhất chúng ta cần biết để bắt đầu với ADC.


Tất cả bốn tính năng trên được thiết lập bởi hai thanh ghi:



ĐỎ (ADEN): Bit này phải được đặt để kích hoạt tính năng ADC của ATMEGA.


BLUE (REFS1, REFS0): Hai bit này được sử dụng để đặt điện áp tham chiếu (hoặc điện áp đầu vào tối đa mà chúng tôi sẽ cung cấp). Vì chúng ta muốn có điện áp tham chiếu 5V, nên đặt REFS0.



LIGHT GREEN (ADATE): Bit này phải được thiết lập để ADC chạy liên tục (chế độ chạy tự do).


PINK (MUX0-MUX4): Năm bit này dùng để báo cho kênh đầu vào. Vì chúng ta sẽ sử dụng ADC0 hoặc PIN0, chúng ta không cần đặt bất kỳ bit nào như đã cho trong bảng.


BROWN (ADPS0-ADPS2): ba bit này dùng để thiết lập bảng điều khiển trước cho ADC. Sice chúng ta đang sử dụng một phương pháp đặt trước là 128, chúng ta cần đặt tất cả ba bit.


DARK GREEN (ADSC): bit này được thiết lập để ADC bắt đầu chuyển đổi. Bit này có thể bị vô hiệu hóa trong chương trình khi chúng ta cần dừng chuyển đổi.


Programming Explanation

/*
* C code for Digital Voltmeter using ATmega32 Microcontroller
 */ 
#include <avr/io.h>
#define F_CPU 1000000
#include <util/delay.h>
#include <stdlib.h>

#define enable            5
#define registerselection 6

void send_a_command(unsigned char command);
void send_a_character(unsigned char character);
void send_a_string(char *string_of_characters);

int main(void)
{
    DDRB = 0xFF;
    DDRA = 0;
    DDRD = 0xFF;
    _delay_ms(50);
    
    ADMUX |=(1<<REFS0);
    ADCSRA |=(1<<ADEN)|(1<<ADATE)|(1<<ADPS0)|(1<<ADPS1)|(1<<ADPS2);
    

    
    float voltage = 0;
    char voltageshow [7];
    

    send_a_command(0x01); //Clear Screen 0x01 = 00000001
    _delay_ms(50);
    send_a_command(0x38);
    _delay_ms(50);
    send_a_command(0b00001111);
    _delay_ms(50);
    
    ADCSRA |=(1<<ADSC);
    while(1)
    {
        voltage = ADC/204.8*18;//ADC/18.618;
        send_a_string ("CIRCUIT DIGEST  ");
        send_a_command(0x80 + 0x40 + 0);
        send_a_string ("VOLTAGE=");
        send_a_command(0x80 + 0x40 + 8);
        dtostrf(voltage, 5, 2, voltageshow);
        send_a_string(voltageshow);
        send_a_string("V   ");
        //dtostr(double precision value, width, precision, string that will store the numbers);
        // Value is either a direct value plugged into this place, or a variable to contains a value.
        //Width that is used with dtostrf is the number of characters in the number that includes the negative sign (-). For instance, if the number is -532.87, the width would be 7 including the negative sign and the decimal point.
        //Precision is how many numbers would be after the decimal point in the dtostrf usage.
        //Base is the maximum number of values per digit. For instance, 2 is for binary representation (2 possible values for each digit - 0 or 1); 10 is for the common human number system (10 possible values for each digit - 0, 1, 2, 3, 4, 5, 6, 7, 8, or 9); 16 is for hexadecimal where there are 16 possible values for each digit - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, or F. It should be understood that if the base is larger, then the alphabet will just get larger.
        //String is the variable that accepts alphanumeric characters such as a char array. After the function is executed, the string will have the number stored within the array. For instance, if an integer variable contains the number 643, then the string variable will contain "634".
        send_a_command(0x80 + 0);
        
    }
}

void send_a_command(unsigned char command)
{
    PORTB = command;
    PORTD &= ~ (1<<registerselection);
    PORTD |= 1<<enable;
    _delay_ms(2);
    PORTD &= ~1<<enable;
    PORTB = 0;
}

void send_a_character(unsigned char character)
{
    PORTB = character;
    PORTD |= 1<<registerselection;
    PORTD |= 1<<enable;
    _delay_ms(2);
    PORTD &= ~1<<enable;
    PORTB = 0;
}
void send_a_string(char *string_of_characters)
{
    while(*string_of_characters > 0)
    {
        send_a_character(*string_of_characters++);
    }
}





Nap Code vào PY32F003 dùng Stlink

 Nap Code vào PY32F003 dùng Stlink Bước 1: Cài đặt  KeilC v5.39 theo link sau ( chú ý 5.39 keil c mới nạp ok). https://edge07.111.ir.cdn.ir/...