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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.