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 :-)
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 ?
Rainer K. schrieb: > sConfig.Channel = ADC_CHANNEL_6; da steht er doch. Den PA_5 willst du nicht sondern die Alternate Funkction ADC12_IN5.
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) { .....
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
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ß
Was wäre dann z.B.: ADC12_IN6 ? Bei M0 heisst das dann ADC_IN6 dies entspricht dann auch ADC_CHANNEL_6.
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);
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ß
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!!!!
Nochmal Danke ! Kann jetzt alle 3 Debuggen :-) Super Tip "Haas" :-)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.