Forum: Mikrocontroller und Digitale Elektronik STM32F2 ADC Dual-mode problem - libopencm3


von Jam B. (jamixxl)


Lesenswert?

Hallo,
Mit dem STM32F2 möchte ich im DualMode ADC-Werte wandeln.
ADC1 und ADC2 im dual mode, jeweils zwei Kanäle, scan mode.
Aber die Werte des ADC2 überschreiben die Werte oder die Konfiguration 
des ADC1.
Kann mir da jemand einen Tipp geben?

ADC1+2:
Scan-mode
Single-conversion
Dual regular simultaneous mode (ADC1 + 2)

Clock is configured, also the ports A,C:

Library: libopencm3

code-->
.
.
.
void init_a2d_1(void)
  {
  /*****  Clock_init  *****/
  rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_ADC1EN); /**< 
Enable internal clock APB2 (60MHZ) for ADC1 */
  rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_ADC2EN); /**< 
Enable internal clock APB2 (60MHZ) for ADC2 */
  rcc_peripheral_enable_clock(&RCC_AHB1ENR, RCC_AHB1ENR_IOPAEN); /**< 
Enable internal clock AHB1 (120MHZ) for analog-input Port A */
  rcc_peripheral_enable_clock(&RCC_AHB1ENR, RCC_AHB1ENR_IOPCEN); /**< 
Enable internal clock AHB1 (120MHZ) for analog-input Port C */

  /*++++++++++++++++++++ gpio_a ++++++++++++++++++++*/
  /*****  Analog, no push/pull to HI or LOW  *****/
  gpio_mode_setup(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO5 | GPIO6 
| GPIO7);
  gpio_mode_setup(GPIOC, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO0 | 
GPIO4);

  /*################################# ADC1 
#################################*/
  /********** SINGLE MODE -> ADC1 ***********/
  /*****  Make sure the ADC doesn't run during config  *****/
  adc_off(ADC1);
  adc_off(ADC2);

  /*****  Prescaler 60MHZ/By2 = 30MHZ  *****/
  adc_set_clk_prescale(ADC_CCR_ADCPRE_BY2);

  /*****  12-bit  *****/
  adc_set_resolution(ADC1, ADC_CR1_RES_12BIT);
  adc_set_resolution(ADC2, ADC_CR1_RES_12BIT);

  /***** Dual mode: regular simultaneous mode *****/
  adc_set_multi_mode(ADC_CCR_MULTI_DUAL_REGULAR_SIMUL);

  /***** single mode *****/
  adc_set_single_conversion_mode(ADC1);
  adc_set_single_conversion_mode(ADC2);

  /***** scan mode *****/
  adc_enable_scan_mode(ADC1);
  adc_enable_scan_mode(ADC2);

  /***** result is stored right-aligned *****/
  adc_set_right_aligned(ADC1); //The result is right_aligned in a 32bit 
result-register
  adc_set_right_aligned(ADC2); //The result is right_aligned in a 32bit 
result-register

  /***** sampling_time from ADC *****/
  adc_set_sample_time_on_all_channels(ADC1, ADC_SMPR_SMP_15CYC);
  adc_set_sample_time_on_all_channels(ADC2, ADC_SMPR_SMP_15CYC);

  /***** eoc interrupt *****/
  adc_enable_eoc_interrupt(ADC1);    //Interrupt
  adc_enable_eoc_interrupt(ADC2);

  /***** set channels to convert via ADC1+2 *****/
  uint8_t groupOfChannnels1[2];
  uint8_t groupOfChannnels2[2];

  groupOfChannnels1[0] = ADC_CHANNEL5;
  groupOfChannnels1[1] = ADC_CHANNEL6;
  groupOfChannnels2[0] = ADC_CHANNEL7;
  groupOfChannnels2[1] = ADC_CHANNEL10;

  /***** regular group (channel selection) *****/
  adc_set_regular_sequence(ADC1, 2, groupOfChannnels1);
  adc_set_regular_sequence(ADC2, 2, groupOfChannnels2);

  /***** Start ADC *****/
  adc_power_on(ADC1);
  adc_power_on(ADC2);

  adc_start_conversion_regular(ADC1);

  /***** NVIC interrupt ADC *****/
  nvic_enable_irq(NVIC_ADC_IRQ);
  nvic_set_priority(NVIC_ADC_IRQ, configMAX_SYSCALL_INTERRUPT_PRIORITY);
}


grüße
Jam

von Florian (Gast)


Lesenswert?

Hallo Jam,

wenn Du Dir von ST die "STM32F4xx_DSP_StdPeriph_Lib_V1.3.0" runterlädst 
gibt es dort unter dem Ordner ADC Beispiele für einen Dual Mode ADC.
Du musst mal schauen ob die für den F4 mit dem F2 laufen. Sonst musst Du 
Dir die Lib für den F2 runterladen und bei den Beispielen schauen.

Gruß
Florian

von Jam B. (jamixxl)


Lesenswert?

Hallo Florian,
Vielen Dank für deinen Tipp.
Die Beispiele haben mir aber nicht weitergeholfen.
Wenn ich mehrere Kanäle über ADC1 wandel, kann ich diese auch mit DMA 
verarbeiten, was in den Beispielen auch angemerkt ist, weil ich ja 
mehrere Kanäle wandeln möchte. Aber bei der Konfiguration für den 
Dual_regular_sim.-Mode (oder auch Triple-Mode) komme ich nicht weiter.
Vielleicht hast du noch einen Tipp?

grüße
Jam

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.