Mittalaitteen mitta-arvon kalibrointia tarvitaan epälineaarisen mitta-arvon korjaamisessa oikeaksi. Tyypillisesti esimerkiksi voima-anturin mittaamaa arvoa noudutaan korjaamaan tarkoissa mittauksissa. Seuraava ohjelman avulla voidaan vektoriehin CorrectVal = oikea arvo ja ValFromSensor = anturilta tuleva arvo asettaa määräämätön määrä pisteitä. Näiden pisteiden avulla määrätään kalibrointikäyrä. Funktiolla double SensorUnlinearityCorrection::SensorErrorCorrection(double in), jonka parametrina annetaan mitattu arvo saadaan palautettua todellinen arvo ohjelmaan.
KayranKompensointiJaSovitus.zip
ParempiKalibrointi.zip
Code Block |
---|
#ifndef SENSORUNLINEARITYCORRECTION_H
#define SENSORUNLINEARITYCORRECTION_H
#include <QObject>
#include <QVector>
// Error correction class for sensors
// Luokka kalibrointikäyrän muodostamiseksi epälineaariselle anturille
class SensorUnlinearityCorrection : public QObject
{
Q_OBJECT
public:
explicit SensorUnlinearityCorrection(QObject *parent = 0);
//funktio SensorErrorCorrection laskee oikean arvon parametrina annetulle anturilta tulevalle arvolle
double SensorErrorCorrection(double in);
//funktio CalcCalibrationConstants laskee suoranpätkien kulmakertoimet (a:t) sekä siirtymät suorien alkupisteissä (b:t)
void CalcCalibrationConstants();
private:
//muuttujat CorrectVal ja ValFromSensor ovat vektoripari, joista ensimmäinen sisältää "oikean" mitta-arvon joka saadaan vertailumittauksella ja
//jälkimmäinen on anturilta tuleva arvo. Näiden perusteella lasketaan suorien pätkien kulmakertoimet ja virheet suorien alkupisteissä eli a ja b
QVector <double> CorrectVal;
QVector <double> ValFromSensor;
QVector <double> a,b;//angle offset
signals:
public slots:
};
#endif // SENSORUNLINEARITYCORRECTION_H
|
Code Block |
---|
#include "sensorunlinearitycorrection.h"
SensorUnlinearityCorrection::SensorUnlinearityCorrection(QObject *parent) :
QObject(parent)
{
//esimerkkina arvot kolmessa kohdassa mitta-aluetta
CorrectVal.append(0.0);
ValFromSensor.append(0.0);
CorrectVal.append(50.0);
ValFromSensor.append(52.0);
CorrectVal.append(100.0);
ValFromSensor.append(98.0);
}
// kertoimien laskenta
void SensorUnlinearityCorrection::CalcCalibrationConstants()
{
int i;
int length = CorrectVal.size();
a.empty();
b.empty();
for(i=0;i<length;i++)
{
b.append(CorrectVal[i]-ValFromSensor[i]);
}
for(i=0;i<(length-1);i++)
{
a.append((b[i+1]-b[i])/(CorrectVal[i+1]-CorrectVal[i]));
}
}
//oikean arvon haku
double SensorUnlinearityCorrection::SensorErrorCorrection(double in)
{
int length = CorrectVal.size();
int i;
double out;
for(i=0;i<(length-1);i++)
{
if(in>=CorrectVal[i]&&in<=CorrectVal[i+1])
{
out=in+(in-CorrectVal[i])*a[i]+b[i];
return out;
}
}
out=in;
return out;
}
|
Esimerkkinä QDialog perustainen ohjelma, jolla voi testata kalibrointikäyrän tomintaa.
Code Block |
---|
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include "sensorunlinearitycorrection.h"
namespace Ui {
class Dialog;
}
class Dialog : public QDialog {
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
~Dialog();
SensorUnlinearityCorrection sensorUnlinearityCorrection;
protected:
void changeEvent(QEvent *e);
private:
Ui::Dialog *ui;
private slots:
void on_horizontalSlider_sliderMoved(int position);
};
#endif // DIALOG_H
|
Code Block |
---|
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
sensorUnlinearityCorrection.CalcCalibrationConstants();
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::changeEvent(QEvent *e)
{
QDialog::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
void Dialog::on_horizontalSlider_sliderMoved(int position)
{
double Arvo=sensorUnlinearityCorrection.SensorErrorCorrection((double)position);
ui->anturinAntamaArvo->setNum(Arvo);
ui->todellinenarvo->setNum(position);
}
|