mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 ADC mit DMA


Autor: pxc (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche gerade den ADC meines STM32F072RB so einzurichten, dass er 
einmal meine 4 ADC-Kanäle durchscannt und dann wartet bis er erneut dazu 
aufgefordert wird. Das Ganze mit Hilfe des DMA, das einfach nur ein 
Array füllen soll und bei neuer Messung dies einfach nochmal 
überschreibt.

Leider sind die Beispiele von ST teilweise sehr verwirrend, ich habe mir 
jetzt vieles aus einem Beispiel zusammengefügt das permanent und ohne 
neue Aufforderung scannt.


Meine Frage ist, wie triggere ich jetzt den ADC, dass er eine Messung 
startet (und nach 4 Werten aufhört)? Weiß jemand weiter?

Diese main.c ist natürlich nur zum testen dieser ADC mit DMA Geschichte, 
die echte main würde einmal pro Durchgang in die Funktion 
triggerADCbla(..) springen und den ADC auffordern zu messen.

Autor: pxc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit ADC_StartOfConversion scheint er zumindest schonmal etwas richtig zu 
machen. Wenn ich 3,3V an PA0 anlege gibt er in ADC_ConvertedValue[0] 
4095 aus, die anderen werte sollten 0 sein, sind aber alle zwischen 
11xx-27xx.

Gebe ich die 3,3V auf den PA1 springt ADC_ConvertedValue[0] auf 0 (was 
er auch soll) und ADC_ConvertedValue[1] auf 4095 was auch korrekt ist. 
Die anderen beiden (PB0 und PB1) zeigen Quatsch an.

Bei 3,3V auf PB0 und PB1 wird immer noch ein gezappel zwischen 1100-2200 
angezeigt und ADC_ConvertedValue[1] ist ebenfalls auf einem Unsinnswert.



uint16_t ADC_ConvertedValue[5];

int main(void){
  
  uint32_t i;
  
  vInitGPIO();
  vInitADCwithDMA();
  vInitDMAChannelForADC();
  
  while(1){
    
           ADC_StartOfConversion(ADC1);
    
           for (i = 0; i < 1000000; i++){}
    
           /* Test DMA1 TC flag */
           while((DMA_GetFlagStatus(DMA1_FLAG_TC1)) == RESET ); 
    
           /* Clear DMA TC flag */
           DMA_ClearFlag(DMA1_FLAG_TC1);
    
  }
  

}

Autor: pxc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es muss natürlich
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); // B heißen, anstatt A




Leider zeigen PA1, PB0 und PB1 immer noch undefinierte Werte.

Autor: Nop (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sicher, daß das hier so sein soll:
// settings for each ADC channel
  ADC_ChannelConfig(ADC1, ADC_Channel_0, ADC_SampleTime_13_5Cycles);
  ADC_ChannelConfig(ADC1, ADC_Channel_1, ADC_SampleTime_13_5Cycles);
  ADC_ChannelConfig(ADC1, ADC_Channel_8, ADC_SampleTime_13_5Cycles);
  ADC_ChannelConfig(ADC1, ADC_Channel_9, ADC_SampleTime_13_5Cycles);

Also daß immer ADC1 dasteht?

Autor: pxc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nop schrieb:
> Sicher, daß das hier so sein soll:
>
>
// settings for each ADC channel
>   ADC_ChannelConfig(ADC1, ADC_Channel_0, ADC_SampleTime_13_5Cycles);
>   ADC_ChannelConfig(ADC1, ADC_Channel_1, ADC_SampleTime_13_5Cycles);
>   ADC_ChannelConfig(ADC1, ADC_Channel_8, ADC_SampleTime_13_5Cycles);
>   ADC_ChannelConfig(ADC1, ADC_Channel_9, ADC_SampleTime_13_5Cycles);
>
> Also daß immer ADC1 dasteht?

Ja.

void ADC_ChannelConfig(ADC_TypeDef* ADCx, uint32_t ADC_Channel, uint32_t 
ADC_SampleTime)

ADCx ist das Peripheral und da mein Controller nur einen ADC hat ist es 
ADC1.

Autor: pxc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Komme dem Rätsel vielleicht auf die Spur, aber stehe trotzdem auf dem 
Schlauch.

Habe jetzt mal tatsächlich an den Pins gemessen. Es liegen Spannungen an 
ihnen an, ohne dass etwas angeschlossen ist. Da es ein Discovery Board 
ist, dachte ich an Chips, die eventuell mit den Pins verbunden sind, 
aber selbst Pins die einfach frei sind haben eine Spannung... Wie kann 
das sein, wenn der Pin als Analog Input konfiguriert wird und kein 
Pullup/Pulldown aktiviert wird?

Autor: Matthias S. (Firma: matzetronics) (mschoeldgen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
pxc schrieb:
> Wie kann
> das sein, wenn der Pin als Analog Input konfiguriert wird und kein
> Pullup/Pulldown aktiviert wird?

Es gibt nur einen internen S&H Kondensator für einen ADC, auch wenn er 
mehrere Kanäle hat.
Der Eingangsmultiplexer verbindet damit die Ladung des S&H von einem 
Eingang mit einem anderen Eingang. Das ist auch der Grund, warum solche 
ADC Eingänge niederohmig angetrieben werden sollen, der S&H Kondensator 
muss während der Samplephase komplett aufgeladen werden.
Legst du die unbenutzten ADC Kanäle auf Masse, werden sie 0 anzeigen, 
wie erwartet.

: Bearbeitet durch User
Autor: pxc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber wenn nichts angeschlossen ist, sollte man doch eigentlich 0 
erwarten, da der Kondensator für jeden einzelnen Channel den er sampelt 
neu geladen werden muss. Oder sehe ich das falsch?

Trotzdem haben die ADC Pins 1 - 1,5V, ohne dass überhaupt irgendwas 
angeschlossen ist.

Autor: Matthias S. (Firma: matzetronics) (mschoeldgen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
pxc schrieb:
> da der Kondensator für jeden einzelnen Channel den er sampelt
> neu geladen werden muss.

Es ist niemand da, der ihn entladen würde. Auf der einen Seite ein 
hochohmiger ADC, auf der anderen Seite ein offener Eingang, bzw. nur 
dein Messgerät. Der Kondensator wird umgeladen, wenn er auf einen 
beschalteten Eingang kommt. Der Treiber für diesen Eingang lädt, bzw. 
entlädt den Kondensator.

Autor: Emil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie macht man das bei den STM32 dann eigentlich, wenn man eine 
Kabelbrucherkennung an einem ADC realisieren möchte? Ein Pull-Down ist 
wahrscheinlich keine gute Idee. Bei den kleinen Atmels geht das einfach 
so. Nichts angeschlossen und der ADC zeigt 0.

Autor: pxc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matthias S. schrieb:
> pxc schrieb:
>> da der Kondensator für jeden einzelnen Channel den er sampelt
>> neu geladen werden muss.
>
> Es ist niemand da, der ihn entladen würde. Auf der einen Seite ein
> hochohmiger ADC, auf der anderen Seite ein offener Eingang, bzw. nur
> dein Messgerät. Der Kondensator wird umgeladen, wenn er auf einen
> beschalteten Eingang kommt. Der Treiber für diesen Eingang lädt, bzw.
> entlädt den Kondensator.

Okay, ein Kanal an GND und einer an 3,3V liefert schonmal das was man 
erwarten würde. Ich denke das wird wohl das Problem gewesen sein. Danke 
dir für den Hinweis, man lernt nie aus...

Autor: Matthias S. (Firma: matzetronics) (mschoeldgen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Emil schrieb:
> Nichts angeschlossen und der ADC zeigt 0.

Das nehme ich dir nicht ab. Probier mal mehr als einen Kanal einzulesen 
und lass einen Nachbar Kanal frei. (Wohlgemerkt, nicht die Tinys mit dem 
eingebauten Opamp). Du wirst sehen, das der Nachbarkanal vom 
angesteuerten Kanal 'mitgezogen' wird.

> Wie macht man das bei den STM32 dann eigentlich, wenn man eine
> Kabelbrucherkennung an einem ADC realisieren möchte?

Da es für kritische Anwendungen sein muss, würde ich in einem solchen 
Fall den ADC immer mit einem Buffer treiben, also z.B. mit einem OpAmp.

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.