STM32F103 - ADC des internen Temperatursensors ändert den Wert nicht

Ich versuche gerade, den ADC eines STM32F103 zum Laufen zu bringen. Meine erste Übung besteht darin, den internen Temperatursensor auszulesen. Das ist mein aktueller Ansatz:

void initADC(){
    RCC->APB2ENR |= (1<<9);      //Enable ADC1 Clock
    RCC->CFGR |= (0b10<<14);     //set ADC Prescaler '6'
    ADC1->CR1 |= (1<<4);         //Input Channel 16
    ADC1->SMPR1 |= (0b100<<18);  //41.5 cycles sample time
    ADC1->CR2 |= (1<<23);        //Enable Temperature Sensor & Vref

    ADC1->CR2 |= (1<<0);         //Enable ADC and start conversion

    ADC1->CR2 |= (1<<3);         //Initialize calibration register
    while(ADC1->CR2 & (1<<3)){   //Wait until calibration register initialized
        ;
    }

    ADC1->CR2 |= (1<<2);         //Enable calibration
    while(ADC1->CR2 & (1<<2)){   //Wait until calibration completed
        ;
    }
}

uint32_t getADCTempValue(){
    ADC1->CR2 |= (1<<0);         //Enable ADC and start conversion
    while(!(ADC1->SR & (1<<1))){ //Wait until end of conversion
        ;
    }
    return ADC1->DR;
}

Dies sind einige Beispielwerte, die ich bekomme:

2428 2417 2412 2400 2389 2381 2376 2380 2392 2406 2410

Aber egal was ich mache (Controller berühren, auf den Controller pusten) der Wert ändert sich nicht wesentlich.

Ändert es sich mehr, wenn Sie es mit Gefrierspray bestrahlen?
Ich habe das nicht versucht, aber ich habe es unter eine Lampe mit einer Glühbirne gestellt (die aus nächster Nähe ziemlich heiß ist) und der Wert hat sich überhaupt nicht geändert.

Antworten (1)

Ihre Kanalauswahl ist falsch. Im ADC_CR1 können Sie den analogen Watchdog auf den ausgewählten Kanälen aktivieren. Aber es aktiviert nicht den Kanal selbst, sondern nur den Watchdog, Seite 240 .

Geben Sie hier die Bildbeschreibung ein

Um einen Kanal auszuwählen, müssen Sie die Register ADC_SQRx oder ADC_JSQR verwenden , je nachdem, ob eine reguläre oder eine injizierte Gruppe benötigt wird, Seite 218 .

Geben Sie hier die Bildbeschreibung ein