Dialog DA14531 – ADC (Norsk)

(Gowtham TS)

En A nalog til D igital C omformer transformerer et analogt signal til en digital form som kan brukes av / betjenes av et hvilket som helst beregningselement. Det analoge signalet samples med jevne mellomrom for å gjenskape det digitalt.

DA14531 har 10 bit ADC med 4-inngangskanaler (eller 2 differensialkanaler). De 4 inngangskanalene kan velges mellom 4 GPIOer, en temperatursensor, VBAT_HIGH-skinne, VBAT_LOW-skinne og VDD. Den har også en konfigurerbar demper med 4 alternativer som er 1x, 2x, 3x og 4x. Med demperen på 4x kan den prøve et maksimalt spenningsområde på -3,45V til + 3,45V.

Prosjektoppsett

Prosjektet med koden for denne opplæringen er tilgjengelig på Github på https : //github.com/vicara-hq/da14531-tutorials

Last ned prosjektet og kopier det. Prosjektet må plasseres i Dialog SDK6-mappen. Naviger til / projects / target_apps / template og lim den inn i denne mappen. Prosjektet er en modifisert versjon av empty_peripheral_template prosjektet levert av Dialog. Men for å holde denne opplæringsserien så åpen kildekode som mulig, vil alle følgende trinn bruke SmartSnippets Studio.

Maskinvareoversikt

Vi vil bruke et hovedkort DA145xx Pro med en liten modul DA14531 datterbrett, få hoppere og et brødbrett. Du trenger også to motstander av samme verdi, eller du kan også bruke et potensiometer (du trenger et multimeter for å verifisere utgangen).

Jeg brukte 2 4,7 kOhm motstander og 3V skinne på hovedkortet DA14531 som VCC.

Kodeoversikt

Målet med denne opplæringen er å prøve en spenning og vise den grunnleggende bruken av ADC i DA14531.

Først må vi konfigurere P0_7 som en ADC-pin. Dette gjøres i filen 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);
}

Kodeblokken nedenfor konfigurerer 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);

I konfigurasjonsstrukturen setter vi modusen til single ended og dempningen til 2x da den forventede spenningen er rundt 1,5V. Funksjonen for å også kalibrere ADC kalles før den initialiseres.

Vi kaller funksjonen for å prøve spenningen i den egendefinerte app_on_init tilbakeringingen. Hvis du vil ha mer informasjon om den tilpassede tilbakeringingen, kan du se på veiledningen min om (GPIO, knapper og lysdioder).

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

Testing

Den enkleste måten å teste dette på er å kjøre feilsøkingsprogrammet og legge til variabelen adc_sample i Expressions Watch-vinduet. For å legge til en variabel i Expressions-vinduet og for å sjekke dens verdi:

  • Velg variabelen
  • Høyreklikk på den og velg “Legg til klokkeuttrykk”.
  • Klikk på «OK» i vinduet som åpnes
  • Sett feilsøkingsprogrammet på pause etter noen sekunder og sjekk verdien på variabelen.

Verdien jeg fikk var 0x3A0. Referansespenningen til ADC er 0,9V, og siden det er en 10-biters ADC, tilsvarer verdien:

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

Verdien jeg fikk er litt høyere enn forventet. Denne feilen kan reduseres ved å bruke teknikker som oversampling, men det er et avansert emne for en annen opplæring.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *