Как использовать прерывание по таймеру от GPIO для управления периодом дискретизации АЦП в BeagleBone Black с помощью кода C ++? - PullRequest
2 голосов
/ 10 апреля 2019

Я студент университета, которому нужно учиться делать захват АЦП в BeagleBone Black.

Все идет очень хорошо. Я могу выбрать данные из АЦП и даже распечатать метку времени в каждом значении выборки. Затем я проверяю период выборки результата, который я получил с помощью осциллографа, проверяю волну от GPIO P8_10 с помощью библиотеки " BeagleBoneBlack-GPIO " Наконец, я понял, что период выборки вообще не стабилен.

И я предположил, что должен использовать таймер прерывания в BeagleBone Black. Но мой корневой навык довольно низок, чтобы сделать его самостоятельно.

Во всяком случае. Как я могу сделать таймер прерывания c ++ через GPIO, потому что мне нужно использовать таймер прерывания для управления АЦП, чтобы сделать устойчивый и стабильный период выборки, например, 3 мс.

ниже приведены данные о том, какую версию я использую, код и результат также

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

И это команда для запуска моего файла

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

затем

./a.out

и это результат

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

[и вот что я получил от осциллографа] [1]

[1]: https://i.stack.imgur.com/FJSRe.jpg

Было бы здорово, если бы кто-нибудь хотел бы дать мне совет. И если есть что-то, касающееся вас, ребята. Пожалуйста, не стесняйтесь спрашивать меня.

С наилучшими пожеланиями

Перанут Ноонурак

...