How to use timer interrupt from GPIO to control sampling period of ADC in BeagleBone Black by c++ co

I’m a university student, who need to study about making adc capturing in BeagleBone Black.

Everything goes really well. I can sampling the data from adc and even print the time stamp in each sample value.
Then I check the sampling period of result which i got by using oscilloscope the check the wave from GPIO P8_10 by using “BeagleBoneBlack-GPIO” library. Finally I realized that the sampling period is not stable at all.

And I assumed that I supposed to use Interrupt timer in BeagleBone Black. But my root-skill is pretty low to make it by my own.

Anyway. How can i make Interrupt timer by c++ through GPIO because I need to used the interrupt timer to control the adc to make the steady and stable sampling period such as 3ms.

data below is which version I am using, the code, and the result right now also

BeagleBone Black
Debian GNU/LInux 8.11 (jessie)
Linux 5.0.3-bone5
ARMv7 Processor rev2 (v7l)

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

    #include <math.h>
    #include<iostream>
    #include<fstream>
    #include<string>
    #include<sstream>
    #include<unistd.h>
    #include "GPIO/GPIOManager.h"
    #include "GPIO/GPIOConst.h"

    using namespace std;
    #define LIN0_PATH "/sys/bus/iio/devices/iio:device0/in_voltage" 
    int readAnalog(int number){
            stringstream ss;
            ss << LIN0_PATH << number << "_raw";
            fstream fs;
            fs.open(ss.str().c_str(), fstream::in);
            fs >> number;
            fs.close(); 
     return number; 
     } 
     int main(int argc, char* argv[ ]){ 
     int i=0;       
     GPIO::GPIOManager* gp = GPIO::GPIOManager::getInstance();  
     int pin1 = GPIO::GPIOConst::getInstance()->getGpioByKey("P8_10");  
     gp->setDirection(pin1, GPIO::OUTPUT);

      char buffer[26];   
      int millisec;   
      struct tm* tm_info;   
      struct timeval tv;

    gettimeofday(&tv, NULL);   
    millisec = lrint(tv.tv_usec/1000.0); // Round to nearest millisec   
    if (millisec>=1000) {                
        millisec -=1000;
        tv.tv_sec++;
        }   tm_info = localtime(&tv.tv_sec);   
    strftime(buffer, 26, "%d/%m/%Y %H:%M:%S", tm_info);   
    cout<<"print date and time"<<buffer<<":"<<millisec << endl;

    for (int j=0;j<100;j++){  
      gp->setValue(pin1, GPIO::HIGH);  
      float value[j] = readAnalog(0)*(1.8/4096) ;  
      gp->setValue(pin1, GPIO::LOW);  
      usleep(300);  
    }    

    for (int j=0;j<100;j++){   
      cout << fixed;   
      cout.precision(3);   
      cout <<i<<";"<<value<< endl;

    i++; }

    return 0; }
And these are command to run the my file

g++ GPIO/GPIOConst.cpp GPIO/GPIOManager.cpp try.cpp

then

./a.out

and this is the result

print date and time10/04/2019 17:02:27:460

0;1.697
1;1.697
2;1.695
3;1.693
4;1.694
5;1.693
6;1.693
7;1.692
8;1.691
9;1.692
10;1.693
11;1.692
12;1.694
13;1.694
14;1.694
15;1.692
16;1.695
17;1.692
18;1.693
19;1.694
20;1.693
21;1.691
22;1.692
23;1.693
24;1.691
25;1.693
26;1.693
27;1.693
28;1.694
29;1.691
30;1.694
31;1.693
32;1.695
33;1.691
34;1.694
35;1.693
36;1.693
37;1.691
38;1.693
39;1.691
40;1.692
41;1.694
42;1.692
43;1.692
44;1.693
45;1.692
46;1.694
47;1.693
48;1.693
49;1.692
50;1.692
51;1.692
52;1.691
53;1.690
54;1.691
55;1.692
56;1.693
57;1.692
58;1.692
59;1.692
60;1.694
61;1.694
62;1.694
63;1.694
64;1.693
65;1.692
66;1.693
67;1.692
68;1.693
69;1.693
70;1.692
71;1.692
72;1.693
73;1.694
74;1.693
75;1.694
76;1.693
77;1.692
78;1.694
79;1.692
80;1.692
81;1.692
82;1.692
83;1.692
84;1.694
85;1.694
86;1.693
87;1.693
88;1.694
89;1.693
90;1.693
91;1.692
92;1.694
93;1.691
94;1.694
95;1.693
96;1.691
97;1.692
98;1.693
99;1.694

and this is what i got from oscilloscope

It will be really great if there are anyone who would love to give me some advice. And If there are something concerning you guys. Please feel free to ask me.

Best Regard

Peeranut Noonurak

Hi Peeranut.

The only simple way I found to get stable sampling intervals on BBB is by using IIO linux kernel subsystem instead.
There is some discussion here which helped me a lot.