Support Forum

Share your projects and post your questions

Register   or   Sign In
The Forum

Maximum sampling for DACADC Pi

1378 Views - Created 17/05/2019

17/05/2019

Posted by:
tfv3

tfv3 Avatar

I am using a rather simple sample code to write into and read from analog IOs:


    t1 = time.time() # start time in s
d=np.empty([10000])

for i in range(10000):

adcdac.set_dac_voltage(1, 1.5*i/10000) #set the voltage on channel 1
d[i]=adcdac.read_adc_voltage(1, 0)

t2 = time.time() # end time in s
dt = t2 - t1 # time delta


The measured time is approx 1 s, which means that I can transfer 10000 IO pairs (one write and one read) in 1 second. Read only takes 0.62 s for 10.000 reads. So this is all I can achieve, which is far off the 70 kHz communicated somewhere else?

17/05/2019

Posted by:
andrew

andrew Avatar

Location:
United Kingdom

andrew Twitter  andrew Website  

The performance problems you are having are coming from using Python.

Python is an interpreted language which has a far lower performance than compiled programming languages like C or C++.
To get the most performance out of the ADC DAC Pi I would recommend using a compiled programming language like C.

To give you an idea of the performance difference I rewrote your program using the C version of our ADC DAC Pi library and ran it on a Raspberry Pi B 3+. The C program takes approximately 22.3 milliseconds to complete the same 10000 loops as your python program.

The code for the C program is shown below. You can download the ADCDAC Pi C library from our Github repository.


/*
* test.c
* compile with "gcc ABE_ADCDACPi.c test.c -o test"
* run with "./test"
*/

#include <stdio.h>
#include <stdint.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>

#include "ABE_ADCDACPi.h"

void clearscreen ()
{
printf("\033[2J\033[1;1H");
}

int main(int argc, char **argv){
setvbuf (stdout, NULL, _IONBF, 0); // needed to print to the command line

struct timeval t1, t2;
double dt;

double d[10000];

set_dac_gain(1);

// start timer
gettimeofday(&t1, NULL);

int i;

for (i = 0; i <= 10000; i++){
set_dac_voltage(1, 1.5*i/10000);
d[i] = read_adc_voltage(1, 0);
}

// stop timer
gettimeofday(&t2, NULL);

// compute and print the elapsed time in millisec
dt = (t2.tv_sec - t1.tv_sec) * 1000.0; // sec to ms
dt += (t2.tv_usec - t1.tv_usec) / 1000.0; // us to ms


printf("%G",dt);

return (0);
}

Sign in to post your reply

Note: documents in Portable Document Format (PDF) require Adobe Acrobat Reader 5.0 or higher to view.
Download Adobe Acrobat Reader or other PDF reading software for your computer or mobile device.