2016-05-10 28 views
2

Ich habe einige Schwierigkeiten beim Konfigurieren des Arduino Due ADC, um ein differenzielles Signal zu lesen. Ich habe den positiven Anschluss an Pin A1 (CH6) und den negativen Anschluss an Pin A0 (CH7) angeschlossen. Die Gleichtaktspannung ist 3.3V/2.Wie lese ich ein Differenzialsignal mit dem Arduino Due ADC?

Der Initialisierungscode

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); 

ist Ich versuche, den Wert mit

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

Aber das gibt mir die Gleichtaktspannung plus die Hälfte zu lesen die Differenzspannung. Wenn ich den Wert manuell als

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

errechne, bekomme ich einen (lauten), aber korrekten Wert.

Bitte kann mir jemand entweder sagen, was ich falsch mache, oder in Richtung eines Beispielcodes zeigen.

Danke.

Antwort

0

Sie können den Wert lesen unter Verwendung

i16Value = adc_get_latest_value(ADC);` 

. Hinweis: -Ein externe Entkopplungskapazität für die Rauschfilterung erforderlich ist (pg.1317 aus Datenblatt)