Forum: Mikrocontroller und Digitale Elektronik STM32F429 ADC Wert in Spannung umrechnen


von W. M. (muhh)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich stehe gerade vor einem sehr merkwürdigen Problem. Damals als ich mir 
das STM32F429 IDISCOVERY Board zugelegt habe, hatte ich mit allein 
möglichen Modulen herumgespielt und dazu jeweils Beispielcode 
abgespeichert.

Ich benutze im Moment den ADC1, lese an Pin PC0 (ADC_IN10) einen 
Spannungswert aus und möchte diesen in einen Spannungswert umrechnen.

verwendete Umrechnung: ADCWert * (Vref/2^N) mit N=12 [Bit]

In meinem alten Beispielprogramm funktioniert das wunderbar, aber bei 
dem neuen Code passieren seltsame Dinge. Möglicherweise könnt ihr 
erkennen woran das liegt.

Ich verwende die math.h, stdint.h und die Standard Peripheral Drivers 
die mit dem Softwarepaket für das DISCOVERY Board zu downloaden sind.
Im Anhang ein Screenshot von den "gedebuggten" Werten.

Code für die Initialisierung von ADC1:
1
/** Enable peripheral clocks */
2
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
3
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
4
5
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
6
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
7
  ADC_InitStructure.ADC_ExternalTrigConv = 0;
8
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
9
  ADC_InitStructure.ADC_NbrOfConversion = 1;
10
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
11
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
12
13
  ADC_CommonInitStructure.ADC_DMAAccessMode = DISABLE;
14
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
15
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
16
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_10Cycles;
17
18
  ADC_Init(ADC1, &ADC_InitStructure);
19
  ADC_CommonInit(&ADC_CommonInitStructure);
20
21
  ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_112Cycles);
22
23
  ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
24
25
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
26
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
27
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
28
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
29
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
30
  GPIO_Init(GPIOC, &GPIO_InitStructure);
31
32
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
33
  NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQn;
34
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
35
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
36
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
37
  NVIC_Init(&NVIC_InitStructure);
38
  NVIC_EnableIRQ(ADC_IRQn);
39
40
  ADC_Cmd(ADC1, ENABLE);

Code des ISR:
1
void ADC_IRQHandler(void)
2
{
3
  NVIC_ClearPendingIRQ(ADC_IRQn);
4
  ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
5
6
  float_t convval = ADC_GetConversionValue(ADC1);
7
  float_t mathval = 2.954/4096;
8
  float_t calcval = convval*mathval;
9
}

Ich hoffe meine Beschreibung ist einigermaßen verständlich.

Viele Grüße
Willy

: Bearbeitet durch User
von holger (Gast)


Lesenswert?

Setz den Pfeil mal unter die Zeile mit calcval.

von W. M. (muhh)


Angehängte Dateien:

Lesenswert?

Das ist jetzt nicht wahr... Ich danke dir :)
Jetzt würde ich aber gerne wissen, wie dieser komische Wert entsteht.

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

Willy M. schrieb:
> Jetzt würde ich aber gerne wissen, wie dieser komische Wert entsteht.

Dann schau Dir den dazugehörigen Assembler Code an, und überlege was in 
den jeweiligen Registern oder Speicherstellen drin steht.

von Possetitjel (Gast)


Lesenswert?

Willy M. schrieb:

> Jetzt würde ich aber gerne wissen, wie dieser komische
> Wert entsteht.

Welcher komische Wert?

Ich rate aus den Angaben: Der ADC liest einen Wert von 4077 Digit,
bei 2.954V Referenzspannung ist jedes Digit 0.7212mV wert, also
lag eine Spannung von 2.940V am ADC-Eingang an.

Was stimmt daran nicht?

von W. M. (muhh)


Lesenswert?

Possetitjel schrieb:
> Welcher komische Wert?
>
> Ich rate aus den Angaben: Der ADC liest einen Wert von 4077 Digit,
> bei 2.954V Referenzspannung ist jedes Digit 0.7212mV wert, also
> lag eine Spannung von 2.940V am ADC-Eingang an.

Das ist ja richtig :) Aber davor wo ich den Breakpoint auf der 
Berechnung hatte, wurde mir ein Wert von 5e-40 angezeigt. Das war 
komisch ;)

von holger (Gast)


Lesenswert?

>Aber davor wo ich den Breakpoint auf der
>Berechnung hatte, wurde mir ein Wert von 5e-40 angezeigt. Das war
>komisch ;)

Die Zeile auf der der Pfeil steht wurde noch nicht
ausgeführt. Deshalb steht in calcval einfach nur Schrott drin.
Es wurde ja noch kein Wert zugewiesen.

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.