Přeskočit na hlavní obsah

Návod: Analogově-digitální převodník

Analogově-digitální převodník umí měřit napětí na jednom ze šesti vstupů A0A5 a vrátit naměřenou hodnotu. Výsledkem může být 16bitová hodnota nebo číslo typu float ve voltech.

Odkazy

Typy vzorkování

Každý kanál lze nastavit na jiné rozlišení a převzorkování.

Bez ohledu na to, jaké rozlišení zvolíte (6, 8, 10, 12), je výsledek vždy převeden na 16bitovou hodnotu v rozsahu 0-65535. V asynchronním režimu můžete hodnotu získat i přímo ve voltech v datovém typu float.

Vzorkování může být synchronní a asynchronní.

Synchronní vzorkování

info

Během synchronního měření je kód blokovaný, dokud měření neskončí.

Ukázka kódu pro synchronní vzorkování

#include <application.h>

void application_init(void)
{
twr_log_init(TWR_LOG_LEVEL_DEBUG, TWR_LOG_TIMESTAMP_OFF);

twr_adc_init();
}

void application_task()
{
uint16_t adc;

twr_adc_get_value(TWR_ADC_CHANNEL_A2, &adc);
twr_log_debug("%d", adc);

twr_scheduler_plan_current_relative(200);
}

Asynchronní vzorkování

info

Asynchronní vzorkování není blokující a běží na pozadí.

Jakmile je výsledek k dispozici, zavolá se vaše callback funkce. Je možné spustit více kanálů, plánovač navzorkuje každý kanál a zavolá callback pro každý kanál zvlášť.

Ukázka kódu pro asynchronní vzorkování

#include <application.h>

static void _adc_event_handler(twr_adc_channel_t channel, twr_adc_event_t event, void *param)
{
(void) channel;
(void) param;

if (event == TWR_ADC_EVENT_DONE)
{
uint16_t adc;
twr_adc_async_get_value(TWR_ADC_CHANNEL_A2, &adc);
twr_log_debug("%d", adc);

float voltage;
twr_adc_get_result_voltage(TWR_ADC_CHANNEL_A2, &voltage);
twr_log_debug("%f", voltage);
}
}

void application_init(void)
{
twr_log_init(TWR_LOG_LEVEL_DEBUG, TWR_LOG_TIMESTAMP_OFF);

twr_adc_init();
twr_adc_set_event_handler(TWR_ADC_CHANNEL_A2, _adc_event_handler, NULL);
twr_adc_resolution_set(TWR_ADC_CHANNEL_A2, TWR_ADC_RESOLUTION_12_BIT);
twr_adc_oversampling_set(TWR_ADC_CHANNEL_A2, TWR_ADC_OVERSAMPLING_256);
}

void application_task()
{
twr_adc_async_measure(TWR_ADC_CHANNEL_A2);

twr_scheduler_plan_current_relative(200);
}