This commit is contained in:
Tristan Krause 2019-06-07 14:15:49 +02:00
parent 338f4a5a1c
commit eb7b5eb69b
47 changed files with 153 additions and 4827 deletions

View file

@ -1,162 +0,0 @@
#include <iostream>
#include <cmath>
#include <b15f/b15f.h>
#include <b15f/plottyfile.h>
void kennlinieErsterQuadrant()
{
B15F& drv = B15F::getInstance();
PlottyFile pf;
uint16_t ba[1024];
uint16_t bb[1024];
const uint16_t sample_count = 1024;
const uint16_t delta = 1;
const uint16_t u_gs_start = 440;
const uint16_t u_gs_delta = 20;
const uint16_t u_gs_end = 600;
pf.setUnitX("V");
pf.setUnitY("mA");
pf.setUnitPara("V");
pf.setDescX("U_{DS}");
pf.setDescY("I_D");
pf.setDescPara("U_{GS}");
pf.setRefX(5);
pf.setRefY(50);
pf.setParaFirstCurve(u_gs_start);
pf.setParaStepWidth(u_gs_delta);
uint8_t curve = 0;
std::cout << "Erfasse Kennlinie erster Quadrant..." << std::endl << std::flush;
for(uint16_t u_gs = u_gs_start; u_gs <= u_gs_end; u_gs += u_gs_delta)
{
drv.analogWrite1(u_gs);
drv.analogSequence(0, &ba[0], 0, 1, &bb[0], 0, 0, delta, sample_count);
for(uint16_t k = 0; k < sample_count; k++)
{
uint16_t i_d = ba[k] - bb[k];
uint16_t u_ds = bb[k];
pf.addDot(Dot(u_ds, i_d, curve));
}
std::cout << "\033[1K\r" << 1e2 * (u_gs - u_gs_start) / (u_gs_end - u_gs_start) << "%" << std::flush;
curve++;
}
std::cout << "\033[1K\r" << std::flush;
// speichern und plotty starten
pf.writeToFile("test_plot");
pf.startPlotty("test_plot");
}
void kennlinieZweiterQuadrant()
{
B15F& drv = B15F::getInstance();
PlottyFile pf;
uint16_t ba[1024];
uint16_t bb[1024];
const uint16_t sample_count = 1024;
const uint16_t delta = 1;
const uint16_t u_gs_start = 300;
const uint16_t u_gs_delta = 25;
const uint16_t u_gs_end = 700;
pf.setQuadrant(2);
pf.setUnitX("V");
pf.setUnitY("mA");
pf.setUnitPara("V");
pf.setDescX("U_{GS}");
pf.setDescY("I_D");
pf.setDescPara("U_{DS}");
pf.setRefX(5);
pf.setRefY(50);
pf.setParaFirstCurve(u_gs_start);
pf.setParaStepWidth(u_gs_delta);
uint8_t curve = 0;
std::cout << "Erfasse Kennlinie zweiter Quadrant..." << std::endl << std::flush;
for(uint16_t u_gs = u_gs_start; u_gs <= u_gs_end; u_gs += u_gs_delta)
{
drv.analogWrite1(u_gs);
drv.analogSequence(0, &ba[0], 0, 1, &bb[0], 0, 0, delta, sample_count);
curve = 0;
for(uint16_t k = 0; k < sample_count; k++)
{
if(ba[k] > bb[k] && bb[k] % 50 == 0 && bb[k] != 0)
{
uint16_t i_d = ba[k] - bb[k];
std::cout << "added" << std::endl;
pf.addDot(Dot(u_gs, i_d, bb[k] / 50));
}
curve++;
}
std::cout << "\033[1K\r" << 1e2 * (u_gs - u_gs_start) / (u_gs_end - u_gs_start) << "%" << std::flush;
}
std::cout << "\033[1K\r" << std::flush;
// speichern und plotty starten
pf.writeToFile("test_plot");
pf.startPlotty("test_plot");
}
void testFunktionen()
{
B15F& drv = B15F::getInstance();
std::cout << "DIP-Switch: " << (int) drv.readDipSwitch() << std::endl;
drv.digitalWrite0(0xFF);
drv.analogWrite0(128);
std::cout << (int) drv.digitalRead0() << std::endl;;
std::cout << "adc: " << (int) drv.analogRead(4) << std::endl;
drv.digitalWrite0(0x00);
drv.analogWrite0(0);
std::cout << (int) drv.digitalRead0() << std::endl;;
std::cout << "adc: " << (int) drv.analogRead(4) << std::endl;
drv.digitalWrite0(0xFF);
drv.analogWrite0(255);
std::cout << (int) drv.digitalRead0() << std::endl;
std::cout << "adc: " << (int) drv.analogRead(4) << std::endl;
std::cout << "Kennlinie..." << std::endl;
uint16_t a[1024];
uint16_t b[1024];
drv.analogSequence(0, &a[0], 0, 1, &b[0], 0, 0, 1, 1024);
/*for(uint16_t i= 0; i < sizeof(a) / sizeof(uint16_t); i++)
{
std::cout << (int) i << " : " << a[i] << " " << b[i] << std::endl;
}*/
}
int main()
{
//testFunktionen();
kennlinieZweiterQuadrant();
std::cout << "Schluss." << std::endl;
}

Binary file not shown.

View file

@ -0,0 +1,152 @@
#include <iostream>
#include <cmath>
#include <iomanip>
#include <b15f/b15f.h>
#include <b15f/plottyfile.h>
const char PLOT_FILE[] = "plot.bin";
void printProgress(double p)
{
constexpr double precision = 1e1;
constexpr int width = 20;
const int n = round(width * p);
p = round(1e2 * precision * p) / precision;
std::cout << "\033[1K\r";
std::cout << "[" << std::string(n, '#') << std::string(width - n, '-') << "] ";
std::cout << std::setfill(' ') << std::setw(5) << std::fixed << std::showpoint << std::setprecision(1) << p << "%" << std::flush;
}
void kennlinieErsterQuadrant()
{
// Puffer für Messwerte
uint16_t u_out[1024];
uint16_t u_drain[1024];
// Ansteuerung der U_GS, Anzahl der Werte für U_GS muss kleiner 64 sein,
// da sonst zu großer Kurvenindex entsteht
const uint16_t u_gs_start = 200;
const uint16_t u_gs_delta = 50;
const uint16_t u_gs_end = 600;
// Ansteuerung durch u_out (ruft Drainstrom i_drain hervor)
const uint16_t seq_start = 0;
const uint16_t seq_delta = 1;
const uint16_t seq_sample_count = 1024;
B15F& drv = B15F::getInstance();
PlottyFile pf;
pf.setUnitX("V");
pf.setUnitY("mA");
pf.setUnitPara("V");
pf.setDescX("U_{DS}");
pf.setDescY("I_D");
pf.setDescPara("U_{GS}");
pf.setRefX(5);
pf.setRefY(50);
pf.setParaFirstCurve(u_gs_start);
pf.setParaStepWidth(u_gs_delta);
uint8_t curve = 0;
std::cout << "Erfasse Kennlinie erster Quadrant..." << std::endl;
for(uint16_t u_gs = u_gs_start; u_gs <= u_gs_end; u_gs += u_gs_delta)
{
drv.analogWrite1(u_gs);
// Erfasse u_out und u_drain und variiere dabei u_out, die aktuelle U_GS bleibt solange konstant
drv.analogSequence(0, &u_out[0], 0, 1, &u_drain[0], 0, seq_start, seq_delta, seq_sample_count);
for(uint16_t k = 0; k < seq_sample_count; k++)
{
uint16_t i_drain = u_out[k] - u_drain[k];
pf.addDot(Dot(u_drain[k], i_drain, curve));
}
curve++;
// Fortschrittsanzeige
printProgress(double(u_gs - u_gs_start) / double(u_gs_end - u_gs_start));
}
std::cout << std::endl << std::flush;
// speichern und plotty starten
pf.writeToFile(PLOT_FILE);
pf.startPlotty(PLOT_FILE);
}
void kennlinieZweiterQuadrant()
{
constexpr uint8_t resolution = 50;
// Puffer für Messwerte
uint16_t u_out[1024];
uint16_t u_drain[1024];
// Ansteuerung der U_GS
const uint16_t u_gs_start = 128;
const uint16_t u_gs_delta = 32;
const uint16_t u_gs_end = 512;
// Ansteuerung druch u_out (ruft Drainstrom i_drain hervor)
const uint16_t seq_start = 0;
const uint16_t seq_delta = 1;
const uint16_t seq_sample_count = 1024;
B15F& drv = B15F::getInstance();
PlottyFile pf;
pf.setQuadrant(2);
pf.setUnitX("V");
pf.setUnitY("mA");
pf.setUnitPara("V");
pf.setDescX("U_{GS}");
pf.setDescY("I_D");
pf.setDescPara("U_{DS}");
pf.setRefX(5);
pf.setRefY(50);
pf.setParaFirstCurve(u_gs_start);
pf.setParaStepWidth(u_gs_delta);
uint8_t curve;
std::cout << "Erfasse Kennlinie zweiter Quadrant..." << std::endl;
for(uint16_t u_gs = u_gs_start; u_gs <= u_gs_end; u_gs += u_gs_delta)
{
drv.analogWrite1(u_gs);
// Erfasse u_out und u_drain und variiere dabei u_out, die aktuelle U_GS bleibt solange konstant
drv.analogSequence(0, &u_out[0], 0, 1, &u_drain[0], 0, seq_start, seq_delta, seq_sample_count);
curve = 0;
for(uint16_t k = 0; k < seq_sample_count; k++)
{
// Speichere nur Werte für i_drain, wo u_drain ein Vielfaches der Auflösung ist
if(u_out[k] > u_drain[k] && u_drain[k] % resolution == 0 && u_drain[k] != 0)
{
uint16_t i_drain = u_out[k] - u_drain[k];
pf.addDot(Dot(u_gs, i_drain, u_drain[k] / resolution));
}
curve++;
}
// Fortschrittsanzeige
printProgress(double(u_gs - u_gs_start) / double(u_gs_end - u_gs_start));
}
std::cout << std::endl << std::flush;
// speichern und plotty starten
pf.writeToFile(PLOT_FILE);
pf.startPlotty(PLOT_FILE);
}
int main()
{
kennlinieErsterQuadrant();
kennlinieZweiterQuadrant();
}