Forum: Mikrocontroller und Digitale Elektronik Problem mit ADC von AT32UC3C1128C


von Heinrich (Gast)


Lesenswert?

Hallo,
ich verwende den AT32UC3C mit AVRStudio6.1 und hab ein Problem mit dem 
ADC:

ich verwende eine externe Referenzspannung (ADCREF0) und will 2 Werte 
einlesen (ADCIN0, ADCIN1, PinsPA04 und PA05).

die von Atmel bereitgestellte library adcifa.h hab ich inkludiert.

Code:
1
int16_t adc_value[2];
2
3
adcifa_sequencer_opt_t local_seq_options;  // for copy of options in init -> need for funktion GetAdcValue
4
5
static const gpio_map_t TEC_CONTROL_GPIO_MAP = {
6
  {AVR32_ADCIN0_PIN, AVR32_ADCIN0_FUNCTION},
7
  {AVR32_ADCIN1_PIN, AVR32_ADCIN1_FUNCTION},  
8
  {AVR32_ADCREF0_PIN, AVR32_ADCREF0_FUNCTION}
9
  };  
10
11
  // ADC config
12
  adcifa_opt_t adc_options = {
13
    .frequency= 100000,  // internal ADC frequency
14
    .reference_source  = ADCIFA_ADCREF0,  // external reference ADC Ref 0  
15
    .sample_and_hold_disable  = false,
16
    .single_sequencer_mode  = false,
17
    .free_running_mode_enable  = false,
18
    .sleep_mode_enable    = false
19
    
20
  };
21
22
  //ADC sequencer config
23
  adcifa_sequencer_opt_t adc_sequencer_options = {
24
    .convnb  = 2,
25
    .resolution= ADCIFA_SRES_10B,
26
    .trigger_selection  = ADCIFA_TRGSEL_SOFT,
27
    .start_of_conversion= ADCIFA_SOCB_ALLSEQ,
28
    .sh_mode  = ADCIFA_SH_MODE_OVERSAMP,
29
    .half_word_adjustment= ADCIFA_HWLA_NOADJ,
30
    .software_acknowledge= ADCIFA_SA_NO_EOS_SOFTACK
31
  };
32
33
        local_seq_options = adc_sequencer_options;
34
35
36
  adcifa_sequencer_conversion_opt_t adc_seq_conv_opt[2] = {
37
    {
38
      .channel_n= AVR32_ADCIFA_INN_GNDANA,
39
      .channel_p= AVR32_ADCIFA_INP_ADCIN0,
40
      .gain  = ADCIFA_SHG_1,      
41
    },
42
    {
43
      .channel_n= AVR32_ADCIFA_INN_GNDANA,
44
      .channel_p= AVR32_ADCIFA_INP_ADCIN1,
45
      .gain  = ADCIFA_SHG_1,
46
    },    
47
48
  };
49
50
gpio_enable_module(TEC_CONTROL_GPIO_MAP, sizeof(TEC_CONTROL_GPIO_MAP) / sizeof(TEC_CONTROL_GPIO_MAP[0]));
51
adcifa_configure(&AVR32_ADCIFA,&adc_options,CPU_SPEED);
52
adcifa_configure_sequencer(&AVR32_ADCIFA,0,&adc_sequencer_options,adc_seq_conv_opt);
53
54
adcifa_start_sequencer(&AVR32_ADCIFA,0);
55
56
57
void GetAdcValue()
58
{
59
  adcifa_start_sequencer(&AVR32_ADCIFA,0);
60
  adcifa_get_values_from_sequencer(&AVR32_ADCIFA,0,&local_seq_options,adc_value);
61
}

Die Funktion GetAdecValue ruf ich von einem anderen modul auf, mit der 
will ich die ADC Werte holen, die an den beiden Pins anliegen.

´Die externe Referenzspannung an ADCREF0 ist 2,5V, die CPUFrequenz 
(CPU_SPEED) 64MHz. An den beiden Pins liegen ca 250mV an, also 1/10 der 
Referenzspannung. Wenn ich im Debug Modus im IO View die Register des 
ADCIFA nach der Initialisierung ansehen will, sind alle Bits weiß, also 
nicht gesetzt?! Ich kann auch keines händisch durch draufklicken setzen.
Die beiden Werte von adc_value liegen bei -1880 und -11.


Kann mir jemand sagen, warum das nicht funktioniert?? Bin schon langsamn 
am verzweifeln...
Vielen Dank!!

von Heinrich (Gast)


Lesenswert?

Hmmm, keiner eine Idee?

Das komische ist, dass ich im Debug Modus kein Bit im Register durch 
Anklicken setzen kann und es sind im ADCIFA alle Bits in allen Registern 
weiß hinterlegt, d.h. nicht gesetzt... Woran könnte das liegen?

von Heinrich (Gast)


Lesenswert?

Noch eine Zusatzinfo:
Wenn ich die Funktion GetAdcValue() das erste mal aufrufe, bekomme ich 
den Wert wie oben beschrieben: -1880 und -11

Wenn ich die Funktion dann noch 5 mal aufrufe bekomm ich für den ersten 
Wert immer Werte um ca 280 und für den zweiten Wert um ca -7.

Kann sich das jemand erklären?

von Heinrich (Gast)


Lesenswert?

Hier ist das Datenblatt: http://www.atmel.com/Images/doc32117.pdf

Noch eine Info: ich habe zwischen ADCREFP und ADCREFN einen 100n C 
geschalten, ich will nur die ADCREF0 als externe Referent und single 
ended Messungen. Habe ich das richtig verstanden (Seite 1106 im 
Datenblatt), dass bei der single ended messung dann nur 11 statt 12 Bit 
Auflösung verfügbar sind? Dann wäre das max 2048, das würde dann mit dem 
ersten Wert (280) ungefähr passen (hab da noch hohes Rauschen drauf), 
weil 250mV anliegen und die Referenzspannung 2,5V ist.? Das Problem mit 
dem zweiten Wert hab ich nun auch gelöst, liegt nun auch im Bereich des 
ersten, würde also auch passen ("im Bereich", weil das Rauschen 
Wertschwankungen verursacht)...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.