verbesserte Stabilitaet
This commit is contained in:
parent
b9d7caab28
commit
e3b7d60e16
89
drv/b15f.cpp
89
drv/b15f.cpp
|
@ -264,6 +264,8 @@ uint16_t B15F::analogeEingabe(uint8_t channel)
|
||||||
|
|
||||||
bool B15F::analogEingabeSequenz(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
|
bool B15F::analogEingabeSequenz(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
writeByte(RQ_ADC_DAC_STROKE);
|
writeByte(RQ_ADC_DAC_STROKE);
|
||||||
|
@ -276,19 +278,24 @@ bool B15F::analogEingabeSequenz(uint8_t channel_a, uint16_t* buffer_a, uint32_t
|
||||||
|
|
||||||
if(aw != MSG_OK)
|
if(aw != MSG_OK)
|
||||||
{
|
{
|
||||||
std::cout << PRE << "Mikrocontroller nicht synchronisiert" << std::endl;
|
discard();
|
||||||
throw DriverException("Mikrocontroller nicht synchronisiert");
|
return analogEingabeSequenz(channel_a, buffer_a, offset_a, channel_b, buffer_b, offset_b, start, delta, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(uint16_t i = 0; i < count; i++)
|
for(uint16_t i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
buffer_a[offset_a + i] = readInt();
|
uint8_t block[4];
|
||||||
buffer_b[offset_b + i] = readInt();
|
bool crc_ok = true;
|
||||||
if(buffer_a[offset_a + i] > 1023 || buffer_b[offset_b + i] > 1023)
|
do
|
||||||
{
|
{
|
||||||
std::cout << PRE << "Schlechte Werte gefunden" << std::endl;
|
crc_ok = readBlock(&block[0], 0);
|
||||||
throw DriverException("Schlechte Werte gefunden");
|
if(!crc_ok)
|
||||||
|
std::cout << "fordere neu an" << std::endl;
|
||||||
}
|
}
|
||||||
|
while(!crc_ok);
|
||||||
|
|
||||||
|
buffer_a[offset_a + i] = ((uint16_t) block[0]) | (((uint16_t) block[1]) << 8);
|
||||||
|
buffer_b[offset_b + i] = ((uint16_t) block[2]) | (((uint16_t) block[3]) << 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
aw = readByte();
|
aw = readByte();
|
||||||
|
@ -356,6 +363,74 @@ uint16_t B15F::readInt()
|
||||||
return readByte() | readByte() << 8;
|
return readByte() | readByte() << 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool B15F::readBlock(uint8_t* buffer, uint16_t offset)
|
||||||
|
{
|
||||||
|
uint8_t len = readByte();
|
||||||
|
uint8_t crc = 0;
|
||||||
|
buffer += offset;
|
||||||
|
|
||||||
|
// wait for block
|
||||||
|
int n_ready;
|
||||||
|
uint16_t elapsed = 0;
|
||||||
|
auto start = std::chrono::steady_clock::now();
|
||||||
|
auto end = start;
|
||||||
|
while(elapsed < block_timeout)
|
||||||
|
{
|
||||||
|
int code = ioctl(usart, FIONREAD, &n_ready);
|
||||||
|
if(code != 0)
|
||||||
|
{
|
||||||
|
std::cout << PRE << "n_ready code: " << code << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(n_ready >= len + 1)
|
||||||
|
break;
|
||||||
|
end = std::chrono::steady_clock::now();
|
||||||
|
elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
|
||||||
|
}
|
||||||
|
if(elapsed >= timeout)
|
||||||
|
{
|
||||||
|
std::cout << PRE << "block timeout: " << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(len--)
|
||||||
|
{
|
||||||
|
int code = read(usart, buffer, 1);
|
||||||
|
if(code != 1)
|
||||||
|
{
|
||||||
|
std::cout << PRE << "read code: " << code << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
crc ^= *buffer++;
|
||||||
|
for (uint8_t i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
if (crc & 1)
|
||||||
|
crc ^= CRC7_POLY;
|
||||||
|
crc >>= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
crc ^= readByte();
|
||||||
|
for (uint8_t i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
if (crc & 1)
|
||||||
|
crc ^= CRC7_POLY;
|
||||||
|
crc >>= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (crc == 0)
|
||||||
|
{
|
||||||
|
writeByte(MSG_OK);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
writeByte(MSG_FAIL);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void B15F::delay(uint16_t ms)
|
void B15F::delay(uint16_t ms)
|
||||||
{
|
{
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(ms));
|
std::this_thread::sleep_for(std::chrono::milliseconds(ms));
|
||||||
|
|
19
drv/b15f.h
19
drv/b15f.h
|
@ -1,5 +1,5 @@
|
||||||
#ifndef B15F_h
|
#ifndef B15F_H
|
||||||
#define B15F_h
|
#define B15F_H
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <bits/stdc++.h>
|
#include <bits/stdc++.h>
|
||||||
|
@ -44,6 +44,7 @@ public:
|
||||||
inline void writeInt(uint16_t);
|
inline void writeInt(uint16_t);
|
||||||
inline uint8_t readByte(void);
|
inline uint8_t readByte(void);
|
||||||
inline uint16_t readInt(void);
|
inline uint16_t readInt(void);
|
||||||
|
inline bool readBlock(uint8_t* buffer, uint16_t offset);
|
||||||
|
|
||||||
|
|
||||||
void delay(uint16_t);
|
void delay(uint16_t);
|
||||||
|
@ -52,18 +53,20 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int usart = -1;
|
int usart = -1;
|
||||||
uint16_t timeout = 100; // ms
|
uint16_t timeout = 200; // ms
|
||||||
|
uint16_t block_timeout = 1; // ms
|
||||||
|
|
||||||
static B15F* instance;
|
static B15F* instance;
|
||||||
|
|
||||||
// CONSTANTS
|
// CONSTANTS
|
||||||
const std::string PRE = "[B15F] ";
|
const std::string PRE = "[B15F] ";
|
||||||
const std::string SERIAL_DEVICE = "/dev/ttyUSB0";
|
const std::string SERIAL_DEVICE = "/dev/ttyUSB0";
|
||||||
constexpr static uint8_t MSG_OK = 0xFF;
|
constexpr static uint8_t MSG_OK = 0xFF;
|
||||||
constexpr static uint8_t MSG_FAIL = 0xFE;
|
constexpr static uint8_t MSG_FAIL = 0xFE;
|
||||||
constexpr static uint16_t RECONNECT_TIMEOUT = 32; // ms
|
constexpr static uint16_t RECONNECT_TIMEOUT = 64; // ms
|
||||||
constexpr static uint8_t RECONNECT_TRIES = 3;
|
constexpr static uint8_t RECONNECT_TRIES = 3;
|
||||||
constexpr static uint32_t BAUDRATE = 115200;
|
constexpr static uint32_t BAUDRATE = 115200;
|
||||||
|
constexpr static uint8_t CRC7_POLY = 0x91;
|
||||||
|
|
||||||
// REQUESTS
|
// REQUESTS
|
||||||
constexpr static uint8_t RQ_DISC = 0;
|
constexpr static uint8_t RQ_DISC = 0;
|
||||||
|
@ -80,4 +83,4 @@ private:
|
||||||
constexpr static uint8_t RQ_ADC_DAC_STROKE = 12;
|
constexpr static uint8_t RQ_ADC_DAC_STROKE = 12;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // B15F_h
|
#endif // B15F_H
|
||||||
|
|
BIN
drv/b15f.o
BIN
drv/b15f.o
Binary file not shown.
|
@ -8,28 +8,29 @@ set xrange [5:0]
|
||||||
set x2range [5:0]
|
set x2range [5:0]
|
||||||
set y2range [0:50]
|
set y2range [0:50]
|
||||||
set yrange [0:50]
|
set yrange [0:50]
|
||||||
set label at 2,38 'U_{DS} [V] = 300' right
|
set label at 2,32 'U_{DS} [V] = 300' right
|
||||||
set label at 2,29 'U_{DS} [V] = 325' right
|
set label at 2,30 'U_{DS} [V] = 325' right
|
||||||
set label at 2,31 'U_{DS} [V] = 350' right
|
set label at 2,33 'U_{DS} [V] = 350' right
|
||||||
set label at 2,32 'U_{DS} [V] = 375' right
|
set label at 2,21 'U_{DS} [V] = 375' right
|
||||||
set label at 2,33 'U_{DS} [V] = 400' right
|
set label at 2,21 'U_{DS} [V] = 400' right
|
||||||
set label at 2,20 'U_{DS} [V] = 425' right
|
set label at 2,5 'U_{DS} [V] = 425' right
|
||||||
set label at 2,20 'U_{DS} [V] = 450' right
|
set label at 2,22 'U_{DS} [V] = 450' right
|
||||||
set label at 2,11 'U_{DS} [V] = 475' right
|
set label at 2,12 'U_{DS} [V] = 475' right
|
||||||
set label at 2,21 'U_{DS} [V] = 500' right
|
set label at 2,23 'U_{DS} [V] = 500' right
|
||||||
set label at 2,21 'U_{DS} [V] = 525' right
|
set label at 2,23 'U_{DS} [V] = 525' right
|
||||||
set label at 2,11 'U_{DS} [V] = 550' right
|
set label at 2,2 'U_{DS} [V] = 550' right
|
||||||
set label at 2,11 'U_{DS} [V] = 575' right
|
set label at 2,12 'U_{DS} [V] = 575' right
|
||||||
set label at 2,11 'U_{DS} [V] = 600' right
|
set label at 2,13 'U_{DS} [V] = 600' right
|
||||||
set label at 2,11 'U_{DS} [V] = 600' right
|
set label at 2,5 'U_{DS} [V] = 625' right
|
||||||
set label at 2,11 'U_{DS} [V] = 600' right
|
set label at 2,6 'U_{DS} [V] = 650' right
|
||||||
set label at 2,11 'U_{DS} [V] = 600' right
|
set label at 2,6 'U_{DS} [V] = 675' right
|
||||||
set label at 2,11 'U_{DS} [V] = 600' right
|
set label at 2,2 'U_{DS} [V] = 700' right
|
||||||
set label at 2,11 'U_{DS} [V] = 600' right
|
set label at 2,2 'U_{DS} [V] = 700' right
|
||||||
|
set label at 2,2 'U_{DS} [V] = 700' right
|
||||||
set y2tics
|
set y2tics
|
||||||
unset ytics
|
unset ytics
|
||||||
set ytics format ''
|
set ytics format ''
|
||||||
unset output
|
unset output
|
||||||
set terminal qt
|
set terminal qt
|
||||||
unset output
|
unset output
|
||||||
plot "/tmp/tempfile1" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 300' w l,"/tmp/tempfile2" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 325' w l,"/tmp/tempfile3" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 350' w l,"/tmp/tempfile4" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 375' w l,"/tmp/tempfile5" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 400' w l,"/tmp/tempfile6" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 425' w l,"/tmp/tempfile7" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 450' w l,"/tmp/tempfile8" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 475' w l,"/tmp/tempfile9" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 500' w l,"/tmp/tempfile10" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 525' w l,"/tmp/tempfile11" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 550' w l,"/tmp/tempfile12" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 575' w l,"/tmp/tempfile13" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 600' w l,"/tmp/tempfile14" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 625' w l,"/tmp/tempfile15" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 650' w l,"/tmp/tempfile16" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 675' w l,"/tmp/tempfile17" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 700' w l,"/tmp/tempfile18" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 725' w l
|
plot "/tmp/tempfile1" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 300' w l,"/tmp/tempfile2" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 325' w l,"/tmp/tempfile3" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 350' w l,"/tmp/tempfile4" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 375' w l,"/tmp/tempfile5" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 400' w l,"/tmp/tempfile6" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 425' w l,"/tmp/tempfile7" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 450' w l,"/tmp/tempfile8" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 475' w l,"/tmp/tempfile9" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 500' w l,"/tmp/tempfile10" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 525' w l,"/tmp/tempfile11" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 550' w l,"/tmp/tempfile12" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 575' w l,"/tmp/tempfile13" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 600' w l,"/tmp/tempfile14" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 625' w l,"/tmp/tempfile15" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 650' w l,"/tmp/tempfile16" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 675' w l,"/tmp/tempfile17" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 700' w l,"/tmp/tempfile18" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 725' w l,"/tmp/tempfile19" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 750' w l
|
||||||
|
|
Loading…
Reference in a new issue