Motylowy termometr
Jest to prosty projekt ilustrujący pomiar temperatury za pomocą czujnika wbudowanego w strukturę mikrokontrolera STM32F107 (zamontowanego na płytce STM32Butterfly) i wyświetlenie jej dziesiętnej wartości na graficznym wyświetlaczu LCD z telefonu Nokia 3310 (zamontowanego na płytce modułu KAmodLCD1) – fot. 1. Projekt programu przygotowano za pomocą pakietu TrueStudio firmy Atollic, który jest wyposażony w kompilator ARM-GCC.
Fot. 1. Wynik przykładowego pomiaru
Połączenie pomiędzy płytką zestawu STM32Butterfly a płytką wyświetlacza wykonano za pomocą 10–żyłowej taśmy, która jest dostarczana wraz z modułem wyświetlacza. Schemat elektryczny połączeń pokazano na rys. 2.
Rys. 2. Schemat elektryczny połączeń pomiędzy mikrokontrolerem i wyświetlaczem z Nokii 3310
Komunikacja pomiędzy mikrokontrolerem i sterownikiem LCD odbywa się poprzez programowy interfejs SPI, którego realizację przedstawiono w artykule „Obsługa graficznego wyświetlacza z telefonu Nokia 3310 za pomocą mikrokontrolerów STM32” Tomasza Jabłońskiego (dział Porady). Zmieniono jedynie definicje linii wyprowadzeń mikrokontrolera, tak, aby były dopasowane do złącza z liniami portu PC mikrokontrolera. Wystarczy połączyć przez to złącze taśmą wyświetlacz, zwracając jedynie uwagę na właściwą pozycję gniazd taśmy (fot. 3). Pozostałe zadania realizuje przygotowane oprogramowanie.
Fot. 3. Płytkę STM32Butterfly z modułem KAmodLCD1 najwygodniej jest połączyć za pomocą 10-żyłowego kabla IDC
Prezentowana aplikacja angażuje cztery elementy: czujnik temperatury, przetwornik A/C, kontroler DMA (wszystkie wbudowane w mikrokontroler) oraz wyświetlacz LCD (moduł zewnętrzny). Pokrótce przedstawiono obsługę wszystkich elementów zaangażowanych do realizacji funkcji termometru, następnie jak zostały one połączone w działającą aplikację.
Przetwornik A/C
Mikrokontrolery STM32F107 mają wbudowane dwa 12–bitowe przetworniki A/C. W aplikacji wykorzystano przetwornik ADC1. Na list. 1 przedstawiono kod, który konfiguruje przetwornik do pracy. Przetwarzany będzie jeden kanał w trybie ciągłym. Wewnętrzny czujnik temperatury jest podłączony do kanału 16, stąd też napięcie będzie mierzone na tym właśnie kanale. Po wykonaniu inicjalizacji przetwornik jest kalibrowany i włączany.
List. 1. Konfiguracja, kalibracja i uruchomienie przetwornika A/C
// Konfiguracja ADC // Jeden przetwornik, pracujacy niezaleznie ADC_InitStruct.ADC_Mode = ADC_Mode_Independent; // Pomiar jednego kanalu, wylacz opcje skanowania ADC_InitStruct.ADC_ScanConvMode = DISABLE; // Wlacz pomiar w trybie ciaglym ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; // Nie bedzie wyzwalania zewnetrznego ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // Dane wyrownane do prawej - znaczacych bedzie 12 mlodszych bitow ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; // Jedne kanal ADC_InitStruct.ADC_NbrOfChannel = 1; // Inicjuj przetwornik ADC_Init(ADC1, &ADC_InitStruct); ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_239Cycles5); // Wlaczenie czujnika temperatury ADC_TempSensorVrefintCmd(ENABLE); // Wlaczenie DMA ADC_DMACmd(ADC1, ENABLE); // Wlacz ADC1 ADC_Cmd(ADC1, ENABLE); // Resetuj rejestry kalibracyjne ADC_ResetCalibration(ADC1); // Czekaj, az skonczy resetowac while(ADC_GetResetCalibrationStatus(ADC1)); // Start kalibracji ADC1 ADC_StartCalibration(ADC1); // Czekaj na zakonczenie kalibracji ADC1 while(ADC_GetCalibrationStatus(ADC1)); // Start przetwarzania ADC_SoftwareStartConvCmd(ADC1, ENABLE);