Forum: Mikrocontroller und Digitale Elektronik STM32 ADC Modus


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Werner (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum,

ich bin gerade dabei bei einem STM32F303 (64Pins) ADC Werte auszulesen. 
Für einen Wert ist das kein Problem. Was sich als Problem rausstellt, 
ist die zyklische Abfrage von ADC Werten von ADC1. Auf der Tutorialseite 
http://www.diller-technologies.de/stm32.html steht im Kapitel 13.3 
beschrieben, wie man mehrere Kanäle auslesen kann. Dies funktioniert wie 
dargestellt leider nicht. Zum Beispiel kann 
ADC_InitStructure.ADC_ScanConvMode = ENABLE; nicht aufgerufen werden.
(Laut AN3116 sollte es durch den Multichannel (scan) continuous 
conversion mode möglich sein das wie auf der Diller Seite zu lösen)
Meine Fragen:
1) Gibt einen solchen Modus überhaupt noch?
2)Welchen Mode stelle ich ein, wenn ich die Kanäle des ADC1 abfragen 
will (ADC_Channel_6- ADC_Channel_9) Mode_Independent ist es laut 
stm32f30x_adc.h File nicht, weil dieser nicht explizit als ADC Multi ADC 
mode gekennzeichnet ist.

Vielen Dank für euren Input.

von Jim M. (turboj)


Bewertung
0 lesenswert
nicht lesenswert
Du hast einen Fehler in Zeile 42 gemacht.

Im Ernst: Wie sollen wir Dir helfen, wenn wir Deinen Source Code nicht 
sehen?

von Werner (Gast)


Bewertung
0 lesenswert
nicht lesenswert
1
/* Configure the ADC clock */
2
  RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div2);
3
4
  /* Enable ADC1 clock */
5
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12, ENABLE);
6
7
8
9
  /* Setup SysTick Timer for 1 µsec interrupts  */
10
  if (SysTick_Config(SystemCoreClock / 10000))
11
  {
12
    /* Capture error */
13
    while (1)
14
    {}
15
  }
16
17
  /* ADC Channel configuration */
18
   /* GPIOC Periph clock enable */
19
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
20
21
  /* Configure ADC Channel7 as analog input */
22
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 ;
23
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
24
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
25
  GPIO_Init(GPIOC, &GPIO_InitStructure);
26
27
28
  ADC_StructInit(&ADC_InitStructure);
29
30
  /* Calibration procedure */
31
  ADC_VoltageRegulatorCmd(ADC1, ENABLE);
32
33
  /* Insert delay equal to 10 µs */
34
 // Delay(10);
35
36
  ADC_SelectCalibrationMode(ADC1, ADC_CalibrationMode_Single);
37
  ADC_StartCalibration(ADC1);
38
39
  while(ADC_GetCalibrationStatus(ADC1) != RESET );
40
  calibration_value = ADC_GetCalibrationValue(ADC1);
41
42
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
43
 /* ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode;
44
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
45
  ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_OneShot;
46
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = 9;*/
47
48
  ADC_CommonInit(ADC1, &ADC_CommonInitStructure);
49
50
  ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Enable;
51
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
52
  ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_0;
53
  ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_None;
54
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
55
  ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable;
56
  ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Disable;
57
  ADC_InitStructure.ADC_NbrOfRegChannel = 2;
58
  ADC_Init(ADC1, &ADC_InitStructure);
59
60
  /* ADC1 regular channel6 configuration */
61
  ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 1, ADC_SampleTime_19Cycles5);
62
  ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 2, ADC_SampleTime_19Cycles5);
63
64
  /* Enable ADC1 */
65
  ADC_Cmd(ADC1, ENABLE);
66
67
  /* wait for ADRDY */
68
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY));
69
70
  /* Start ADC1 Software Conversion */
71
  ADC_StartConversion(ADC1);
72
73
 /* Infinite loop */
74
 while (1)
75
  {
76
    /* Test EOC flag */
77
    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
78
79
    /* Get ADC1 converted data */
80
    ADC1ConvertedValue =ADC_GetConversionValue(ADC1);
81
82
    /* Compute the voltage */
83
    ADC1ConvertedVoltage = (ADC1ConvertedValue *3000)/0xFFF;
84
85
86
87
88
  }
89
}

Hier ist der geforderte Code, allerdings geht es mir nicht darum das man 
sagt ja hier ist der Fehler sondern das ich ein allgemeines Verständnis 
für die Problematik bekomme, sonst schreibe ich in ein paar Wochen 
wieder.... Mir ist klar das hier der Teil nicht funktionieren kann. 
Allerdings zeigt mir der Debugger an das er die Variable nicht lesen 
kann.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.