Hallo Zusammen, ich habe ein Problem mit der Strommessung und dem ACS712-30. Ich betreibe es an einem Arduino und möchte Ströme zwischen 0 und 10A messen. Das ganze mit 0,1A Genauigkeit. Leider finde ich nirgends einen vernünftigen Code in dem die Berechnung für das ACS712-30 zu finden ist. Meine bisherigen Programmierergebnisse belaufen sich auf: //Strommessung float average = 0; for (int i = 0; i < 1000; i++) { // average = (average + (.0264 * analogRead(A1) - 13.505) / 100); } Hat jemand Hinweise oder braucht Ihr weiteres Input von mir? Liebe Grüße!
HighVoltage schrieb: > möchte Ströme zwischen 0 und 10A > messen. Das ganze mit 0,1A Genauigkeit. Das geht nicht, das IC hat eine Genauigkeit von 1.5% (Seite 9).
Knife schrieb: > HighVoltage schrieb: >> möchte Ströme zwischen 0 und 10A >> messen. Das ganze mit 0,1A Genauigkeit. > > Das geht nicht, das IC hat eine Genauigkeit von 1.5% (Seite 9). meinentwegen. Wie sollte der Sktech lauten? Hat jemand ein Beispiel? Ich habe rausgefunden das 512 = 0mV sind und 1 schritt 0,66mV. Kann ich es so berechnen: (Zw= ZwischenWert) float average = 0; float zw; { zw = 512 - analogRead(A1); average = (zw* 66)/1000; Serial.print(average); delay(100); }
es gibt merhrere rechenwege.. Z.B: legst Du eine last von 2,54A an (mit dem Multiemter in Reihe!!) Nun siehst Du auf Derin Anzeige meinetwegen den Wert 832 Also hast Du 2,54A und 832 Nun brauchst Du doch nur noch 2,54 / 823 zu rechnen = 0,0030862697448359659781287970838396 Also nun kannst Du damit arbeiten z.B. 823 * 0,0030862697448359659781287970838396 = 2,54A
Mit externem ADC sieht's so aus:
1 | #ifdef ACS712
|
2 | Vcc=measure_vcc(); |
3 | // Read ACS712 voltage output differential
|
4 | adc.setMultiplexer(ADS1115_MUX_P1_N3); |
5 | adc.setGain(ADS1115_PGA_4P096); |
6 | mVopamp=adc.getConversion(); |
7 | #endif
|
8 | |
9 | #ifdef ACS712
|
10 | // ACS712: 185mV/1000mA -> 5.4054 mA / 1 mV
|
11 | current = (((mVopamp) * adc.getMvPerCount())- (Vcc/2)) * 5.4054; // noise 20mV absolute without filter capacitor.->~100mA "blind" |
12 | mVopamp *= adc.getMvPerCount(); |
13 | #endif
|
Und measure_vcc() (war zu faul, das sauber selber zu schreiben, daher Copy&Paste aus dem Netz):
1 | long measure_vcc() { |
2 | // Read 1.1V reference against AVcc
|
3 | // set the reference to Vcc and the measurement to the internal 1.1V reference
|
4 | ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); |
5 | |
6 | delay(2); // Wait for Vref to settle |
7 | ADCSRA |= _BV(ADSC); // Start conversion |
8 | while (bit_is_set(ADCSRA,ADSC)); // measuring |
9 | |
10 | uint8_t low = ADCL; // must read ADCL first - it then locks ADCH |
11 | uint8_t high = ADCH; // unlocks both |
12 | |
13 | long result = (high<<8) | low; |
14 | |
15 | result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000 |
16 | return (result); // Vcc in millivolts |
17 | }
|
Die Variablen sind einigermaßen sprechend deklariert, damit sollte der Rechenweg klar sein. Du musst jetzt eigentlich nur die ADC-Werte vom internen ADC verwenden und die zugöhrigen Werte anpassen. Edit: Ups, hab den Code zwar für Shunt/Hall-Sensor strukturiert, aber die eigentlichen Berechnungen für den ACS im Single-Ended-Modus schon entsorgt gehabt (habe einen 1:1 Spannungsteiler für Vcc/2 am differentiellen ADC-Eingang) - der ACS ist mir zu ungenau im Vergleich zum Shunt, 0-100mA sieht man gar nicht, erst danach geht's los (siehe Bild). Nachgepflegt.
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.