Forum: Mikrocontroller und Digitale Elektronik STM32F103 / Erste Gehversuche ADC


von Rainer K. (rainerle)


Lesenswert?

Hallo,
ich bin 15 und mache meine ersten gehversuche mit einem DEMOBoard
STM32F103 und C++

Ich habe µVision und den STlink V2 bei mir.

Erste versuche GPIO zu setzen und Rücksetzen , toggeln haben super 
geklappt.

Nun möchte ich an ADC dran. Ich habe  mit ST Cube die Ports PA5,PA6 und 
PA7 als ADC definiert.

Mit Qcube ein Projekt erstellt.
Da kommt folgendes raus:
---------------------------------------------------
/* ADC1 init function */
void MX_ADC1_Init(void)
{

  ADC_ChannelConfTypeDef sConfig;

    /**Common config
    */
  hadc1.Instance = ADC1;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  HAL_ADC_Init(&hadc1);

    /**Configure Regular Channel
    */
  sConfig.Channel = ADC_CHANNEL_6;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  HAL_ADC_ConfigChannel(&hadc1, &sConfig);

---------------------------------------

Jetzt geht es erstmal eine ersten Port zum Auslesen.

Wie muss ich es angehen um z.b.: Port PA5 den ADC Wert auszulesen.

Irgendwie verstehe ich so gar nicht...?

Hilfe :-)

von Rainer K. (rainerle)


Lesenswert?

Damit habe ich im Main angefangen:

//  TEST ADC START
  HAL_ADC_Start(&hadc1);                 // ADC1 Starten
  HAL_ADCEx_Calibration_Start(&hadc1);  // ADC1 calibrieren

  uint32_t rohwert, realwert;           //  DWord ( nicht negativ)
  int32_t  rohwert1;                      //  DWord ( incl. negativ)
  int16_t  endwert;                      //  Word  ( incl. negativ)
  //  TEST ADC ENDE

Im while hab ich:

    // einlesen ADC START
  rohwert = HAL_ADC_GetValue (&hadc1);
  realwert = (250*rohwert) >>12;
    // einlesen ADC Ende


Aber ich verstehe so gar nicht, wo ist mein Port PA5 ??
Muus ich irgendwo den Port PA5 noch definieren ?

von Jojo S. (Gast)


Lesenswert?

Rainer K. schrieb:
> sConfig.Channel = ADC_CHANNEL_6;

da steht er doch. Den PA_5 willst du nicht sondern die Alternate 
Funkction ADC12_IN5.

von Haas (Gast)


Lesenswert?

Nur noch als Zusatzinfo:

Diese beiden Zeilen müssen, zur richtigen Funktionsweise, vertauscht 
werden.

  HAL_ADC_Start(&hadc1);                 // ADC1 Starten
  HAL_ADCEx_Calibration_Start(&hadc1);  // ADC1 calibrieren


   [..]  This section provides functions allowing to:
      (+) Perform the ADC calibration.
@endverbatim
  * @{
  */

/**
  * @brief  Perform an ADC automatic self-calibration
  *         Calibration prerequisite: ADC must be disabled (execute this
  *         function before HAL_ADC_Start() or after HAL_ADC_Stop() ).
  * @note   Calibration factor can be read after calibration, using 
function
  *         HAL_ADC_GetValue() (value on 7 bits: from DR[6;0]).
  * @param  hadc: ADC handle
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_ADCEx_Calibration_Start(ADC_HandleTypeDef* hadc)
{
  .....

von rainerle (Gast)


Lesenswert?

Hallo,

Ja Danke , ja die Funktion ADC_12_IN5 möchte ich von PA5.

Aber  wie muss ich es verstehen das ADC_12_IN5 bedeutet ADC_CHANNEL_6 ?

Ich versthe nicht, wie der Bezug zwischen
ADC_12_IN5 =  ADC_CHANNEL_6 ist.

Was wäre dann z.B.: ADC12_IN6 ?

Liebe Grüsse

von Haas (Gast)


Lesenswert?

Also entweder im Datenblatt nachschauen oder über den CubeMX.

Ich arbeite mit dem STM32F0 deshalb hoffe ich hier ist alles genauso.

Datenblatt:

Hier sieht man für jeden Pin die jeweilige Funktion sowie alternative 
Funktionen.


CubeMX:

Hier einfach bei Pinout unter Perihperals einen ADC (z.B. IN6) anklicken 
dieser erscheint dann auf der Übersicht. Wenn man auf der Übersicht mit 
der Maus über den Pin fährt und STRG drückt werden alle alternativen 
Pins gezeigt (sollte bei adc aber nur einer sein).

Man kann auch einfach mal in der Übersicht die Pins anklicken und sieht 
welche Funktionen dort jeweils möglich sind.

Gruß

von Haas (Gast)


Lesenswert?

Was wäre dann z.B.: ADC12_IN6 ?

Bei M0 heisst das dann ADC_IN6 dies entspricht dann auch ADC_CHANNEL_6.

von rainerle (Gast)


Lesenswert?

Hallo,
Danke.

Ja das mit datenblatt und Qube ist klar.

Ich muss mal anderst fragen.

Wenn ich  mit Qube die Pins PA5, 6 und 7 als ADC1_INx definiert habe und 
den Code erstelle und in µVision aufmache kommt für alle 3 definierten 
ADC Eingänge folgendes unten:

Woher kommt jetzt der Eintrag vom Qube " ADC Channel 6 " ?
Warum taucht nach Qube Projekterstellung kein ADC12_IN5 auf ?

Das verstehe ich nicht.
Habt ihr ein Beispiel wie ich jetzt an die Werte des ADC1_IN5 komme ?


-----------------------------------------------
  hadc1.Instance = ADC1;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  HAL_ADC_Init(&hadc1);

    /**Configure Regular Channel
    */
  sConfig.Channel = ADC_CHANNEL_6;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  HAL_ADC_ConfigChannel(&hadc1, &sConfig);

von Haas (Gast)


Lesenswert?

Habe mir mal das Treiberpacket für F103 heruntergeladen und ein Projekt 
erstellt.

Ich habe Testweise bei ADC1: IN5, IN6 und IN7 angeklickt.

Erstellt wird nur IN5 und ADC_CHANNEL_5.

Um auch die anderen Channels automatisch erstellt zu bekommen, muss man 
unter Configuration auf Parameter Settings und unter 
ADC_Injected_ConversionMode die Number Of Conversions auf 3 stellen. Es 
werden nun automatisch die anderen Channels hinzugefügt.

Allgemein gilt für ADC1 und ADC2
IN5 = ADC_CHANNEL_5 usw.

Gruß

von rainerle (Gast)


Lesenswert?

Super , das wars was mich verwirrt hat.
Bei 3 ADcs kam nur der Channel 6 im Qube Projekt.
Wenn ich nur einen ADC hatte dann hats gestimmt.

Jetzt ist alles klar und die nächsten Unklarheiten können kommen.

Vielen lieben dank  Herr Frau "Haas" :-)

!!!! TOP!!!!

von rainerle (Gast)


Lesenswert?

Nochmal Danke !

Kann jetzt alle 3 Debuggen :-)

Super Tip "Haas" :-)

von W.S. (Gast)


Lesenswert?

rainerle schrieb:
> Jetzt ist alles klar und die nächsten Unklarheiten können kommen.

Vorsicht, mein Lieber.
Du hast zwar jetzt ein Erfolgserlebnis, aber du hast noch nicht den 
eigentlichen Überblick. Den kannst du aber nur bekommen, wenn du dich 
tatsächlich per Referenzmanual in die Funktionsweise der betreffenden 
Peripherie-Cores einliest.

Weißt du, solche Hilfsmittel wie Cube und so mögen ja ganz nett sein, 
aber sie sind nur dann eine echte Hilfe, wenn der Benutzende von sich 
aus über die Materie Bescheid weiß und im Grunde auch ohne Cube usw. 
auskäme. Wer hingegen sowas benutzt, weil er eben nicht weiß, was er wie 
tun soll, der wird damit eher zum Unfähigen. Eben, weil er es sich ja in 
gewissen Grenzen leicht machen kann und Dinge benutzen kann, ohne sie zu 
verstehen und deshalb eher geneigt ist, aus Bequemlichkeit das eigene 
Dazulernen zu vernachlässigen.

Deshalb nochmal: Es ist auf lange Sicht besser, zu lernen die Dinge zu 
verstehen als sich auf den verlockend simplen Weg des Zusammenklickens 
oder Zusammenkopierens zu begeben. Den Spruch vom breiten Weg in die 
Hölle kennst du ja gewiß.

W.S.

von Joe (Gast)


Lesenswert?

W.S. schrieb:
> Deshalb nochmal: Es ist auf lange Sicht besser, zu lernen die Dinge zu
> verstehen als sich auf den verlockend simplen Weg des Zusammenklickens
> oder Zusammenkopierens zu begeben. Den Spruch vom breiten Weg in die
> Hölle kennst du ja gewiß.
>
> W.S.

Da magst Du zwar Recht haben, aaaaber in der Realität und im 
Arbeitsalltag wird einem doch oft gar keine Zeit mehr gegeben, um Sachen 
wirklich mal im Detail zu betrachten und verstehen.

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.