Как мне прочитать дифференциальный сигнал с помощью АЦП Arduino Due?

У меня возникли трудности с настройкой АЦП Arduino Due для чтения дифференциального сигнала. Я подключил положительную клемму к контакту A1 (CH6), а отрицательную клемму - к контакту A0 (CH7). Напряжение синфазного режима составляет 3,3 В / 2.

Код инициализации:

pmc_enable_periph_clk(ID_ADC); // Enable the peripheral clock.

// Initialize the ADC.
adc_init(ADC, // Pointer to an ADC.
    sysclk_get_cpu_hz(), // Master clock frequency.
    2 * ADC_FREQ_MIN, // The ADC frequency.
    8); // The startup time.

// Enable individual settings for the input channels.
adc_enable_anch(ADC);

adc_configure_timing(ADC, // Pointer to an ADC.
    2, // Tracking time.
    ADC_SETTLING_TIME_3, // Settling time.
    1); // Data transfer time.

// Configure the conversion resolution.
adc_set_resolution(ADC, // Pointer to an ADC.
    ADC_MR_LOWRES_BITS_12); // Use 12-bit resolution.

// Enable the input channels.
adc_enable_channel(ADC, ADC_CHANNEL_6); // Pin A1.
adc_enable_channel(ADC, ADC_CHANNEL_7); // Pin A0.

// Configure channels as differential input.
adc_enable_channel_differential_input(ADC, ADC_CHANNEL_6); // Pin A1. CH6+.
adc_enable_channel_differential_input(ADC, ADC_CHANNEL_7); // Pin A0. CH6-.


// Configure how the ADC conversion process is triggered.
adc_configure_trigger(ADC, // Pointer to an ADC.
    ADC_TRIG_SW, // Use software triggering for conversion.
    1); // Free-running mode (no trigger is required for conversion).

// Start the ADC.
adc_start(ADC);

Я пытаюсь прочитать значение, используя

int16_t i16Value;
i16Value = (int16_t) adc_get_channel_value(ADC, ADC_CHANNEL_6);

Но это дает мне синфазное напряжение плюс половину дифференциального напряжения. Если я вручную вычислю значение как

int16_t i16Value;
i16Value = (int16_t) ((adc_get_channel_value(ADC, ADC_CHANNEL_6)
    - adc_get_channel_value(ADC, ADC_CHANNEL_7));

тогда я получаю (шумно), но правильное значение.

Кто-нибудь может сказать мне, что я делаю неправильно, или указать мне на пример кода.

Спасибо.


person MarkUK    schedule 10.05.2016    source источник


Ответы (1)


Вы можете прочитать значение, используя

i16Value = adc_get_latest_value(ADC);`

Примечание: -Для фильтрации шума требуется внешняя развязывающая емкость (стр. 1317 из таблицы).

person miaz    schedule 04.04.2017