Das ganze liefert wunderbar die gewünschten Werte, wenn ich die ADC
Werte vor und hinter einem Shunt Widerstand einzeln abfrage
1
uint16_tVccRaw(void){
2
AdStartAvccRef(ADPRESCALER,4);//+5V Vcc
3
uint32_tad=AdGet();
4
returnad;
5
}
6
7
//directly the AD converter value
8
uint16_tDropRaw(void){
9
AdStartAvccRef(ADPRESCALER,5);//+5V - charger drop voltage
10
uint32_tad=AdGet();
11
returnad;
12
}
Ergibt 318 im 1. Fall und 283 für DropRaw.
Aber
1
uint16_tSensorsBatterycurrentGet(void){
2
AdStartExtRef(ADPRESCALER,0x15);//pos: PA5, neg: PA6, gain: 1x (0x2D has the same settings)
3
uint16_tad=AdGet();
4
returnad;
5
}
ist beharrlich 0.
Wieso?
Das ganze läuft auf einem ATtiny861A (der ADC4 ist hier PA5 und ADC5 ist
hier PA6). Laut Datenblatt müsste mit channel = 0x15 oder 0x2D beides
mal ADC4 als positiven und ADC5 als negativer Eingang ausgewählt
werden.
uint32_t macht keinen Sinn.
Bei älteren AVR muss man 1 ms warten, wenn die interne Referenz
eingeschaltet wird. Normalerweise verwirft man auch das erste Ergebnis
nach Mux-Umschaltung. Für beides gibt es Hinweise, die gut versteckt
sind.
Ja schrieb:> Bei älteren AVR muss man 1 ms warten, wenn die interne Referenz> eingeschaltet wird. Normalerweise verwirft man auch das erste Ergebnis> nach Mux-Umschaltung. Für beides gibt es Hinweise, die gut versteckt> sind.
Ich nutze für die Messung eine externe Referenz mit 2V. Und direkt davor
nutze ich die selbe Referenz erfolgreich für eine andere Messung, das
kann es also nicht sein.
Die interne Referenz nutze ich übrigens für die Chiptemperatur und
funktioniert ebenfalls einwandfrei.
Malte _. schrieb:> Ich nutze für die Messung eine externe Referenz mit 2V. Und direkt davor> nutze ich die selbe Referenz erfolgreich für eine andere Messung, das> kann es also nicht sein.>> Die interne Referenz nutze ich übrigens für die Chiptemperatur und> funktioniert ebenfalls einwandfrei.
Mal 'ne Frage nebenbei: um welchen AVR geht es denn eigentlich konkret?
Gerade im Bereich ADC gibt es da im Detail doch deutliche Unterschiede,
auch wenn das Grundkonzept immer dasselbe ist.
Meiner Meinung nach hast du das in diesem Thread bisher nirgendwo
mitgeteilt...
Special care should be taken when changing differential channels. Once a differential channel
2
has been selected the input stage may take a while to stabilize. It is therefore recommended to
3
force the ADC to perform a long conversion when changing multiplexer or voltage reference settings. This can be done by first turning off the ADC, then changing reference settings and then
4
turn on the ADC. Alternatively, the first conversion results after changing reference settings
5
should be discarded.
1
ADCSRA=0;
2
waitms(1);
3
AdStartExtRef(ADPRESCALER,0x15);
4
AdStartExtRef(ADPRESCALER,0x15);
5
uint16_tad=AdGet();
Was mit dem Bit "BIN" im ADCSRB-Register? (Umschaltung
bipolar/unipolarer Messmode.) Wenn Du negativ bist, zeigts "0" an? keann
ich jetzt nicht ausprobieren. Kannst ja einfach 128 zum ADCSRB
dazuaddieren, so zum Test. Also; Bit7 setzen
Malte _. schrieb:>> Das ganze läuft auf einem ATtiny861A
OK, jetz habe ich es auch gefunden. Ist ganz einfach mit dem Suchen,
wenn man den Suchbegriff schon kennt ;o)
Also ich denke, Axel R. stochert hier in die richtige Richtung mit
seinem Hinweis. Ansonsten sieht meiner Meinung nach alles korrekt aus.
Axel R. schrieb:> 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 or> voltage reference settings. This can be done by first turning off the> ADC, then changing reference settings and then> turn on the ADC. Alternatively, the first conversion results after> changing reference settings> should be discarded.
Danke, genau das war es. Entweder den ADC vorher ausschalten, oder die
erste Messung nach dem Umschalten verwerfen. Beides funktioniert :)
Ja schrieb:> Für beides gibt es Hinweise, die gut versteckt> sind.
Na ja, wenn man diesen deutlichen und einfach zu findenden Text im sehr
übersichtlichen und kurzen AVR Datenblatt schon als „gut versteckt“
bezeichnet, was machst du dann erst bei „richtigen“ Mikrocontrollern mit
mehreren hundert Seite Doku, verteilt auf zig Dokumente?
Oliver
Oliver S. schrieb:> Na ja, wenn man diesen deutlichen und einfach zu findenden Text im sehr> übersichtlichen und kurzen AVR Datenblatt schon als „gut versteckt“> bezeichnet, was machst du dann erst bei „richtigen“ Mikrocontrollern mit> mehreren hundert Seite Doku, verteilt auf zig Dokumente?
Ich muss zugeben, die AVR Doku eher Quergelesen zu haben.
Übersehen und ein Whitepaper draus machen ;)
https://community.nxp.com/pwmxy87654/attachments/pwmxy87654/imx-processors%40tkb/1722/1/Adeneo%20Embedded%20-%20Technical%20Note%20for%20WEC%20i.MX6%20BSP%20Hang%20Issue.pdf
Um daraus zu zitieren:
> This investigation was done over a period of about 8 months, and Adeneo> Embedded put a committed effort into it to solve the problems. A core team> of engineers worked fulltime on it while an extended group of engineers was> available to support where needed (test, build, debugging, applications,..).> The problems we had to solve here were not trivial;
Das Verhalten des Prozessors stand so übrigens auch in den ~20000 Seiten
Doku. War dort ein Zweizeiler.
Malte _. schrieb:> Das Verhalten des Prozessors stand so übrigens auch in den ~20000 Seiten> Doku. War dort ein Zweizeiler.
Eben. DAS nenne ich versteckt ;)
Oliver