PiScope (Raspberry Pi baserat oscilloskop) (9 / 10 steg)
Steg 9: Datainsamling för PiScope
När ADC har anslutits och kärnmodulen har lästs, kan data läsas från ADC genom att ansluta till enhetsfilen associeras med kärnmodulen. För att ansluta till kernel-modulen, behövs ett annat program. Detta program kan skrivas i flera olika programspråk. Den här artikeln valdes C++. Skapa en ny fil som heter readout.cpp och Lägg till följande kod eller ladda upp readout.cpp bifogas nedan.
< code >
#include < iostream >
#include < cmath >
#include < fstream >
#include < bitset >
TypeDef unsigned int uint32_t;
CONST int DataPointsRPi = 10000;
struct DataStructRPi {
uint32_t buffert [DataPointsRPi];
uint32_t tid.
};
int main () {
struct DataStructRPi dataStruct;
unsigned char * ScopeBufferStart;
unsigned char * ScopeBufferStop;
unsigned char * buf_p;
buf_p = (unsigned char *) & dataStruct;
ScopeBufferStart = (unsigned char *) & dataStruct;
ScopeBufferStop = ScopeBufferStart + sizeof (struct DataStructRPi);
std::string linje;
std::ifstream MinFil ("/ dev/chardev");
IF(myfile.is_open()) {
samtidigt (std::getline(myfile,line)) {
för (int jag = 0; jag < line.size(); i ++) {
IF(buf_p>ScopeBufferStop)
std::cerr << "buf_p utanför intervallet!" << std::endl;
* (buf_p) = line [i];
buf_p ++;
}
}
myfile.Close();
}
annat std::cerr << "Kan inte öppna filen" << std::endl;
dubbel tid = dataStruct.time/ (dubbel) DataPointsRPi;
för (int jag = 0; jag < DataPointsRPi; i ++) {
int valueADC1 = 0;
int tmp = dataStruct.Buffer[i] & (0b11111 << (7));
valueADC1 = tmp >> (7);
tmp = dataStruct.Buffer[i] & (0b1 << (25));
valueADC1 += (tmp >> (20));
int valueADC2 = 0;
tmp = dataStruct.Buffer[i] & (0b11 << (17));
valueADC2 = tmp >> 17.
tmp = dataStruct.Buffer[i] & (0b111 << (22));
valueADC2 += (tmp >> 20);
tmp = dataStruct.Buffer[i] & (0b1 << (27));
valueADC2 += (tmp >> 22);
std::Cout << jag * tid << "\t" << valueADC1*(5./63.) << "\t" << valueADC2*(5./63.) << std::endl;
}
Return 0;
}
Detta program omfattar definitionen av data struct som matchar versionen i kärnmodulen. Funktionen Main () ansluter till /dev/chardev enheten, som orsakar kärnmodulen till avläsning i ADC och lagra värdena. Sedan data läses från minnesbufferten och kopieras till den lokala buffert inom funktionen Main (). Slutligen, data omvandlas till en tid i nano sekunder och spänningsvärden. Tiden och två spänningsvärden skrivs sedan ut i kolumner. Spänningsvärden läsa av ADCs kodas som sex bitar. Bitarna är avkodas med hjälp av bitars SKIFT och lite kloka och verksamhet.
För att kompilera programmet data förvärv, skriver du:
g ++ -o avläsning readout.cpp
Sedan köra programmet genom att skriva:
. / avläsning > data.txt
Datafilen kan visas med gnuplot. Installera gnuplot genom att skriva:
sudo lämplig-få installera -y gnuplot-x11 < br >
Skriv sedan gnuplot och ange makro anges nedan:
< code >
Ange nyckeln inne rätten topp
Ange titel "ADC avläsning"
ställa xlabel "Time [ns]"
ställa ylabel "Spänning [V]"
Plot "data. txt"använder 1: 2 titel"ADC1"med linjer, \
"data. txt"använder 1: 3 titel"ADC2"med linjer
Ytterligare information om gnuplot finns på: http://www.gnuplot.info/