Obsługa przetwornika ADC w mikrokontrolerach STM32
Na początku programu następuje inicjalizacja poszczególnych elementów jak: RCC, GPIO, przerwanie SysTick, konwerter ADC oraz inicjalizacja wyświetlacza. Zasadnicza część programu jest realizowana w nieskończonej pętli. Na początku tej pętli jest wykonywany odczyt rejestru po skończonym pomiarze konwertera ADC. Odczyt jest realizowany wraz wykonaniem iloczynu logicznego, który zeruje cztery najmniej znaczące bity. W następnym kroku jest obliczane napięcie – wykorzystywane są tu zmienne typu float. Kolejnym etapem jest wyznaczenie wartości poszczególnych cyfr wartości napięcia, są to obliczenia matematyczne z wykorzystaniem rzutowania zmiennych na zmienną typu uint8_t. Na końcu uzyskane dane są prezentowane na podłączonym wyświetlaczu.
Szczególną uwagę należy zwrócić na sposób prezentowania wyniku danych za pomocą diod LED. Operacja ta jest realizowana przez zapis do rejestru BSRR odpowiedniego portu. Rejestr ten jest 32-bitwy i realizuje dwie funkcje. Za pierwszą z nich odpowiedzialne jest 16 starszych bitów, ich ustawienie powoduje ustawienie stanu niskiego na wskazanych wyjściach. Drugą funkcję realizuje 16 młodszych bitów, które odpowiedzialne są za ustawienie wskazanych wyjść w stan wysoki.
W programie należy zwrócić także uwagę na inicjalizację konwertera ADC, kod przedstawiono na listingu 2.
List. 2
void Configuration_ADC(void) { ADC_InitTypeDef ADC_InitStructure; //konfiguracja ADC1 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); // ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_71Cycles5); //włączenie ADC1 ADC_Cmd(ADC1, ENABLE); //wywołanie resetu rejestrów kalibracji ADC_ResetCalibration(ADC1); //oczekiwanie na zakończenie resetu while(ADC_GetResetCalibrationStatus(ADC1)); //wywołanie kalibracji ADC_StartCalibration(ADC1); //oczekiwanie na zakończenie kalibracji while(ADC_GetCalibrationStatus(ADC1)); }
Jest to klasyczna inicjalizacja przetwornika, uwagę należy zwrócić, iż po inicjalizacji ciągła praca przetwornika ADC jest wyłączona. Jak zostało zaznaczone wcześniej rozpoczęcie pojedynczej konwersji przetwornika ADC jest realizowane przez programowe ustawienie odpowiedniego bitu rejestru. Operacja ta jest realizowana w czasie obsługi przerwania od SysTick, kod obsługi przerwania został przedstawiono na listingu 3.
List. 3
void SysTick_Handler(void) { //ustawienie bitu EXTTRIG rozpoczynającego pojedyńczy pomiar ADC1->CR2 |= 0x00100000; }
Mariusz Dziębowski
m.dziebowski@interia.pl
Odnośniki:
Moduł wyświetlacza LCD KAmodLCD1
Zestaw uruchomieniowy ZL27ARM