Forum: Mikrocontroller und Digitale Elektronik AVR32 ADC richtig verwenden


von Godi S. (godi22)


Lesenswert?

Hallo,

bin gerade dabei mich in den ADC des AT32UC3A einzulesen.
Dazu habe ich mir schon das Musterbeispiel für das EVK1100 angesehen.

In diesem Beispiel sind alle ADC_CHANNEL's in einem File.
Ich möchte dies aber gerne trennen da ich einmal einen Wert eines 
Potentiometers und einmal einen Motorstrom einlesen möchte.

Kann ich jetzt die Inititialisierung des ADC zweimal ausführen?
Also zb im Musterbeispiel:
GPIO_MAP
1
/** GPIO pin/adc-function map. */
2
const gpio_map_t ADC_GPIO_MAP = {
3
#if defined(EXAMPLE_ADC_TEMPERATURE_CHANNEL)
4
  {EXAMPLE_ADC_TEMPERATURE_PIN, EXAMPLE_ADC_TEMPERATURE_FUNCTION},
5
#endif
6
#if defined(EXAMPLE_ADC_LIGHT_CHANNEL)
7
  {EXAMPLE_ADC_LIGHT_PIN, EXAMPLE_ADC_LIGHT_FUNCTION},
8
#endif
9
#if defined(EXAMPLE_ADC_POTENTIOMETER_CHANNEL)
10
  {EXAMPLE_ADC_POTENTIOMETER_PIN, EXAMPLE_ADC_POTENTIOMETER_FUNCTION}
11
#endif
12
};

Initialisierung:
1
  /* Assign and enable GPIO pins to the ADC function. */
2
  gpio_enable_module(ADC_GPIO_MAP, sizeof(ADC_GPIO_MAP) /
3
      sizeof(ADC_GPIO_MAP[0]));
4
5
  /* Configure the ADC peripheral module.
6
   * Lower the ADC clock to match the ADC characteristics (because we
7
   * configured the CPU clock to 12MHz, and the ADC clock characteristics are
8
   *  usually lower; cf. the ADC Characteristic section in the datasheet). */
9
  AVR32_ADC.mr |= 0x1 << AVR32_ADC_MR_PRESCAL_OFFSET;
10
  adc_configure(&AVR32_ADC);
11
12
  /* Enable the ADC channels. */
13
#if defined(EXAMPLE_ADC_TEMPERATURE_CHANNEL)
14
  adc_enable(&AVR32_ADC, EXAMPLE_ADC_TEMPERATURE_CHANNEL);
15
#endif
16
#if defined(EXAMPLE_ADC_LIGHT_CHANNEL)
17
  adc_enable(&AVR32_ADC, EXAMPLE_ADC_LIGHT_CHANNEL);
18
#endif
19
#if defined(EXAMPLE_ADC_POTENTIOMETER_CHANNEL)
20
  adc_enable(&AVR32_ADC, EXAMPLE_ADC_POTENTIOMETER_CHANNEL);
21
#endif

Meine Idee für Potentiometer:
1
const gpio_map_t poti_ADC_GPIO_MAP =
2
{
3
  {POTENTIOMETER_ADC_PIN, POTENTIOMETER_ADC_FUNCTION}
4
};
5
volatile avr32_adc_t  *poti_adc_gpio_map = &AVR32_ADC;
6
7
8
void poti_init(void) {
9
 // Assign and enable GPIO pins to the ADC function.
10
  gpio_enable_module(poti_ADC_GPIO_MAP, sizeof(poti_ADC_GPIO_MAP) / sizeof(poti_ADC_GPIO_MAP[0]));
11
12
  // Initialize
13
  AVR32_ADC.mr |= 0x8 << AVR32_ADC_MR_PRESCAL_OFFSET;
14
  adc_configure(poti_adc_gpio_map);
15
      
16
  // Enable the ADC channel
17
  adc_enable(poti_adc_gpio_map, POTENTIOMETER_ADC_CHANNEL);
18
}

Und für Motor:
1
const gpio_map_t motor_ADC_GPIO_MAP =
2
{
3
  {MOTOR_ADC_PIN, MOTOR_ADC_FUNCTION}
4
};
5
volatile avr32_adc_t  *motor_adc_gpio_map = &AVR32_ADC;
6
7
8
void motor_init(void) {
9
 // Assign and enable GPIO pins to the ADC function.
10
  gpio_enable_module(motor_ADC_GPIO_MAP, sizeof(motor_ADC_GPIO_MAP) / sizeof(motor_ADC_GPIO_MAP[0]));
11
12
  // Initialize
13
  AVR32_ADC.mr |= 0x8 << AVR32_ADC_MR_PRESCAL_OFFSET;
14
  adc_configure(motor_adc_gpio_map);
15
         
16
  // Enable the ADC channel
17
  adc_enable(motor_adc_gpio_map, POTENTIOMETER_ADC_CHANNEL);
18
}

Kann ich dies so Trennen?

Was passiert wenn ich USE_ADC_8_BITS definiere? Werden dann alle 
channels auf 8 bit gesetzt oder kann man sich das aussuchen welcher 
channel 8-bit oder 10-bit Auflösung hat?

Des weiteren ist mit das mit der "Prescaler Rate Selection" noch nicht 
klar.
Also ich habe die CPU frequenz auf 60MHz eingestellt.
Weiters steht im Handbuch:
ADC Clock Frequency 10-bit resolution mode 5 MHz
ADC Clock Frequency 8-bit resolution mode 8 MHz
und
ADCClock = CLK_ADC / ( (PRESCAL+1) * 2 )

Ist mit CLK_ADC 5 (bzw 8) MHz gemeint oder die Taktrate der CPU?
Welchen Wert für PRESCAL sollte ich jetzt verwenden?

godi

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.