ADC-Kalibrierung ATxmega

Gast #4876717
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 ?
#4876746
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
}
#5612955
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
#5614100
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?
#5614156
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.
#5614166
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

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