STM32F411CEU + Thermoelement - Erster Versuch eines Datenauslesens -

OP #7440302
Lesenswert?

Hallo,

Software: STM32CubeIDE unter Linux.

Hardware: Thermoelement, Typ K an PA12 von STM32.

Aufgabe: Möchte über PA12 Signal von Thermoelement aufnehmen.

Ausschnitt des Quellcodes der main.c: ...

1
GPIO_InitTypeDef GPIO_InitStructure;
2

3
SystemInit();
4

5
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
6

7
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
8
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
10
GPIO_Init(GPIOA, &GPIO_InitStructure);
11

12
dataByte = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12);
13
while (1){
14
printf("Daten: %d\n", dataByte);
15
delay(1000);}

...

Randinformationen: Ich bin Anfänger, ich sitze an Tag 2 vor meinem neuen STM32F411 und wollte ein Signal "schnell und unsauber" über PA12 aufnehmen.

Wo liege ich hier falsch in meinen Programm-Annahmen?

Mit besten Grüßen timbo

#7440325
Lesenswert?

Timbo2023 schrieb:

Wo liege ich hier falsch in meinen Programm-Annahmen?

Püh. Ich weiß gar nicht, wo ich anfangen soll.

  1. Ist das kein Pin, der die Möglichkeit hat, analoge Signale einzulesen
  2. Liest du den Pin digital ein. Also mehr als 0 oder 1 kommt da nicht raus
  3. Thermoelemente liefern eine sehr, sehr kleine Spannung, da brauchst du vermutlich ein bisschen analoges Frontend, bevor etwas Verwertbares bei herauskommt.

Ich denke, du solltest noch ein paar Schritte in Sachen Grundlagen zurück gehen, bevor du dich um dein Thermoelement kümmerst.

Es gibt dann auch entsprechende ICs, die "Thermoelement auf I2C" machen. Inkl. Kaltstellenkompensation und Linearisierung.

OP #7440336
Lesenswert?

Dankeschön Herr S. R. erst einmal für die "kurze" Grundlagenvermittlung und den verweis verständlicherweise wieder einmal darauf.

(1) Absolute Annahme - Nehmen wir PA10 einmal an, als korrigierende Veränderung (2) Verstehe ich bedingt (3) Sehe ich eigentlich nicht so, oder könnten Sie das kurz genauer erläutern, was Sie mit der englischen Bezeichnung "Frontend" meinen?

Kennen Sie hierzu eine Quellenangabe für die Grundlagenvermittlung und den grundsätzlichen Kompetenzaufbau für meine Person?

ABER: Ihre letzten beiden Kurzsätze machen Lust auf mehr - könnten Sie dahingehend auch noch kurz ergänzend werden?

Ihr timbo2023

#7440368
Lesenswert?

Timbo2023 schrieb:

(1) Absolute Annahme - Nehmen wir PA10 einmal an, als korrigierende Veränderung

Ändert nichts. Auch dieser Pin hängt nicht am ADC.

Timbo2023 schrieb:

(3) Sehe ich eigentlich nicht so, oder könnten Sie das kurz genauer erläutern, was Sie mit der englischen Bezeichnung "Frontend" meinen?

Verstärker. Bei Raumtemperatur kommt aus einem Typ K ~800µV. Bei 100°C sind es 4.1mV - Die kannst du schlichtweg nicht mit deinem Controller direkt messen.

Timbo2023 schrieb:

Kennen Sie hierzu eine Quellenangabe für die Grundlagenvermittlung

http://stefanfrings.de/stm32/stm32f3.html#analog

Timbo2023 schrieb:

und den grundsätzlichen Kompetenzaufbau für meine Person?

Wenn du seit zwei Tagen versuchst, ein Thermoelement an einem digitalen Pin einzulesen, kann ich mir deinen Kompetenzaufbau einigermaßen denken.

Timbo2023 schrieb:

könnten Sie dahingehend auch noch kurz ergänzend werden?

Kann ich nicht - Bzw. will ich nicht. Aber Google kann.

#7440383
Lesenswert?

Wastl schrieb:

mein ChatGPT-Detektor machen Radau.

Um ehrlich zu sein, erledigt ChatGPT keine schlechte Arbeit...

1
#include "stm32f4xx_hal.h"
2

3
ADC_HandleTypeDef hadc1;
4

5
void SystemClock_Config(void);
6
static void MX_GPIO_Init(void);
7
static void MX_ADC1_Init(void);
8

9
int main(void)
10
{
11
  HAL_Init();
12
  SystemClock_Config();
13
  MX_GPIO_Init();
14
  MX_ADC1_Init();
15

16
  uint32_t adc_value = 0;
17

18
  while (1)
19
  {
20
    // Start ADC conversion
21
    HAL_ADC_Start(&hadc1);
22

23
    // Wait for conversion to complete
24
    if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK)
25
    {
26
      // Read ADC value
27
      adc_value = HAL_ADC_GetValue(&hadc1);
28
    }
29

30
    // Stop ADC conversion
31
    HAL_ADC_Stop(&hadc1);
32

33
    // Convert ADC value to voltage
34
    float voltage = (3.3f * adc_value) / 4096; // Assuming 3.3V reference voltage and 12-bit resolution (4096 levels)
35

36
    // TODO: Do something with the voltage value (e.g., output it via UART or display on an LCD)
37

38
    HAL_Delay(1000); // Delay for 1 second
39
  }
40
}
41

42
void SystemClock_Config(void)
43
{
44
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
45
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
46

47
  /** Configure the main internal regulator output voltage 
48
  */
49
  __HAL_RCC_PWR_CLK_ENABLE();
50
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
51
  /** Initializes the CPU, AHB and APB busses clocks 
52
  */
53
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
54
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
55
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
56
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
57
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
58
  {
59
    Error_Handler();
60
  }
61
  /** Initializes the CPU, AHB and APB busses clocks 
62
  */
63
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
64
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
65
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
66
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
67
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
68

69
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
70
  {
71
    Error_Handler();
72
  }
73
}
74

75
static void MX_ADC1_Init(void)
76
{
77
  ADC_ChannelConfTypeDef sConfig = {0};
78

79
  /* Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) */
80
  hadc1.Instance = ADC1;
81
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
82
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
83
  hadc1.Init.ScanConvMode = DISABLE;
84
  hadc1.Init.ContinuousConvMode = DISABLE;
85
  hadc1.Init.DiscontinuousConvMode = DISABLE;
86
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
87
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
Angehängte Dateien:
#7440388
Lesenswert?

Sebastian R. schrieb:

Um ehrlich zu sein, erledigt ChatGPT keine schlechte Arbeit...

Um ehrlich zu sein scheinst du - trotz deiner langen Zugehörigkeit zum Forum - noch nicht in der Lage zu sein zu erkennen was ein "Längerer Sourcecode" ist und was man damit vernünftigerweise und höflicherweise tut. Oder du bist schlichtweg beratungsresistent.

Angehängte Dateien:
OP #7440430
Lesenswert?

Moin meine Herrschaften,

trotz launischer Antworten, erst einmal Dank.

zu (1) Welcher PIN "hängt" den Ihres Erachtens am "ADC", wie Sie das bezeichnen? zu (2) Ich werde es dennoch ohne Verstärker versuchen.

In Ergänzung werde ich ersteinmal Ihre Quellenangabe prüfen, die ich aufgrund von Namensnennungen erst einmal kritisch bewerte, jedoch inhaltlich scheint es lern-orientiert zu sein. Bin nach wie vor offen für weitere Quellen.

Ich werde zudem einmal den längeren Quellcode versuchen, auch wenn ich hier noch nicht weiß, wie ich den genau einbinden soll.

Angenehmen Tag Ihnen beiden

Als Randbemerkung: Mit ChatGPT habe ich auch nix zu tun, aber selbst staatliche Grundlagenforschung dahingehend, ging nach eigenen Erfahrungen beinahe Richtung "Knast". Ich kann Ihnen Dinger zu der hinterlegten Technologie erzählen, danach glauben Sie gar nix mehr...

#7440434
Lesenswert?

Timbo2023 schrieb:

zu (1) Welcher PIN "hängt" den Ihres Erachtens am "ADC", wie Sie das bezeichnen?

Alle die, die im Datenblatt als alternative Funktion entsprechend gekennzeichnet sind.

Timbo2023 schrieb:

zu (2) Ich werde es dennoch ohne Verstärker versuchen.

Bitte. Und viel Erfolg dabei. 1.21V interne Referenzspannung, 12bit. Macht 1.2mv/Digit. Damit kannst du immerhin in 33°C-Schritten auflösen. Das wird super!

Timbo2023 schrieb:

In Ergänzung werde ich ersteinmal Ihre Quellenangabe prüfen, die ich aufgrund von Namensnennungen erst einmal kritisch bewerte, jedoch inhaltlich scheint es lern-orientiert zu sein.

Prüf so viel du magst. Stefan ist auch hier im Forum vertreten.

Timbo2023 schrieb:

auch wenn ich hier noch nicht weiß, wie ich den genau einbinden soll.

Du schaffst das schon!

#7440619
Lesenswert?

Timbo2023 schrieb:

So, na dann, der Quellcode funktioniert bei mir auch nicht

Das ist wenig überraschend. Immerhin wird mit dem ADC-Wert nichts gemacht. Und vielleicht hast du dein Thermoelement ja auch nicht an den richtigen Pin angeschlossen. Und vielleicht klappt das so direkt auch einfach nicht.

Timbo2023 schrieb:

Aber ich sehe noch Defizite, ich mache am Montag erst einmal eine Weiterbildung.

Gute Idee!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren