Attiny44 Mehrkanalmessung

OP #7496213
Lesenswert?

Hallo,

Ich arbeite derzeit an einem Ladegerät mit 8 USB Ausgängen. Dieses Ladegerät wird gespeist von einem Bleiakku oder auch direkt von einer Solarzelle. Läuft die Schaltung über den Akku ist es wichtig das nur ein USB Port gleichzeitig aktiv ist. Der Akku liefert nur eine begrenzte Stromstärke. Die USB Ports werden vom Mikrocontroller via P-Kanal Mosfets gesteuert. Die Steuerung ermittelt anhand der Stromstärke wann ein abgeschlossenes Gerät voll geladen ist und wechselt dann auf einen anderen USB-Port. Deshalb verwende ich einen ADC Kanal für die Strommessung und einen anderen für die Spannungsmessung.

Nun ist mir aufgefallen das er den Strom korrekt misst aber auf zu niedrige Spannung gar nicht reagiert. Selbst wenn ich den ADC Kanal auf GND ziehe schaltet er nicht ab.

Der ADC läuft im "Single Conversion Mode" mit 62.5Khz. Die entsprechenden Register setze ich zu Beginn des Programmes. In den Abfrageroutinen schalte ich nur ADMUX auf den gewollten Kanal und dann ADCSRA.6 ein damit die Wandlung beginnt.

Ich warte nach dem ADMUX Kanalwechsel sogar noch 10ms und schalte die Wandlung dann erst ein aber trotzdem scheint ein falscher Wert gemessen zu werden. Ich habe des Problem bisher dadurch gelöst daß ich zwei Mal konvertiere also den ersten Wert verwerfe. Nur bei anderen Chips funktioniert es auch ohne doppelt messen und ohne 10ms Pause direkt auf Anhieb richtig zu messen.

Gibt es denn bei den Attiny44 eine Besonderheit weswegen das hier nicht so funktioniert?

Freundliche Grüße

PS: Ich kann auch bei Bedarf das Programm hochladen.

OP #7496239
Lesenswert?

Ah gut danke ich dachte erst an Zeile 41 aber da lag ich ja völlig falsch...

Ich denke meine Frage ist ja sehr allgemein und deswegen das Programm selbst irrelevant.

Ich habe schon einige Programme erstellt welche gut nach dem Schema funktioniert haben. Als Beispiel habe ich den Mega328P nacheinander 6 Kanäle messen lassen, ohne Kunstpausen oder verwerfen von Messungen nach Kanalumstellung.

Grüße

OP #7496266
Lesenswert?

Das es im Datenblatt steht weiß ich nur warum es bei einem Chip geht und den anderen nicht. Das finde ich eben verwunderlich. Die Schaltung ist trivial, an ADC6 ist via Spannungsteiler die Akkuspannung und an ADC7 der ACS712 für Strommessung.

Wie gesagt ich dachte es gibt irgendwo im Chip einen Unterschied der das Verhalten erklären würde. Ich denke ja im 328P ist der gleiche ADC verbaut wie im Tiny44.

#7496289
Lesenswert?

Das bewährte mittel bei "komischen" ADCs ist visualisieren. Egal ob seriell ausgeben und dann per Excel (lange turnaround-Zeiten) oder als Graph/Histogramm/min-max-wert/nur wert auf Display (mit Taster zum Reset-Neustart).

Damit siehst Du direkt

  • ob Nachbarkanäle Einfluss haben
  • Werte zappeln oder feste "Muster" haben, z.b. die untersten 4 Bit immer 0
  • ob es zeitliche Muster gibt (bursts wenn der Lötkolben an geht)
  • ein eingespeistes Signal von 0 bis max gut abgebildet wird
OP #7496322
Lesenswert?

Sldt hat richtig erkannt das ich keine Referenzspannung umschalte sondern lediglich den Kanal wechsle. Nachdem ich den Kanal zweimal Messe stimmt auch alles. Wenn ich morgen Zeit habe kann ich nachmessen ob was schwingt. Aber der Logik nach ist das eigentlich überflüssig weil wenn ich den Kanal auf GND ziehe kann ja nix mehr schwingen. Und selbst da hatte er nichts gemessen.

Ich poste morgen mal den originalen Quellcode vielleicht fällt da auf was ich übersehen hatte.

Das Programm ist übrigens nirgends geklaut. Bin kein Fan von Copy&Paste.

Grüße

#7496411
Lesenswert?

Björn W. schrieb:

Das steht doch im Datenblatt drin das man nach MUX Umschalterei das erste Messergebnis verwerfen soll...

Also ich kann keinerlei solche Angabe finden. Kannst Du bitte mal angeben, wo das stehen soll (Seite, Abschnitt, Zitat).

Lediglich bei der Referenzumschaltung könnte es eventuell möglich sein, daß das Ergebnis fehlerbehaftet ist: "The first ADC conversion result after switching reference voltage source may be inaccurate, and the user is advised to discard this result."

Ich benutze immer mehrere Eingänge und wandele reihum mit perfektem Ergebnis (MUX weiterschalten, Messung starten). Eine Ausnahme ist nur die Bandgap (1,1V), die ist so hochohmig, daß man nach der MUX-Umschaltung warten muß (Delay).

#7496415
Lesenswert?

Differentieller Eingang könnte auch Fehler bewirken: "Special care should be taken when changing differential channels. Once a differential channel has been selected the input stage may take a while to stabilize. It is therefore recommended to force the ADC to perform a long conversion when changing multiplexer settings."

Steht ziemlich versteckt erst bei der Registerbeschreibung. Man muß aber nicht eine komplette Wandlung abwarten, ADEN löschen und setzen reicht.

#7496419
Lesenswert?

In welcher Reihenfolge liest denn BASCOM da die Register?

1
ADC_LOW  = ADCL:ADC_HIGH = ADCH
1
Once ADCL is read, ADC access to data registers is blocked. This means that if ADCL has been read, and a conversion completes before ADCH is read, neither register is updated, and the result from the conversion is lost. When ADCH is read, ADC access to the ADCH and ADCL registers is re-enabled.

Edit: ne vergesst es. Sagt ja nur dass der ADC nicht mehr auf das Register schreiben kann.

#7496508
Lesenswert?

Ich kann kein BASIC - an welcher Stelle im Programm wird ADIF (ADCSRA.4) zurückgesetzt? 'Alternatively, ADIF is cleared by writing a logical one to the flag'

PS: Weshalb wird nicht ausschließlich mit ADSC (ADCSRA.6) gearbeitet? 'ADSC will read as one as long as a conversion is in progress. When the conversion is complete, it returns to zero'

OP #7496866
Lesenswert?

Zurückgesetzt wird der beim Abfragen von ADCH...

Soweit ich weiss...oder beim starten durch ADCSRA.6

Was mir zumindest logisch erscheint.

Möglich wäre theoretisch auch nur mit ADCSRA.6 zu arbeiten. Interessanter Ansatz den ich demnächst mal anwenden werde. Ich habe mich bisher auf das ADIF eingeschossen weil ich meist den ADC im Freerun ausgewertet hatte. Daher wohl eher historisch gewachsen.

Grüße

#7496874
Lesenswert?

Zurückgesetzt ,,, Soweit ich weiss

Da befinden Sie sich im Irrtum - im Datenblatt nachlesen: erfolgt implizit beim Einsprung in die ISR (damit arbeiten Sie aber nicht) oder explizit, wie oben beschrieben.

PS: Ich meine, was hindert Sie daran, statt der Mutmaßungen einfach mal nach jedem 'BITWAIT ADCSRA.4,SET' ein 'ADCSRA.4=1' einzubauen und zu schauen, was passiert?

OP #7501084
Lesenswert?

Ich habe es bereits getestet und mich dazu entschieden in Zukunft nur noch mit Abfrage des ADCSRA.6 zu arbeiten. Das macht mehr Sinn und vermeidet solche Fehler im vorraus.

Bascom kennt auch die direkten Bitnamen der jeweiligen Peripherie. Ich benutze aber immer die Angaben mit Register und Bitnummer. Da weiß man direkt welche Stelle man anschreibt. Das war wichtig für andere Programme die mit PC kommunizieren und Register synchronisieren müssen.

Vielen Dank an alle die zur Fehlersuche beigetragen haben.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren