Máy đo Volt-Amp sử dụng vi điều khiển AVR


Đ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à


Vout = Vin x R2 / (R1 + R2)


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


5v = 30 x 10k / (R1 + 10k)


R1 = 50k.

Đ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:

  1. Care must be taken so that the input parameters (voltage & current) should not exceed the limitations.
  2. You can change the limitations by replacing the sensors and must be calibrated accordingly.

Nhận xét

Mới hơn Cũ hơn