Obsługa przetwornika ADC w mikrokontrolerach STM32
W prezentowanym projekcie pokazano wykorzystanie 12-bitowego przetwornika analogowo-cyfrowego (ADC) wbudowanego w mikrokontroler STM32F103. W projekcie jest mierzone napięcie na wyprowadzeniu PC4 mikrokontrolera STM32 zamontowanego w zestawie ZL27ARM. Napięcie to można zmieniać za pomocy zamontowanego potencjometru. Zmierzone napięcie jest prezentowane na wyświetlaczu LCD dołączonego modułu KAmodLCD1 jako odczytana wartość rejestru przetwornika ADC mikrokontrolera, obliczona wartość napięcia oraz bargraf. Dodatkowo wartość 8 najbardziej znaczących bitów jest przedstawiana na diodach LED zestawu ZL27ARM.
Projekty referencyjne dla ZL27ARM Portal www.stm32.eu przygotował projekty referencyjne dla mikrokontrolerów z rodziny STM32, które zostały opublikowane tu. Są one dostępne bezpłatnie, konieczne jest tylko zarejestrowanie się jako użytkownik portalu. |
Na rysunku 1 przedstawiono sposób dołączenia modułu wyświetlacza do zestawu ZL27ARM. Połączenie wygodnie jest wykonać za pomocą kolorowych przewodów CAB_A pokazanych na rysunku 2. Na rysunku 3 pokazano wyświetlacz LCD podczas pracy programu.
Rys. 1. Sposób dołączenia wyświetlacza do mikrokontrolera STM32
Rys. 2. Kolorowe przewody CAB_A ułatwiające wykonanie połączeń
Rys. 3. Widok wyświetlacza podczas pracy programu
Rzadko jest wymagane, aby pomiar napięcia odbywał się w cyklu ciągłym. Przedstawiony program wykonuje pomiar w momencie ustawienia odpowiedniego bitu w czasie obsługi przerwania SysTick. Na listingu 1 przedstawiono funkcję main programu.
List. 1
int main(void) { Configuration_RCC(); Configuration_GPIO(); Configuration_Interrupts(); Configuration_ADC(); //inicjalizacja i obsługa wyświetlacza PCD8544_INIT(); PCD8544_LCDClear(); PCD8544_LCDWriteText("Voltage", 21, 0); PCD8544_LCDWrite(); while(1) { // ADC1Reg = ADC_GetConversionValue(ADC1) & 0xFF0; ADC1Val = (ADC1Reg * 3.3 / 4096); //przekształcenie wartosci ADC1Val do postaci umożliwiającej prezentację na wywietlaczu temp[0] = (uint8_t)(ADC1Val / 1.0); temp[1] = (uint8_t)((ADC1Val - temp[0]) / 0.1) ; temp[2] = (uint8_t)((ADC1Val - temp[0] - (temp[1] * 0.1))/ 0.01); //prezentacja napięcia na pinie PC4 na wywietlaczu PCD8544_LCDWriteSignDouble(temp[0] + 0x30, 12, 2); PCD8544_LCDWriteSignDouble('.', 24, 2); PCD8544_LCDWriteSignDouble(temp[1] + 0x30, 36, 2); PCD8544_LCDWriteSignDouble(temp[2] + 0x30, 48, 2); PCD8544_LCDWriteSignDouble('V', 60, 2); //wyświetlenie wartości heksadecymalnej zmiennej ADC1Val PCD8544_LCDWriteSign('0', 27, 1); PCD8544_LCDWriteSign('x', 33, 1); PCD8544_LCDWriteSign(ASCII_HEX(ADC1Reg % 0x1000 / 0x100), 39, 1); PCD8544_LCDWriteSign(ASCII_HEX(ADC1Reg % 0x100 / 0x10), 45, 1); PCD8544_LCDWriteSign(ASCII_HEX(ADC1Reg % 0x10 / 0x1), 51, 1); //wyświetlenie bargrafu PCD8544_LCDBargraph(ADC1Reg & 0xFF0,0xFF0,5); //wyslanie danych na wyświetlacz PCD8544_LCDWrite(); //wyzerowanie 8 najstarszych bitów GPIOB GPIOB->BSRR = 0xFF000000; //ustawienie 8 najstarszych bitów GPIOB GPIOB->BSRR = (ADC1Reg << 4); } }