STM32F103 Temperatursensor-Kalibrieradressen

Ich bin neu in der ARM-Welt und verwende den STM32F103C8T6 ARM-Mikrocontroller. Ich möchte den internen Temperatursensor des Mikros zum Laufen bringen. Ich kann einige Daten daraus abrufen, bin mir aber nicht sicher, wie ich diese Zahlen in Temperatur umwandeln soll. Ich habe es nachgeschlagen und festgestellt, dass es im Speicher zwei Nur-Lese-Adressen gibt, die die Werkskalibrierungsnummern bei 30 und 110 Grad enthalten.

Das Problem ist, dass weder im Datenblatt noch im Referenzhandbuch etwas darüber steht . Es gibt nur einige Mindest- und Höchstwerte für Parameter. Ich glaube, dass die Verwendung des Durchschnitts dieser Werte die Genauigkeit beeinträchtigen kann. Also bin ich verwirrt. Wie muss ich diese Konvertierung durchführen? Brauche ich diese Werkskalibrierdaten überhaupt? Muss ich den ADC in diesem Fall selbst kalibrieren?

hier ist der Code, den ich bisher verwendet habe:

 #include "stm32f103xb.h"
 int main(void)
{

// Select a clock source for ADC


RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;     // Enable ADC1 to use APB2 BUS
RCC->CR |= RCC_CR_HSION;  // set the internal clock on (8MHz)
while((RCC->CR & RCC_CR_HSIRDY) == 0){}     // wait until HSI is ready

RCC->CFGR &= ~(RCC_CFGR_HPRE);  // set AHB prescaler to 1
RCC->CFGR &= ~(RCC_CFGR_PPRE2); // set APB2 prescaler to 1 (PCLK2)
RCC->CFGR |= RCC_CFGR_ADCPRE;   // use ADC prescaler

// Select a Sampling rate
ADC1->SMPR1 |= ADC_SMPR1_SMP16;
ADC1->SQR3 |= ADC_SQR3_SQ1_4; //set to convert the channel 16 fitst

// enable temperature sensor
ADC1->CR2 |= ADC_CR2_TSVREFE;

// ADC Calibration
// Power up the ADC and then Calibrate it
ADC1->CR2 |= ADC_CR2_ADON | ADC_CR2_CAL | ADC_CR2_CONT;
// wait until the calibration is completed and reseted
while((ADC1->CR2 & ADC_CR2_CAL) == 1){}


while(1)
{
    // Start 
    ADC1->CR2 |= ADC_CR2_ADON;
    while((ADC1->SR & ADC_SR_EOC) == 0){} // wait for end of conversion
    // Print the results on LCD
    LCDSendInstruction(LCD_CLEAR);
    LCDSendInteger(ADC1->DR,8);

}
}

Danke im Voraus

"Ich habe es nachgeschlagen und festgestellt, dass es im Speicher zwei Nur-Lese-Adressen gibt, die Werkskalibrierungsnummern bei 30 und 110 Grad enthalten." - Woher haben Sie diese Informationen?
@BruceAbbott andere STM32-Familien haben diese Nummern, die in ihrem Datenblatt angegeben sind. Ich habe es nachgeschlagen und sie verwenden es für bessere Ergebnisse, überprüfen Sie dies

Antworten (2)

Die STM32Cube-Bibliothek für Ihren Teil enthält ein oder zwei Hilfsmakros zum Berechnen der Temperatur aus einem ADC-Messwert des internen Temperatursensors. Das Benutzerhandbuch für die HAL- und Low-Layer (LL)-Treiber beschreibt diese Makros. Die Implementierung unterscheidet sich von einer STM32-Familie zur anderen, stellen Sie also sicher, dass Sie die Informationen für Ihr spezielles Teil erhalten. Auch wenn Sie die STM32Cube-Bibliothek nicht verwenden, können Sie dennoch auf den Quellcode verweisen, um ein Beispiel dafür zu erhalten, wie die Temperaturmakros implementiert werden.

Die beiden Makros sind __LL_ADC_CALC_TEMPERATUREund __LL_ADC_CALC_TEMPERATURE_TYP_PARAMS.

Einige STM32-Teile haben Temperaturkalibrierungswerte, die während der Herstellung des Geräts gemessen und in das ROM programmiert werden. Diese Teile verwenden das __LL_ADC_CALC_TEMPERATUREMakro. Dieses Makro verwendet die ROM-Kalibrierungswerte, um die Genauigkeit der Temperaturmessung zu verbessern.

Andere STM32-Teile haben keine Temperaturkalibrierungswerte im ROM. Diese Teile verwenden das __LL_ADC_CALC_TEMPERATURE_TYP_PARAMSMakro. Dieses Makro verwendet die "typischen" Werte für Avg_Slopeund V25aus dem Gerätedatenblatt.

Ich glaube, die STM32F1-Familie hat keine Temperaturkalibrierungswerte im ROM, sodass Sie __LL_ADC_CALC_TEMPERATURE_TYP_PARAMSdie typischen Parameter aus dem Gerätedatenblatt verwenden würden.

Wenn Sie die Temperaturmesswerte verbessern möchten, können Sie jede Ihrer Einheiten während der Produktion kalibrieren und die benutzerdefinierten Kalibrierungswerte für Avg_Slopeund V25im ROM speichern. Ersetzen Sie dann Ihre benutzerdefinierten Kalibrierungswerte durch die typischen Werte aus dem Datenblatt.

Wenn Sie nur eine Referenz zur Verwendung des Temperatursensors suchen, könnte dies Ihnen helfen! Auf den Seiten 234 und 235 finden Sie, wonach Sie suchen!

Um die Antwort zu vervollständigen, zitiere ich die im Dokument beschriebene Verwendung

Ablesen der Temperatur

So verwenden Sie den Sensor:

  1. Wählen Sie den Eingangskanal ADCx_IN16 aus.
  2. Wählen Sie eine Abtastzeit von 17,1 µs
  3. Setzen Sie das TSVREFE-Bit im ADC-Steuerregister 2 (ADC_CR2), um den Temperatursensor aus dem Abschaltmodus zu wecken.
  4. Starten Sie die ADC-Wandlung durch Setzen des ADON-Bits (oder durch externen Trigger).
  5. Lesen Sie das Ergebnis v S E N S E Daten im ADC-Datenregister
  6. Ermitteln Sie die Temperatur mit der folgenden Formel:

T e M P e R A T u R e ( ich N ° C ) = ( v 25 v S E N S E ) / A v G S l Ö P e + 25

Wo, v 25 = v S E N S E Wert für 25° C und

Avg_Slope = Durchschnittliche Steigung für die Kurve zwischen Temperatur vs. VSENSE (angegeben in mV/°C oder µV/°C).

Achten Sie schließlich auf die Auswirkungen auf die Genauigkeit der Messwerte aufgrund der vom Prozessor selbst erzeugten Wärme!

BEARBEITEN: Die Konstanten haben einen Bereich, da sie von den Wärmeschwankungen im Prozessor selbst beeinflusst werden. Wenn Sie also nach sehr genauen Ergebnissen suchen, verwenden Sie besser einen externen Sensor. Oder Sie müssen die Temperaturschwankungen des Prozessors in Bezug auf den Temperatursensor empirisch berechnen. Ich glaube nicht, dass diesbezüglich Daten verfügbar sind, und stelle fest, dass die obige Formel nur eine lineare Annäherung ist.

Ich habe das gelesen, aber das Problem ist, dass Konstanten in dieser Formel einen Bereich (im Datenblatt angegeben) haben, keine eindeutige Zahl. Wie kann ich diese Konstanten genau bestimmen??
@dub-dub Sie würden die typischen Werte aus dem Datenblatt verwenden. Wenn das nicht ausreicht, sollten Sie während der Herstellung eine benutzerdefinierte Kalibrierung jeder Einheit durchführen und die benutzerdefinierten Werte im ROM speichern.