Go Down

Topic: Arduino hängt fest (Read 1 time) previous topic - next topic

combie

Die AVR können das.
Also auch der UNO.

analogRead() leider nicht,
Säge kein Sägemehl.

Serenifly

Der Trick ist dass man die interne 1.1V Referenz mit der Betriebsspannung als Referenz misst. Dann kann man auf die Betriebsspannung zurückrechnen. Die interne Referenz hat bis zu 10% Toleranz, aber ist ziemlich konstant.

https://www.instructables.com/id/Secret-Arduino-Voltmeter/

Shane93

Das klingt sehr interessant, ich werde da die Tage mal versuchen und sag euch dann bescheid obs die Steomversorgung ist.

combie

#33
Aug 06, 2019, 06:52 pm Last Edit: Aug 07, 2019, 10:37 am by combie
In meiner Wühlkiste habe ich noch einen Ansatz...
Vielleicht gefällt dir der ja.

Auf einem UNO werden über 10000 Messungen pro Sekunde durchgeführt.
Auch wenn nebenher noch was anderes läuft, z.B. delay() usw.

Die Referenz deines UNO musst du allerdings dort möglichst exakt eintragen.



Code: [Select]

#include <util/atomic.h>
#include <CombieAdc.h>

using Combie::Adc;
Adc adc;

//const float interneRefrenz = 1.119; // Volt (korrekten Wert eintragen)
const float interneRefrenz = 1.071; // Volt (korrekten Wert eintragen)

volatile unsigned long irqCount;
// kleine Versorgungsspannung, hoher ADC Wert
volatile int volt;
volatile int minvolt =    0;
volatile int maxvolt = 1023;




float adc2Spannung(int adcValue)
{
  return interneRefrenz * 1024.0 / float(adcValue); 
}

void printVolt()
{
  unsigned long count;
  int tempvolt;
  int tempminvolt;
  int tempmaxvolt;

  ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
  {
    count = irqCount;
    irqCount = 0;
    tempvolt = volt;
    tempminvolt = minvolt;
    tempmaxvolt = maxvolt;
  }

  Serial.println("Messergebnis einer Sekunde");
  Serial.print("Anzahl Messungen: ");Serial.println(count);
  Serial.print("Letzte Messung ");Serial.println(adc2Spannung(tempvolt));
  Serial.print("Maximal:");Serial.println(adc2Spannung(tempmaxvolt));
  Serial.print("Minimal:");Serial.println(adc2Spannung(tempminvolt));
  Serial.println("--------------");
 
 
}


void clear()
{
  ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
  {
    irqCount = 0;
    minvolt  = 0;
    maxvolt  = 1024;
  }
}



void adcCallBack(int value) // ISR
{
  irqCount++;
  volt = value;
  minvolt = max(minvolt,volt);
  maxvolt = min(maxvolt,volt);
}



void setup()
{
 Serial.begin(9600);
 Serial.println("Start");
 
   adc  .enable()
        .setReference(Adc::REF_VCC)
        .setClockDivisor(Adc::DIV_128)
        .setSource(Adc::MUX_REF)
        .setCallBack(adcCallBack)
        .enableAutoTrigger()
        .setTrigger(Adc::TRIG_FREERUNNING)
        .enableIrq()
        .startConversion();

   delay(100);
   clear(); // erste Messungen verwerfen, da ein Arduino bei ca. 2,7V aus dem BrownOut kommt.
 
}

void loop()
{
  delay(1000);
  printVolt();
}



Referenzwert ermitteln:
Code: [Select]
analogReference(INTERNAL);
analogRead(A0);

Beide ausführen und dann mit dem Multimeter den Aref Pin messen.
Den Messwert ins Programm eintragen.
Säge kein Sägemehl.

Shane93

Wow, vielen Dank combie, das du mir so gut hilfst, sehr nett von dir.
Ich weiss Zeitlich leider nicht genau wann ich dazu komm, aber ich gebe auf jeden fall bescheid, was raus kam.
Kommt das Referenzwert ermitteln in den Setup-Teil?

combie

#35
Aug 07, 2019, 10:20 am Last Edit: Aug 07, 2019, 10:34 am by combie
Quote
Kommt das Referenzwert ermitteln in den Setup-Teil?
Das muss nur einmal im Leben eines  µC gemacht werden.
Den Wert könnte man auch im EEPROM speichern.
Code: [Select]


void setup()
{
// analogReference(INTERNAL1V1); // Mega
 analogReference(INTERNAL); // UNO
 analogRead(A0);
}

void loop()
{

}

Du könntest natürlich auch stattdessen Combie::Adc verwenden, um die Referenz auf internal zu setzen
Säge kein Sägemehl.

Shane93

Alles klar, wenn man den Wert hat, kann man die Ermittlung aber wieder raus nehmen, seh ich das richtig?

combie

#37
Aug 07, 2019, 11:01 am Last Edit: Aug 07, 2019, 11:06 am by combie
Die Ermittlung muss nur einmal im Leben des µC gemacht werden.
Es sei denn, du bist so trottelig und vergisst dir den Wert zu merken.

Also: "seh ich das richtig?"
Jawoll!

Man könnte tricksten....
Aber wer will das schon..
Säge kein Sägemehl.

Shane93

Alles klar, dann bedanke ich mich schon mal bei dir combie, für die große Hilfe. Ich werd das definitiv machen und sag dann bescheid was die Stromversorgung macht.

Shane93

combie, wo bekomme ich die <util/atomic.h> her?


Shane93

So ich habe die Messung jetzt knapp eine Woche getestet, natürlich hat sich mein Arduino dieses mal nicht aufgehängt, deswegen werd ich das noch eine Woche laufen lassen.
Jedenfalls habe ich eine minimale Spannung von 4,88V.

uwefed

Danke für Deine Rückmeldung.
Dann eine gute nächste Woche.
4,88 ist in Ordnung.
Grüße Uwe

Serenifly

4,88V ist was man normal von USB bekommt. Wenn man den Arduino mit einem Netzteil versorgt hat man richtige 5V

Shane93

Mein Uno hat sich letztens leider wieder aufgehängt, trotz guter Betriebsspannungswerte, ich weiss daher nicht was das Problem sein könnte und werde daher wohl eine Möglichkeit finden müssen, wie ich den Uno regelmäßig neustarten kann.

Go Up