Forum: Mikrocontroller und Digitale Elektronik ADC-Kalibrierung ATxmega


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Alfred (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Servus Controller Freaks,

Ich will den ADC des ATxmega-Controllers benutzen und verwende den 
ImageCraft
C-Compiler, den ich seit Jahren benutze.

Der ADC muß kalibriert werden, es muß dabei irgendwie ein Offset-Wert 
aus
dem Flash ausgelesen werden und in bestimmte ADC-Register geschriebne 
werden.

In meinemm Compiler Handbuch kann ich nichts darüber finden,
auch im Internet kein Erfolg.

Ich hab auch schon die Demo-Version des Compilers CodeVisionAVR
installiert, dieser kann Initialisierungs-Code generieren,
leider bei der EVAL-Version den Code für ADC-Kalibrierung des ATxmega.

Kann mir jemand bei diesem Problem helfen ?

von Timmo H. (masterfx)


Bewertung
0 lesenswert
nicht lesenswert
Wie es mir CodeVisionAVR geht weiß ich jetzt nicht, mit GCC geht es auf 
jeden Fall so:
1
#include <avr/io.h>
2
#include <stdint.h>
3
#include <stddef.h>
4
#include <avr/pgmspace.h>
5
6
uint8_t ReadCalibrationByte( uint8_t index ){
7
  uint8_t result;
8
9
  /* Load the NVM Command register to read the calibration row. */
10
  NVM_CMD = NVM_CMD_READ_CALIB_ROW_gc;
11
  result = pgm_read_byte(index);
12
13
  /* Clean up NVM Command register. */
14
  NVM_CMD = NVM_CMD_NO_OPERATION_gc;
15
16
  return( result );
17
}
18
19
void ADC_init(){
20
21
  //Read factory calibration bytes
22
  ADCA.CALL = ReadCalibrationByte( offsetof(NVM_PROD_SIGNATURES_t, ADCACAL0) );
23
  ADCA.CALH = ReadCalibrationByte( offsetof(NVM_PROD_SIGNATURES_t, ADCACAL1) );
24
  
25
  // more init
26
  //...
27
}

: Bearbeitet durch User
von Peet (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Kann mir einer sagen, wie der Aufruf hierfür aussehen würde? Ich möchte 
den ADC am xmega16D4 kalibrieren

von M. K. (sylaina)


Bewertung
0 lesenswert
nicht lesenswert
Peet schrieb:
> Kann mir einer sagen, wie der Aufruf hierfür aussehen würde? Ich möchte
> den ADC am xmega16D4 kalibrieren

Wie oben beschrieben ;)

von Peet (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Du hast recht! :)

Sorry habe es übersehen. Allerdings erhalte ich den Fehler:

Error    expected expression before 'NVM_PROD_SIGNATURES_t'

Was stimmt hier nicht??

von Timmo H. (masterfx)


Bewertung
0 lesenswert
nicht lesenswert
Peet schrieb:
> Was stimmt hier nicht??
Das kann man dir erst sagen wenn du deinen Code zeigst

von Peet (Gast)


Bewertung
0 lesenswert
nicht lesenswert
OK, habe die includes vergessen. Das wäre also geklärt.

Dennoch habe ich ein Offset-Problem. Durch die Kalibrierung oben erhalte 
ich keine Besserung. Bei Ref VCC/1,6 habe ich bis zu 200mV Offset. Woran 
kann das liegen?

Als Grundlage dient mir der ADC-Code (nicht die Kalibrierung weiter 
unten): https://www.kampis-elektroecke.de/?page_id=1644

... Allerdings mit 8Bit Auflösung

von Hagen R. (hagen)


Bewertung
0 lesenswert
nicht lesenswert
Arbeitest du beim ADC single ended? Wenn ja dann musst du einen Offset 
von AREF * 0.05 laut Datenblatt einplanen. Im XMEGA AU Manual auf Seite 
353 unter der Rubrik "ADc Singel-Ended Measurement" kannst du das 
nachlesen.

von Timmo H. (masterfx)


Bewertung
0 lesenswert
nicht lesenswert
Wenn du es genauer als den typtischen im Datenblatt angegebenen Offset 
haben willst musst du es händisch machen, so wie hier beschrieben:
http://ww1.microchip.com/downloads/en/AppNotes/00002535A.pdf

http://ww1.microchip.com/downloads/en/appnotes/atmel-2559-characterization-and-calibration-of-the-adc-on-an-avr_applicationnote_avr120.pdf

von Joachim B. (jar)


Bewertung
0 lesenswert
nicht lesenswert
du kannst doch im Messbereich eine Kennlinie aufnehmen

für jeden ADC Wert gibt es eine Spannung, normalerweise sollte da die 
Geradengleichung passen, also passende Wertpaare aussuchen.

dann Steigung und Offset ermitteln und als Konstante in den flash mit 
PROGMEM oder __flash

von M. K. (sylaina)


Bewertung
0 lesenswert
nicht lesenswert
Joachim B. schrieb:
> du kannst doch im Messbereich eine Kennlinie aufnehmen
>
> für jeden ADC Wert gibt es eine Spannung, normalerweise sollte da die
> Geradengleichung passen, also passende Wertpaare aussuchen.
>
> dann Steigung und Offset ermitteln und als Konstante in den flash mit
> PROGMEM oder __flash

Warum? Die, während der Produktion des Xmegas festgestellten und 
einprogrammierten, Kalibrierwerte zu verwenden ist jetzt zu leicht oder 
zu einfach?

von Joachim B. (jar)


Bewertung
0 lesenswert
nicht lesenswert
M. K. schrieb:
> Warum? Die, während der Produktion des Xmegas festgestellten und
> einprogrammierten, Kalibrierwerte zu verwenden ist jetzt zu leicht oder
> zu einfach?

kann machen wer mag, ich mache das lieber mit meiner Schaltung und 
angeschlossenen Bauteile, Spannungsteiler o.ä.
Mich interessiert aber meist nur ein kleiner Ausschnitt, z.B. VCC oder 
Ibat in einem kleinen Wertebereich.

Es ist ziemlich selten das nichts weiter am ADC Eingang hängt und eine 
komplette Fehlerrechnung aller Toleranzen mag ich auch nicht.

: Bearbeitet durch User
von M. K. (sylaina)


Bewertung
0 lesenswert
nicht lesenswert
Wie gesagt, ich lese immer die Kalibrationsbytes aus bei den Atxmegas. 
Die Werte stecken da ja schon drin ;)
1
void ADCA_Cal(void)
2
{
3
   ADCA.CALL =
4
   LeseKalibrationsbyte(offsetof(NVM_PROD_SIGNATURES_t,    
5
   ADCACAL0));
6
   ADCA.CALH =
7
   LeseKalibrationsbyte(offsetof(NVM_PROD_SIGNATURES_t,    
8
   ADCACAL1));
9
}
10
 
11
int LeseKalibrationsbyte(int Index)
12
{
13
   int result;
14
 
15
   NVM_CMD = NVM_CMD_READ_CALIB_ROW_gc;
16
   result = pgm_read_byte(Index);
17
   NVM_CMD = NVM_CMD_NO_OPERATION_gc;
18
   return(result);
19
}

Geht schneller, ist einfacher und genauso genau wie ein manuelles 
Kalibrieren.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.