STM32F2 ADC Dual-mode problem - libopencm3

OP #3822488
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
Gast #3822610
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
OP #3825355
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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.