Forum: Mikrocontroller und Digitale Elektronik ADC1 beim STM32H750


von Dieter (Gast)


Lesenswert?

Der ADC1 soll kontinuierlich ADC_INP16 wandeln und in ADC1->DR ablegen. 
Der folgende Code startet nur eine einzelne Messung.
1
#define ANALOG_IN       3
2
#define ADC_PA0_KANAL  16               // ADC1_INP16
3
4
void adc1_init(void)
5
{
6
  RCC->AHB4ENR |= RCC_AHB4ENR_GPIOAEN;  // PortA aktivieren
7
  RCC->AHB1ENR |= RCC_AHB1ENR_ADC12EN;  // dto. ADC_12
8
  RCC->D3CCIPR |= RCC_D3CCIPR_ADCSEL_1; // per_clk ADC_12 enable
9
  
10
  GPIOA->MODER |= ANALOG_IN;        // PA0 analog IN
11
12
  ADC12_COMMON->CCR = 
13
                ADC_CCR_PRESC_3 |   // Vorteiler /32
14
                ADC_CCR_CKMODE_1;   // Takt von per_clk
15
  
16
  ADC1->CR =    ADC_CR_BOOST |
17
                ADC_CR_ADVREGEN ;
18
  ADC1->SQR1 =  ADC_PA0_KANAL << ADC_SQR1_SQ1_Pos; // Eingangsanwahl
19
 
20
  ADC1->CFGR =  ADC_CFGR_RES_1 |    // 12 Bit
21
                ADC_CFGR_JQDIS |
22
                ADC_CFGR_OVRMOD |  
23
                ADC_CFGR_CONT;      // kontinuierlich
24
  ADC1->CR |=   ADC_CR_ADEN |
25
                ADC_CR_ADSTART;
26
}

Habe ich ein Bit vergessen oder muß eine andere Reihenfolge gewählt 
werden?

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Du musst die Daten abholen, wenn sie fetig sind und dann den ADC neu 
starten.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

ISR oder DMA ist der übliche Weg, um sowas kontinuierlich im Hintergrund 
zu machen. Einmal gezündet, finde ich die DMA praktisch, ist aber für 
nur einen Kanal vllt. etwas Overkill.
Also ISR...

von Ingo Less (Gast)


Lesenswert?

Uwe B. schrieb:
> Du musst die Daten abholen, wenn sie fetig sind und dann den ADC neu
> starten.
Das klingt etwas sinnfrei, findest du nicht? Warum sollte der H7 keinen 
permante Wandlung können? Ein F4 kann das...

von Dieter (Gast)


Lesenswert?

Beim F4 und F7 läuft der ADC frei durch; kein Grund per ISR oder DMA die 
Daten zu lesen. Nur der H7 scheint bockig zu sein.

von Ingo Less (Gast)


Lesenswert?

Dieter schrieb:
> Nur der H7 scheint bockig zu sein.
Das sehe ich auch so, deine Konfiguration ist erstmal in Ordnung, aber 
es scheint ihm irgendwas zu fehlen. Lösche einfach mal das EOC-Flag und 
schaue, ob er danach ne weitere Wandlung startet, falls ja hast du ne 
Spur.

von Ingo Less (Gast)


Lesenswert?

Kannst mich ja mal auf dem Laufenden halten, woran es liegt wenn du den 
Fehler gefunden hast bzw. dein Workarount dazu. Hast du schonmal n Blick 
in die Errata geworfen?

von Dieter (Gast)


Lesenswert?

In den Errata steht nichts Relevantes. Die Statusbits zu löschen bringt 
nichts. Da habe ich schon Einiges erfolglos probiert.

von Ingo Less (Gast)


Lesenswert?

Guckst du mit nem Debugger ins Datenregister oder liest du es wirklich 
aus?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Dieter schrieb:
> Beim F4 und F7 läuft der ADC frei durch; kein Grund per ISR oder DMA die
> Daten zu lesen.

Oh doch. Spätestens beim zweiten Kanal gehts nicht mehr ohne.

von Ingo Less (Gast)


Lesenswert?

Matthias S. schrieb:
> Oh doch. Spätestens beim zweiten Kanal gehts nicht mehr ohne.
Davon ist aber bei ihm nicht die Rede...

von Dieter (Gast)


Lesenswert?

Herausgefunden habe ich, dass
1
  ADC12_COMMON->CCR = 
2
                ADC_CCR_PRESC_3 |   // Vorteiler /32
3
                ADC_CCR_CKMODE_1;   // Takt von per_clk
doppelt gemoppelt ist. ADC_CCR_CKMODE_1 muss entfallen!
Jetzt läuft der ADC durch.
Freude kommt dennoch nicht auf: Die Kanalanwahl funktioniert nicht. 
Egal, was ich am vorgesehen Eingang anlege, der Messwert wackelt 
irgendwo bei 400.
Ein richtiges Kuckucksei dieser H750.

Matthias S. schrieb:
> Oh doch. Spätestens beim zweiten Kanal gehts nicht mehr ohne.

Habe ich letztens beim F746 auch gemacht; kein Problem!

von Ingo Less (Gast)


Lesenswert?

Dieter schrieb:
> Egal, was ich am vorgesehen Eingang anlege, der Messwert wackelt
> irgendwo bei 400.
Klingt für mich als sein keine Signalmasse angeschlossen bzw. der ADC 
hat keinen Bezug zum Signal.

> ADC_CCR_CKMODE_1 muss entfallen!
Demnach läuft er jetzt im Asynchronous Mode? Oder hast du einen anderen 
Synchronous Mode gewählt?

von Dieter (Gast)


Lesenswert?

Ingo Less schrieb:
> Klingt für mich als ..

Bitte glaube mir, ich weiß an welcher Seite man einen Lötkolben anfasst.
Gerne hätte ich einen Link auf ein funktionierendes Beispiel. Aber bitte 
keinen HAL-Kram!

von STM32-EXPERTE (Gast)


Lesenswert?

Kleiner Hinweis:
Schau dir mal das Register ADCx->PCSEL an.

RM0433, 24.4.12 Channel preselection register (ADC_PCSEL)
For each channel selected through SQRx or JSQRx, the corresponding 
ADC_PCSEL bit must be previously configured.

von Johnny B. (johnnyb)


Lesenswert?

Dieter schrieb:
> Gerne hätte ich einen Link auf ein funktionierendes Beispiel. Aber bitte
> keinen HAL-Kram!

Tja; mit Cube und HAL läuft der ADC normalerweise gleich out-of-the-box.
Darum trotzdem der Tipp, es erst mit Cube und HAL zu versuchen.

von Dieter (Gast)


Lesenswert?

STM32-EXPERTE schrieb im Beitrag #6157219:
> Schau dir mal das Register ADCx->PCSEL an.

Vielen Dank. Zwischenzeitlich hatte ich es auch schon gefunden.
Anschließend gab es gleich neue Probleme. In ADC1->SMPR2 lässt sich die 
Sampling-Zeit nur auf 0 oder 1 einstellen. Längere Zeiten stoppen den 
ADC.
Beim Versuch, eine automatische Mittelwertbildung über ADC1->CFGR2 
einzustellen, bleibt der ADC ebenfalls stehen.
Hast du dazu noch einen STM32-Expertentipp?

Johnny B. schrieb:
> Tja; mit Cube und HAL läuft der ADC normalerweise gleich out-of-the-box.

Probiere es aus und berichte, wo in der HAL der Fehler steckt ;-)

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.