...
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
...
Code Block |
---|
] {code} #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 |
---|
} {code} #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; } {code} |
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 |
---|
{code} {code} #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); } {code} |