Sari la conținut
ELFORUM - Forumul electronistilor

Problema cu senzor ACS712-30A


Postări Recomandate

Buna ziuaIncerc sa fac un ampermetru trifazat pentru un curent maxim de 30A, dar am intampinat o problema cu modulele de sesizarea curentului, nou-noute alimentat cu 5V scot la iesire 2.5V.Degeaba pun rezistente sau condensatoare la iesire nu se schimba nimic. :sparge: Ce ziceti poate integratul e defect si am un noroc sa fie defect la toate 3?

post-11727-139829677304_thumb.jpg

Link spre comentariu
  • Răspunsuri 20
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

"If there is no the detection current through, the output voltage is VCC / 2" - se zice pe Internet, nu am testat un astfel de senzor. Ai continuitate intre pinii 1,2 si 3,4? Daca s-a ars fuzibilul interna, atunci nu ai nici o detectie de curent. Sau poate curentul este f mic si nu il detecteaza.

Link spre comentariu

Oricum ai castigat 40mV la iesire :da . Banuiesc ca uscatorul este de peste 1000W, deci cam 4A tot ai. Ar fi trebuit sa ai cam 2.65-2.7V la iesire dupa pagina 8 din datasheet.1. Cat este sursa de 5V? Este 5V sau ceva mai putin?2. Poti pune o sarcina cam de 10A sau mai mult? Cat este la iesire atunci?Ai ceva grafice de Ip vs Vout la pagina 8 din datasheet, iar iesirea incrementeaza de 66mV per 1A.

Link spre comentariu
  • 1 lună mai târziu...

Senzori merg numai cand se masoara curent AC trebuie redresat dupa amplificatorul operational. O alta problema a mea este softul, cum pot sa modific sa ia referinta de iesire de 2.5V de la senzor ca zero si sa masoare pana la 30A? :nas:

 

// LCD module connectionssbit LCD_RS at RB2_bit;sbit LCD_EN at RB3_bit;sbit LCD_D4 at RB4_bit;sbit LCD_D5 at RB5_bit;sbit LCD_D6 at RB6_bit;sbit LCD_D7 at RB7_bit;sbit LCD_RS_Direction at TRISB2_bit;sbit LCD_EN_Direction at TRISB3_bit;sbit LCD_D4_Direction at TRISB4_bit;sbit LCD_D5_Direction at TRISB5_bit;sbit LCD_D6_Direction at TRISB6_bit;sbit LCD_D7_Direction at TRISB7_bit;// End LCD module connections  unsigned int curent1,curent2,curent3,curent4,curent5,curent6,curent_medie,val1;  unsigned long i;unsigned char ch;void main(){  TRISA      = 0xFF;                       // designate PORTA as input  //INTCON = 0;                              // Disable all interrupts  //IRP_bit = 1 ;  Lcd_Init();                        // Initialize LCD  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off  Lcd_Cmd(_LCD_CLEAR);               // Clear display  Delay_ms(100);    LCD_Out(1,1," 3PHASE-AMMETER");  LCD_Out(2,1,"**By CsOnGoRe**");  Delay_ms(100);  Lcd_Cmd(_LCD_CLEAR);  LCD_Out(1, 1,"R:");  LCD_Out(2, 6,"S:");  LCD_Out(1, 10,"T:");    while (1)  {    //Curent 1          curent1=ADC_read(0);                // get ADC value for U from channel 1          Delay_ms(50);          curent2=ADC_read(0);                // get ADC value for U from channel 1          Delay_ms(50);          curent3=ADC_read(0);                // get ADC value for U from channel 1          Delay_ms(50);          curent4=ADC_read(0);                // get ADC value for U from channel 1          Delay_ms(50);          curent5=ADC_read(0);                // get ADC value for U from channel 1          Delay_ms(50);          curent6=ADC_read(0);                // get ADC value for U from channel 1          Delay_ms(50);          curent_medie=(curent1+curent2+curent3+curent4+curent5+curent6)/6;                 i=(long)curent_medie*3000;               // covert adc reading to milivolts      i=i/1023;                            // 0..1023 -> 0-3500mV            ch=i/1000;                           // extract 10.00 U digit      if (ch==0)        {          LCD_Chr(1,3, 32);                // write empty space if digit is 0        }      else        {          LCD_Chr(1,3,48+ch);              // write ASCII digit at 1st row, 2nd column        }      ch=(i/100) %10;                      // extract 01.00 U digit      LCD_Chr_CP(48+ch);      LCD_Chr_CP('.');                     // write '.' at cursor point      ch=(i/10) %10;                       // extract 00.10 U digit      LCD_Chr_CP(48+ch);                   // write ASCII digit at cursor point      LCD_Chr_CP('A');     //Curent 2          curent1=ADC_read(1);                // get ADC value for U from channel 1          Delay_ms(50);          curent2=ADC_read(1);                // get ADC value for U from channel 1          Delay_ms(50);          curent3=ADC_read(1);                // get ADC value for U from channel 1          Delay_ms(50);          curent4=ADC_read(1);                // get ADC value for U from channel 1          Delay_ms(50);          curent5=ADC_read(1);                // get ADC value for U from channel 1          Delay_ms(50);          curent6=ADC_read(1);                // get ADC value for U from channel 1          Delay_ms(50);          curent_medie=(curent1+curent2+curent3+curent4+curent5+curent6)/6;      i=(long)curent_medie*3000;               // covert adc reading to milivolts      i=i/1023;                            // 0..1023 -> 0-3500mV      ch=i/1000;                           // extract 10.00 U digit      if (ch==0)        {          LCD_Chr(2,8, 32);                // write empty space if digit is 0        }      else        {          LCD_Chr(2,8,48+ch);              // write ASCII digit at 1st row, 2nd column        }      ch=(i/100) %10;                      // extract 01.00 U digit      LCD_Chr_CP(48+ch);      LCD_Chr_CP('.');                     // write '.' at cursor point      ch=(i/10) %10;                       // extract 00.10 U digit      LCD_Chr_CP(48+ch);                   // write ASCII digit at cursor point      LCD_Chr_CP('A');      //Curent 3          curent1=ADC_read(2);                // get ADC value for U from channel 1          Delay_ms(50);          curent2=ADC_read(2);                // get ADC value for U from channel 1          Delay_ms(50);          curent3=ADC_read(2);                // get ADC value for U from channel 1          Delay_ms(50);          curent4=ADC_read(2);                // get ADC value for U from channel 1          Delay_ms(50);          curent5=ADC_read(2);                // get ADC value for U from channel 1          Delay_ms(50);          curent6=ADC_read(2);                // get ADC value for U from channel 1          Delay_ms(50);          curent_medie=(curent1+curent2+curent3+curent4+curent5+curent6)/6;      i=(long)curent_medie*3000;               // covert adc reading to milivolts      i=i/1023;                            // 0..1023 -> 0-3500mV      ch=i/1000;                           // extract 10.00 U digit      if (ch==0)        {          LCD_Chr(1,12, 32);                // write empty space if digit is 0        }      else        {          LCD_Chr(1,12,48+ch);              // write ASCII digit at 1st row, 2nd column        }      ch=(i/100) %10;                      // extract 01.00 U digit      LCD_Chr_CP(48+ch);      LCD_Chr_CP('.');                     // write '.' at cursor point      ch=(i/10) %10;                       // extract 00.10 U digit      LCD_Chr_CP(48+ch);                   // write ASCII digit at cursor point      LCD_Chr_CP('A');}}
Link spre comentariu

Senzorul da +si - dar pun un operationat si dupa redresez sa am numai +.

Am completetat cu -512 programul si a mai scazut curentul de la 15A care era jumatate din scala la 9.8A

dar inca nu e zero.

Ce ziceti unde e buba, vreau sa clarific ca sunt foarte incepator in programare :jytuiyu

 

i=(long)curent_medie*3000;               // covert adc reading to milivolts      i=(i/1023)-512;                            // 0..1023 -> 0-3000mV
Link spre comentariu

Ai putea sa afisezi pe LCD direct valoarea ADC ca sa fii sigur ca atunci cand ai afisat aia 15A aveai intradevar o astfel de valoare in ADC (adica corespunzatoare la 15A). Astfel vedeai si la 9,8A cat era ADC-ul, daca era identic cu valoarea la 15A.

 

As face o interpolare liniara : http://en.wikipedia.org/wiki/Linear_interpolation.

Unde x0=0 si x1=30 (astia-s amperii), iar y0=511 si y1=1023. Asta te duce tot la formula de mai sus (scade 512).

 

Astfel stii mereu daca problema este din calcule in soft sau hardware. Apoi treci sa afisezi in Amperi.

Link spre comentariu

Pana la urma am scapat de referinta din senzor :nas:

 

Modificand softul, m-am chinuit destul de mult dar inca nu e perfect am constatat niste neliniaritati poate ca e de la operational(LM324) sau am modificat gresit softul. O sa incerc cu un LT1014 care e mult mai performant decat LM324. Prezint cateva valori masurate cu un clapmetru si ampermetrul meu.

 

clapmetru=0.00A.........PIC=0.0A

clapmetru=3.35A..........PIC=3.1A

clapmetru=4.87A..........PIC=4.9A

clapmetru=5.88A..........PIC=6A

 

Codul si Schema interfata PIC/senzor HAL-30A

sbit LCD_RS at RB2_bit;sbit LCD_EN at RB3_bit;sbit LCD_D4 at RB4_bit;sbit LCD_D5 at RB5_bit;sbit LCD_D6 at RB6_bit;sbit LCD_D7 at RB7_bit;sbit LCD_RS_Direction at TRISB2_bit;sbit LCD_EN_Direction at TRISB3_bit;sbit LCD_D4_Direction at TRISB4_bit;sbit LCD_D5_Direction at TRISB5_bit;sbit LCD_D6_Direction at TRISB6_bit;sbit LCD_D7_Direction at TRISB7_bit;  unsigned int curent1,curent2,curent3,curent4,curent5,curent6,curent_medie,val1;  unsigned long i;  unsigned char ch;void main(){  TRISA      = 0xFF;                       // designate PORTA as input  INTCON = 0;                              // Disable all interrupts  Lcd_Init();  Lcd_Cmd(_LCD_CURSOR_OFF);  Lcd_Cmd(_LCD_CLEAR);  Delay_ms(100);  LCD_Out(1,1," 3PHASE-AMMETER");  LCD_Out(2,1,"**By CsOnGoRe**");  Delay_ms(100);  Lcd_Cmd(_LCD_CLEAR);  LCD_Out(1, 1,"R:");  LCD_Out(2, 6,"S:");  LCD_Out(1, 10,"T:");  while (1)  {    //Curent 1          curent1=ADC_read(0);          Delay_ms(50);          curent2=ADC_read(0);          Delay_ms(50);          curent3=ADC_read(0);          Delay_ms(50);          curent4=ADC_read(0);          Delay_ms(50);          curent5=ADC_read(0);          Delay_ms(50);          curent6=ADC_read(0);          Delay_ms(50);          curent_medie=(curent1+curent2+curent3+curent4+curent5+curent6)/6;      i=(((long)curent_medie)-511)*8000;      i=(i/1023);            ch=i/1000;      if (ch==0)        {          LCD_Chr(1,3, 32);        }      else        {          LCD_Chr(1,3,48+ch);        }      ch=(i/100) %10;      LCD_Chr_CP(48+ch);      LCD_Chr_CP('.');      ch=(i/10) %10;      LCD_Chr_CP(48+ch);      LCD_Chr_CP('A');     //Curent 2          curent1=ADC_read(1);          Delay_ms(50);          curent2=ADC_read(1);          Delay_ms(50);          curent3=ADC_read(1);          Delay_ms(50);          curent4=ADC_read(1);          Delay_ms(50);          curent5=ADC_read(1);          Delay_ms(50);          curent6=ADC_read(1);          Delay_ms(50);          curent_medie=(curent1+curent2+curent3+curent4+curent5+curent6)/6;      i=(((long)curent_medie)-511)*8000;      i=i/1023;      ch=i/1000;      if (ch==0)        {          LCD_Chr(2,8, 32);        }      else        {          LCD_Chr(2,8,48+ch);        }      ch=(i/100) %10;      LCD_Chr_CP(48+ch);      LCD_Chr_CP('.');      ch=(i/10) %10;      LCD_Chr_CP(48+ch);      LCD_Chr_CP('A');      //Curent 3          curent1=ADC_read(2);          Delay_ms(50);          curent2=ADC_read(2);          Delay_ms(50);          curent3=ADC_read(2);          Delay_ms(50);          curent4=ADC_read(2);          Delay_ms(50);          curent5=ADC_read(2);          Delay_ms(50);          curent6=ADC_read(2);          Delay_ms(50);          curent_medie=(curent1+curent2+curent3+curent4+curent5+curent6)/6;      i=(((long)curent_medie)-511)*8000;      i=i/1023;      ch=i/1000;      if (ch==0)        {          LCD_Chr(1,12, 32);        }      else        {          LCD_Chr(1,12,48+ch);        }      ch=(i/100) %10;      LCD_Chr_CP(48+ch);      LCD_Chr_CP('.');      ch=(i/10) %10;     LCD_Chr_CP(48+ch);      LCD_Chr_CP('A');}}

post-11727-139829695997_thumb.jpg

Link spre comentariu

Circuitul tau banuiesc ca atenueaza offsetul pana la 0,7V ( pragul diodei ) dar in acelasi timp atenueaza si semnalul util ... scade sensibilitatea mult . Vezi in datasheetul senzorului la application 3 , pe langa ca amplifica semnalul util , elimina si offset-ul punand intrarea neinversoare la 2,5V prin divizorul rezistiv . Dar atunci mai ai nevoie dupa de un redresor activ fara prag , nu simpla diodaSe poate si numai cu un redresor activ cuplat direct la senzor prin condensator daca masori numai semnal alternativ .Redresorul activ se poate face destul de simplu tot cu 1 operational , scheme se gasesc

Link spre comentariu

Da , cam asa ceva , evident fara mosfet si probabil ca va trebui mult marit condensatorul de filtraj C2 sau ( si ) rezistenta R4 ca sa nu mai fie riplu de 50 Hz pe iesire care ar face sa-ti tot joace indicatia ADC-ului . Pentru frecventa retelei ajunge orice operational , numai la frecventa mai mare e nevoie de ceva performant

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări