Interface to a standard tarco sensor. Measure the periode and the cal the speed

Committer:
gert_lauritsen
Date:
Wed Mar 09 13:24:26 2016 +0000
Revision:
13:4b58c9730bc7
Parent:
12:9269bd188bfa
Child:
14:07d968decc76
Fjernet callback, da det gav problemer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gert_lauritsen 2:c50da089786a 1 #include "Tarco.h"
gert_lauritsen 4:35024179a736 2 #include "mbed.h"
gert_lauritsen 4:35024179a736 3
gert_lauritsen 10:94eed3809760 4 #define NPulsPrRotation 25
gert_lauritsen 10:94eed3809760 5
gert_lauritsen 4:35024179a736 6 DigitalOut debug(LED2);
gert_lauritsen 0:8421e11df32a 7
gert_lauritsen 12:9269bd188bfa 8 Tarco::Tarco(PinName tarcosignal, char mode) :
gert_lauritsen 4:35024179a736 9 _tarcosensor(tarcosignal)
gert_lauritsen 4:35024179a736 10 {
gert_lauritsen 9:6b8619ccb136 11 tarcomode=mode; lastfrekvens=0; AdvPeriode[0]=0;
gert_lauritsen 7:752b8065ce2d 12 // AdvPeriode=0;
gert_lauritsen 8:2e6b17f1da02 13 if (mode==RunMeanSwitchAuto)
gert_lauritsen 7:752b8065ce2d 14 _tarcosensor.fall(this, &Tarco::RunMeanMeasure);
gert_lauritsen 8:2e6b17f1da02 15 if (mode==SwitchAuto)
gert_lauritsen 7:752b8065ce2d 16 _tarcosensor.fall(this, &Tarco::Rotationtimer);
gert_lauritsen 8:2e6b17f1da02 17 if (mode==HirthMode)
gert_lauritsen 8:2e6b17f1da02 18 _tarcosensor.fall(this, &Tarco::Hird);
gert_lauritsen 8:2e6b17f1da02 19 }
gert_lauritsen 8:2e6b17f1da02 20
gert_lauritsen 8:2e6b17f1da02 21 void Tarco::Hird()
gert_lauritsen 8:2e6b17f1da02 22 {
gert_lauritsen 8:2e6b17f1da02 23 //Hird er en totakt, der kommer med
gert_lauritsen 8:2e6b17f1da02 24 t.stop();
gert_lauritsen 8:2e6b17f1da02 25 AdvPeriode[0]=t.read_us();
gert_lauritsen 8:2e6b17f1da02 26 t.reset();
gert_lauritsen 8:2e6b17f1da02 27 t.start();
gert_lauritsen 0:8421e11df32a 28 }
gert_lauritsen 0:8421e11df32a 29
gert_lauritsen 7:752b8065ce2d 30 void Tarco::Rotationtimer()
gert_lauritsen 4:35024179a736 31 {
gert_lauritsen 7:752b8065ce2d 32 //Da switchAuto motoren kommer ud med 24 pulser/rotation laver vi en prescale på 24
gert_lauritsen 7:752b8065ce2d 33 //
gert_lauritsen 7:752b8065ce2d 34 static int pulscounter;
gert_lauritsen 8:2e6b17f1da02 35 if (pulscounter++>=PulsPrRotation-1) { //Vi tæller til 24, således at det er tiden/omgang
gert_lauritsen 4:35024179a736 36 t.stop();
gert_lauritsen 7:752b8065ce2d 37 AdvPeriode[0]=t.read_us();
gert_lauritsen 12:9269bd188bfa 38 // callback(AdvPeriode[0]);
gert_lauritsen 4:35024179a736 39 t.reset();
gert_lauritsen 4:35024179a736 40 t.start();
gert_lauritsen 7:752b8065ce2d 41 pulscounter=0;
gert_lauritsen 4:35024179a736 42 }
gert_lauritsen 0:8421e11df32a 43 }
gert_lauritsen 0:8421e11df32a 44
gert_lauritsen 13:4b58c9730bc7 45 void Tarco::TarcoTimeout() {
gert_lauritsen 13:4b58c9730bc7 46 //Timeout på tarco puls, så vi får resat tarcoen, når den staopper
gert_lauritsen 13:4b58c9730bc7 47
gert_lauritsen 13:4b58c9730bc7 48 }
gert_lauritsen 7:752b8065ce2d 49 void Tarco::RunMeanMeasure()
gert_lauritsen 4:35024179a736 50 {
gert_lauritsen 7:752b8065ce2d 51 static unsigned int TarcoHead;
gert_lauritsen 7:752b8065ce2d 52 //Måler tarco ved at lave en runing mean på periodetiderne, hvis der en variation
gert_lauritsen 7:752b8065ce2d 53 //på over 20% bliver den pågældende periode skippet
gert_lauritsen 8:2e6b17f1da02 54 //Hvilket btyder at man skipper den lange Syncpuls, og kun tællere på de korte
gert_lauritsen 8:2e6b17f1da02 55
gert_lauritsen 7:752b8065ce2d 56 static bool MistedPeriod; //dette var en lang periode
gert_lauritsen 7:752b8065ce2d 57 int thisperiode;
gert_lauritsen 7:752b8065ce2d 58 float periodechange=0;
gert_lauritsen 4:35024179a736 59 t.stop();
gert_lauritsen 5:451dd1189b0f 60 if (TarcoHead>=TarcoRunMean) TarcoHead=0;
gert_lauritsen 6:2ad5029f7b1a 61 thisperiode=t.read_us();
gert_lauritsen 7:752b8065ce2d 62 if (lastperiode!=0)
gert_lauritsen 7:752b8065ce2d 63 periodechange=(float) thisperiode/lastperiode;
gert_lauritsen 6:2ad5029f7b1a 64 if((periodechange<1.2) || (lastperiode==0) || MistedPeriod) {
gert_lauritsen 7:752b8065ce2d 65 AdvPeriode[TarcoHead++]=thisperiode;
gert_lauritsen 7:752b8065ce2d 66 MistedPeriod=false;
gert_lauritsen 7:752b8065ce2d 67 } else
gert_lauritsen 7:752b8065ce2d 68 MistedPeriod=true;
gert_lauritsen 4:35024179a736 69 t.reset();
gert_lauritsen 5:451dd1189b0f 70 t.start();
gert_lauritsen 0:8421e11df32a 71 }
gert_lauritsen 0:8421e11df32a 72
gert_lauritsen 4:35024179a736 73 float Tarco::Speed()
gert_lauritsen 4:35024179a736 74 {
gert_lauritsen 4:35024179a736 75 //returns puls/sek [hz]
gert_lauritsen 7:752b8065ce2d 76 unsigned int periodetid;
gert_lauritsen 9:6b8619ccb136 77 static int tarcotimeout;
gert_lauritsen 11:284b87a84cdd 78
gert_lauritsen 7:752b8065ce2d 79 lastfrekvens=0;
gert_lauritsen 7:752b8065ce2d 80 switch (tarcomode) {
gert_lauritsen 8:2e6b17f1da02 81 case RunMeanSwitchAuto: {
gert_lauritsen 7:752b8065ce2d 82 periodetid=0;
gert_lauritsen 7:752b8065ce2d 83 for (int i=0; i<TarcoRunMean; i++) periodetid+=AdvPeriode[i];
gert_lauritsen 7:752b8065ce2d 84 lastperiode=periodetid/TarcoRunMean;
gert_lauritsen 10:94eed3809760 85 lastfrekvens=(1e6/periodetid)*(TarcoRunMean/NPulsPrRotation);
gert_lauritsen 7:752b8065ce2d 86 } break;
gert_lauritsen 8:2e6b17f1da02 87 case SwitchAuto: {
gert_lauritsen 9:6b8619ccb136 88 if (AdvPeriode[0]) {
gert_lauritsen 9:6b8619ccb136 89 lastfrekvens=(1e6/AdvPeriode[0]);
gert_lauritsen 9:6b8619ccb136 90 tarcotimeout=0; AdvPeriode[0]=0;
gert_lauritsen 9:6b8619ccb136 91 }
gert_lauritsen 9:6b8619ccb136 92 else {
gert_lauritsen 9:6b8619ccb136 93 if (tarcotimeout>10) {
gert_lauritsen 9:6b8619ccb136 94 lastfrekvens=0; AdvPeriode[0];
gert_lauritsen 9:6b8619ccb136 95 }
gert_lauritsen 9:6b8619ccb136 96 tarcotimeout++;
gert_lauritsen 9:6b8619ccb136 97 }
gert_lauritsen 7:752b8065ce2d 98 } break;
gert_lauritsen 8:2e6b17f1da02 99 case HirthMode: {
gert_lauritsen 8:2e6b17f1da02 100 lastfrekvens=(500e3/AdvPeriode[0]); //vi skal kun gannge med det halve da der er 2 pulser /omgang
gert_lauritsen 8:2e6b17f1da02 101 } break;
gert_lauritsen 8:2e6b17f1da02 102
gert_lauritsen 7:752b8065ce2d 103 default: break;
gert_lauritsen 7:752b8065ce2d 104 }
gert_lauritsen 10:94eed3809760 105 return (float) lastfrekvens*60;//Giver hastighed tilbage i RPM
gert_lauritsen 2:c50da089786a 106 }
gert_lauritsen 4:35024179a736 107
gert_lauritsen 4:35024179a736 108 float Tarco::RPM()
gert_lauritsen 4:35024179a736 109 {
gert_lauritsen 7:752b8065ce2d 110 float rpm=lastfrekvens*60;
gert_lauritsen 7:752b8065ce2d 111 return (float) rpm;
gert_lauritsen 4:35024179a736 112 }
gert_lauritsen 4:35024179a736 113