Điện áp và dòng điện là hai thông số quan trọng nhất của điện. Dự án này dạy bạn xây dựng một máy đo volt-amp đơn giản bằng vi điều khiển avr. Dự án này có thể không cho phép bạn xây dựng một công cụ đo lường cao cấp nhưng sẽ là một dự án tự làm tốt giúp hiểu rõ hơn về bộ chuyển đổi A / D trong vi điều khiển. Đồng hồ này có khả năng đo điện áp từ 0 đến 30V và dòng điện từ 0 đến 5A. Phải cẩn thận trong khi sử dụng để đầu vào không vượt quá thông số kỹ thuật.
THIẾT LẬP CÁC CẢM BIẾN:
ĐO ĐIỆN THẾ:
Một bộ chia tiềm năng đơn giản được sử dụng để đo điện áp. Bộ chia tiềm năng ở trên được thiết lập theo cách nó cung cấp 5v làm đầu ra khi đầu vào 30v được áp dụng cho nó vì điện áp đầu vào được cung cấp cho AVR phải nhỏ hơn hoặc bằng 5V.
Công thức để thiết lập điện trở chia tiềm năng là
Chúng tôi biết Vout của chúng tôi phải là <= 5V. Vì vậy, áp dụng điều này và sửa một điện trở R2 là 10k sẽ cho
ĐO LƯỜNG HIỆN TẠI:
Chúng tôi đang sử dụng một cách tiếp cận khá thẳng về phía trước để đo lường hiện tại. Ở đây chúng tôi đang sử dụng một cảm biến hiện tại hiệu ứng Hall để đo dòng điện. Cảm biến này có thể đo dòng điện lên đến 5A. 1A của dòng điện tương đương với 185mv thay đổi điện áp đầu ra. Ngoài ra còn có phiên bản 20A và 30A của chip này. Tìm hiểu thêm về cảm biến này ở đây .
TÍNH TOÁN:
Nhiệm vụ tiếp theo là thực hiện hiệu chuẩn để hiển thị các giá trị thực bằng Vi điều khiển của chúng tôi. Vì vậy, để làm được điều đó, chúng ta cần biết Kích thước bước của bộ chuyển đổi A / D trong vi điều khiển AVR. Nó được đưa ra bởi công thức
Kích thước bước = Vref / 2 ^ 10 (Vì nó là ADC 10 bit).
= 5/1024 = 4,88mv
Đây là kích thước bước của bộ chuyển đổi A / D của chúng tôi trong vi điều khiển AVR, cứ mỗi 4.88mv thay đổi đầu vào sẽ có thay đổi giá trị ADC trong thanh ghi.
ĐỂ TÍNH TOÁN ĐIỆN TỬ:
Như tôi đã đề cập trước đây, cảm biến điện áp được thực hiện bằng cách sử dụng bộ chia điện áp mang công thức
Vout = Vin x R2 / (R1 + R2)
Am sẽ sử dụng công thức này để lấy điện áp thực từ điện áp cảm nhận. Vì chúng tôi có được điện áp cảm nhận dưới dạng số kỹ thuật số, chúng tôi cần thực hiện chuyển đổi để có được giá trị Vout từ nó. Vì thế
Vout = Giá trị số được đọc từ đăng ký A / D * Vref / 2 ^ 10
Vout = Giá trị số được đọc từ đăng ký A / D * 5/1024, đơn giản hóa việc này chúng tôi nhận được
Vout = Giá trị số * 0,00488
Điều này sẽ cung cấp cho chúng ta điện áp Vout chính xác từ bộ chia điện áp, bây giờ áp dụng Vout này trong phương trình bộ chia sẽ cung cấp điện áp thực được đưa vào làm đầu vào cho bộ chia điện áp.
Vin = Vout * (R1 + R2) / R2
Vin = Vout * 60k / 10K
Vin = Vout * 6
Phương trình cuối cùng ở trên tôi đã thêm vào dòng 41 của mã, Điều này sẽ cung cấp điện áp thực cần đo và hiển thị.
ĐỂ TÍNH TOÁN HIỆN TẠI:
Chip IC ACS712 5A cho ra 185mA thay đổi điện áp ở đầu ra khi có sự thay đổi 1A trong dòng điện. Và điện áp danh định sẽ là 2,5 Volts vì vậy ADC luôn đọc 2,5 V ngay cả khi không có dòng điện qua nó.
Vout = Giá trị kỹ thuật số được đọc từ thanh ghi A / D * 5/1024, đơn giản hóa chúng tôi nhận được
Vout = Giá trị kỹ thuật số * 0,00488
Vì vậy, giá trị thực của hiện tại có thể được đưa ra là
Ampe = (Vout - Điện áp danh định) / 185mA (Thay đổi điện áp đầu ra của cảm biến)
Ampe = (Vout - 2.5) / 0.185
Phương trình này đã được thêm vào trong dòng 54 của mã. Tôi đã thay thế Amp bằng biến số float có sẵn trong mã để cắt giảm kích thước mã.
CODE:
#include<avr/io.h>
#define F_CPU 8000000UL
#include<util/delay.h>
#include<stdio.h>
double vin;
double vout;
unsigned int value;
char output[6];
void lcd_cmd(char cmd) //Command sub routine LCD
{
PORTC=cmd;
PORTD&=~(1<<0);
PORTD|=(1<<1);
_delay_ms(5);
PORTD&=~(1<<1);
_delay_ms(5);
}
void lcd_data(char *txt) //Data sub routine LCD
{
while(*txt!='\0')
{
PORTC=*txt;
PORTD|=(1<<0);
PORTD|=(1<<1);
_delay_ms(5);
PORTD&=~(1<<1);
_delay_ms(5);
txt++;
}
}
void voltage(void) //Sub routine to read voltage
{
ADMUX|=(1<<0);
ADCSRA|=(1<<6);
while(ADIF==0);
value=ADCL|ADCH<<8;
vout=value*0.00488; //To determine output Voltage from sensor
vin=6*vout; //To determine real voltage
sprintf(output,"%.2f",vin);
lcd_cmd(0x86);
lcd_data(output);
}
void current(void)
{
ADMUX&=~(1<<0);
ADCSRA|=(1<<6);
while(ADIF==0);
value=ADCL|ADCH<<8;
vout=value*0.00488; //To determine output voltage from sensor
vin=(vout-2.5)/0.185; //To determine real current
sprintf(output,"%.2f",vin); //Float to char conversion for printing
lcd_cmd(0xc6);
lcd_data(output);
}
int main(void)
{
DDRC=0xff;
DDRD=0x03;
PORTC=0x00;
PORTD=0x00;
lcd_cmd(0x38);
lcd_cmd(0x01);
lcd_cmd(0x0c);
lcd_cmd(0x80);
lcd_data("VOLTS:");
lcd_cmd(0xc0);
lcd_data("CURNT:");
ADMUX=0x00;
ADCSRA=0x87; //Initializing A/D converter
while(1)
{
voltage(); //Voltage display
_delay_ms(10);
current(); //Current Display
}
return 0;
}
NOTE:
- Care must be taken so that the input parameters (voltage & current) should not exceed the limitations.
- You can change the limitations by replacing the sensors and must be calibrated accordingly.
Nhận xét