Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test/periph_dac: adds a test for DACs #2023

Merged
merged 1 commit into from
Dec 3, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions tests/periph_dac/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
APPLICATION = periph_dac
include ../Makefile.tests_common

FEATURES_REQUIRED = periph_dac
USEMODULE += vtimer

include $(RIOTBASE)/Makefile.include
17 changes: 17 additions & 0 deletions tests/periph_dac/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
About
=====
This is a test application for a digital to analog converter (DAC).

This test application will initialize each configured DAC and one ADC (ADC_O) device to sample with
10-bit accuracy. The ADC is only initialized if there is one available on your board.

After initialization, values from 0 to 1000 are converted through the DACs in a loop. Shortly after the digital to analog conversion of one number, the ADC_0 samples its input signal. The numbers that are given to the DACs and the numbers that are sampled by the ADC were printed to the STDOUT.

Usage
=====

a) Connect an oscilloscope to the DAC pins and look at the ten iteration signal levels

or

b) Connect the ADC input to the DAC outputs successively and compare if the sampled input value correlates with the printed output value at each DAC port.
108 changes: 108 additions & 0 deletions tests/periph_dac/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
/*
* Copyright (C) 2014 Freie Universität Berlin
*
* This file is subject to the terms and conditions of the GNU Lesser General
* Public License v2.1. See the file LICENSE in the top level directory for more
* details.
*/

/**
* @ingroup tests
* @{
*
* @file
* @brief Test case for the low-level DAC driver
*
* @author Peter Kietzmann <[email protected]>
* @author Hauke Petersen <[email protected]>
*
* @}
*/

#include <stdio.h>

#include "cpu.h"
#include "board.h"
#include "vtimer.h"
#include "periph/dac.h"
#include "periph/adc.h"

#if DAC_NUMOF < 1
#error "Please enable at least 1 DAC device to run this test"
#endif

#define RES DAC_RES_10BIT
#define DELAY (1000 * 1000U)
#define MAX_VALUE_STEPS 1000

static int values[DAC_NUMOF][DAC_MAX_CHANNELS];

int main(void)
{
uint16_t write_value = 0;
int8_t status_dac_write;

puts("\nRIOT DAC peripheral driver test\n");
puts("This test simply sets each available DAC channel about every 100ms\n\n");

for (int i = 0; i < DAC_NUMOF; i++) {
/* initialize result vector */
for (int j = 0; j < DAC_MAX_CHANNELS; j++) {
values[i][j] = -1;
}
/* initialize DAC device */
printf("Initializing DAC_%i @ %i bit resolution", i, (6 + (2* RES)));
if (dac_init(i, RES) == 0) {
puts(" ...[ok]");
}
else {
puts(" ...[failed]");
return 1;
}

#if ADC_NUMOF > 0
printf("Initializing ADC_0 @ %i bit resolution", (6 + (2* RES)));
if (adc_init(0, RES) == 0) {
puts(" ...[ok]");
}
else {
puts(" ...[failed]");
return 1;
}
#endif
}
puts("\n");

while (1) {
for (int i = 0; i < DAC_NUMOF; i++) {
for (int j = 0; j < DAC_MAX_CHANNELS; j++) {
/* Write values to DAC */
status_dac_write = dac_write(i, j, write_value);
if (status_dac_write < 0) {
printf("%i: Something went wrong writing DAC\n", status_dac_write);
return -1;
}
#if ADC_NUMOF > 0
/* Read values from ADC */
int sample = adc_sample(ADC_0, 0);
if (sample < 0) {
printf("%i: Something went wrong sampling ADC\n", sample);
return -1;
}
printf("Wrote %i Read %i using DAC %i Channel %i and ADC_0 Channel 0\n", write_value, sample, i, j);
#else
printf("Wrote %i to DAC %i Channel %i\n", write_value, i, j);
#endif
}
}
puts("\n");
write_value+=100;
if (write_value >= MAX_VALUE_STEPS) {
write_value = 0;
}
/* sleep a little while */
vtimer_usleep(DELAY);
}

return 0;
}