Dialog DA14531 – ADC (Polski)

(Gowtham TS)

An A nalog do D igital C przekształca sygnał analogowy w postać cyfrową, która może być używana przez / obsługiwana przez dowolny element obliczeniowy. Sygnał analogowy jest okresowo próbkowany, aby odtworzyć go cyfrowo.

DA14531 ma 10-bitowy przetwornik ADC z 4 wejściowymi kanałami single-ended (lub 2 kanałami różnicowymi). Do 4 kanałów wejściowych można wybrać spośród 4 GPIO, czujnika temperatury, szyny VBAT_HIGH, szyny VBAT_LOW i VDD. Posiada również konfigurowalny tłumik z 4 opcjami: 1x, 2x, 3x i 4x. Przy 4x tłumik może próbkować maksymalny zakres napięcia od -3,45 V do + 3,45 V.

Konfiguracja projektu

Projekt z kodem do tego samouczka jest dostępny na Github pod adresem https : //github.com/vicara-hq/da14531-tutorials

Pobierz projekt i skopiuj go. Projekt należy umieścić w folderze Dialog SDK6. Przejdź do / projects / target_apps / template i wklej go w tym folderze. Projekt jest zmodyfikowaną wersją projektu empty_peripheral_template dostarczonego przez Dialog. Aby jednak ta seria samouczków była jak najbardziej open source, wszystkie poniższe kroki będą wykorzystywać SmartSnippets Studio.

Omówienie sprzętu

Będziemy używać płyty głównej DA145xx Pro z małym modułem DA14531 płyta rozszerzenia, kilka zworek i płytka prototypowa. Będziesz także potrzebował 2 rezystorów o tej samej wartości lub możesz też użyć potencjometru (do weryfikacji sygnału wyjściowego będzie potrzebny multimetr).

Użyłem 2 rezystorów 4,7 kOhm i szyny 3V na płycie głównej DA14531 jako VCC.

Przegląd kodu

Celem tego samouczka jest próbkowanie napięcia i pokazanie podstawowych zastosowań ADC w DA14531.

Najpierw musimy skonfigurować P0_7 jako pin ADC. Odbywa się to w pliku user_periph_setup.c.

void GPIO_reservations(void) {
RESERVE_GPIO(BUTTON, GPIO_PORT_0, GPIO_PIN_7, PID_ADC);
}void set_pad_functions(void) {
GPIO_ConfigurePin(GPIO_PORT_0, GPIO_PIN_7, INPUT, PID_ADC, false);
}

Poniższy blok kodu konfiguruje ADC.

adc_config_t adc_cfg = {
.input_mode = ADC_INPUT_MODE_SINGLE_ENDED,
.input = ADC_INPUT_SE_P0_7,
.smpl_time_mult = 2,
.continuous = false,
.interval_mult = 0,
.input_attenuator = ADC_INPUT_ATTN_2X,
.chopping = false,
.oversampling = 0
};adc_offset_calibrate(ADC_INPUT_MODE_SINGLE_ENDED);adc_init( &adc_cfg);

W strukturze konfiguracyjnej ustawiliśmy tryb na single ended i tłumienie na 2x, ponieważ oczekiwane napięcie wynosi około 1,5V. Funkcja kalibrująca również ADC jest wywoływana przed jego inicjalizacją.

Wywołujemy funkcję w celu próbkowania napięcia w niestandardowym wywołaniu zwrotnym app_on_init . Aby uzyskać więcej informacji na temat niestandardowego wywołania zwrotnego, zapoznaj się z moim samouczkiem dotyczącym (GPIO, przycisków i diod LED).

uint16_t adc_sample;void user_app_on_init(void) {
adc_sample = adc_get_sample();
adc_sample = adc_correct_sample(adc_sample); default_app_on_init();
}

Testowanie

Najłatwiejszym sposobem sprawdzenia tego jest uruchomienie debugera i dodanie zmiennej adc_sample do okna obserwacyjnego Wyrażenia. Aby dodać zmienną do okna obserwacyjnego Wyrażenia i sprawdzić jej wartość:

  • Wybierz zmienną
  • Kliknij ją prawym przyciskiem myszy i wybierz „Dodaj wyrażenie obserwujące”.
  • Kliknij „OK” w oknie, które się otworzy.
  • Zatrzymaj debugera po kilku sekundach i sprawdź wartość zmiennej.

Wartość, którą otrzymałem, to 0x3A0. Napięcie odniesienia ADC wynosi 0,9 V, a ponieważ jest to 10-bitowy przetwornik ADC, wartość odpowiada:

0x3A0 = 928 (in decimal)2 * 928 * (0.9/1024) = 1.63V 

Wartość, którą otrzymałem, jest nieco wyższa niż spodziewany. Ten błąd można zmniejszyć, stosując techniki takie jak oversampling, ale to zaawansowany temat na inny samouczek.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *