LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
Artykuły

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

Do pobrania

Polski portal branżowy dedykowany zagadnieniom elektroniki. Przeznaczony jest dla inżynierów i konstruktorów, projektantów hardware i programistów oraz dla studentów uczelni technicznych i miłośników elektroniki. Zaglądają tu właściciele startupów, dyrektorzy działów R&D, zarządzający średniego szczebla i prezesi dużych przedsiębiorstw. Oprócz artykułów technicznych, czytelnik znajdzie tu porady i pełne kursy przedmiotowe, informacje o trendach w elektronice, a także oferty pracy. Przeczyta wywiady, przejrzy aktualności z branży w kraju i na świecie oraz zadeklaruje swój udział w wydarzeniach, szkoleniach i konferencjach. Mikrokontroler.pl pełni również rolę patrona medialnego imprez targowych, konkursów, hackathonów i seminariów. Zapraszamy do współpracy!