9.3 Analoge IO met HAL
Analoog meten doe je op de STM32 met de ADC (Analog-to-Digital Converter). Met HAL kost dat wat meer opzet dan analogRead(), maar je krijgt er een fijnere meting voor terug: 12-bit (0–4095) in plaats van de 10-bit van de Arduino.
De ADC instellen en uitlezen
Een ADC-meting heeft drie delen: de ADC zelf instellen, de pin koppelen, en dan meten.
#include "stm32f1xx_hal.h"
ADC_HandleTypeDef hadc;
void adc_setup(void) {
__HAL_RCC_ADC1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
// PA0 als analoge ingang
GPIO_InitTypeDef gpio = {0};
gpio.Pin = GPIO_PIN_0;
gpio.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &gpio);
// de ADC zelf
hadc.Instance = ADC1;
hadc.Init.ContinuousConvMode = DISABLE;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
HAL_ADC_Init(&hadc);
// kanaal koppelen aan PA0
ADC_ChannelConfTypeDef kanaal = {0};
kanaal.Channel = ADC_CHANNEL_0;
kanaal.Rank = ADC_REGULAR_RANK_1;
kanaal.SamplingTime = ADC_SAMPLETIME_55CYCLES_5;
HAL_ADC_ConfigChannel(&hadc, &kanaal);
}
uint32_t adc_lees(void) {
HAL_ADC_Start(&hadc);
HAL_ADC_PollForConversion(&hadc, 100);
return HAL_ADC_GetValue(&hadc);
}
int main(void) {
HAL_Init();
adc_setup();
while (1) {
uint32_t waarde = adc_lees(); // 0 t/m 4095
HAL_Delay(200);
}
}
Wat gebeurt hier?
De setup ziet er groot uit, maar het zijn vier bekende stappen:
- Klokken aanzetten — voor de ADC én voor de poort van de pin.
- De pin op
GPIO_MODE_ANALOGzetten, zodat hij de spanning doorlaat naar de ADC. - De ADC instellen met
HAL_ADC_Init(). - Het kanaal koppelen:
PA0hoort bijADC_CHANNEL_0.
Meten zelf is dan kort:
HAL_ADC_Start(&hadc);
HAL_ADC_PollForConversion(&hadc, 100);
return HAL_ADC_GetValue(&hadc);
Je start een meting, wacht tot hij klaar is, en leest het getal (0–4095) uit. Dat is het HAL-equivalent van analogRead().
Een analoge pin op de Blue Pill mag maximaal 3,3 V krijgen, niet 5 V. Sluit de buitenste pinnen van je potmeter aan op 3.3 en GND.
PWM met een timer
analogWrite() bestaat niet in HAL. Een PWM-signaal komt op de STM32 rechtstreeks uit een hardware-timer. Je stelt de timer in op PWM-modus en past daarna alleen de "vergelijkingswaarde" aan om de helderheid te veranderen:
// als de timer eenmaal in PWM-modus staat (zie hoofdstuk 10.4):
__HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_1, 500); // helderheid
Hoe je de timer in PWM-modus zet, lees je in 10.4 Hardware-timers. Het mooie: zodra hij loopt, genereert de chip het signaal helemaal zelf — je hoofdprogramma hoeft er niets voor te doen.
Controlevraag
De Arduino gaf 0–1023, de STM32 geeft 0–4095. Wat betekent dat voor je meting?
De STM32 verdeelt hetzelfde spanningsbereik in vier keer zoveel stapjes (12-bit in plaats van 10-bit). Je meet dus nauwkeuriger: kleinere veranderingen in spanning zie je terug in het getal.