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

Tarco.cpp

Committer:
gert_lauritsen
Date:
2016-03-09
Revision:
13:4b58c9730bc7
Parent:
12:9269bd188bfa
Child:
14:07d968decc76

File content as of revision 13:4b58c9730bc7:

#include "Tarco.h"
#include "mbed.h"

#define NPulsPrRotation 25

DigitalOut debug(LED2);

Tarco::Tarco(PinName tarcosignal, char mode) :
    _tarcosensor(tarcosignal)
{
    tarcomode=mode; lastfrekvens=0; AdvPeriode[0]=0;
//   AdvPeriode=0;
    if (mode==RunMeanSwitchAuto)
        _tarcosensor.fall(this, &Tarco::RunMeanMeasure);
    if (mode==SwitchAuto)
        _tarcosensor.fall(this, &Tarco::Rotationtimer);
    if (mode==HirthMode)
        _tarcosensor.fall(this, &Tarco::Hird);
}

void Tarco::Hird()
{
//Hird er en totakt, der kommer med 
        t.stop();
        AdvPeriode[0]=t.read_us();
        t.reset();
        t.start();
}

void Tarco::Rotationtimer()
{
//Da switchAuto motoren kommer ud med 24 pulser/rotation laver vi en prescale på 24
//
    static int pulscounter;
    if (pulscounter++>=PulsPrRotation-1) { //Vi tæller til 24, således at det er tiden/omgang
        t.stop();
        AdvPeriode[0]=t.read_us();
      //  callback(AdvPeriode[0]);
        t.reset();
        t.start();
        pulscounter=0;
    }
}

void Tarco::TarcoTimeout() {
//Timeout på tarco puls, så vi får resat tarcoen, når den staopper
    
}    
void Tarco::RunMeanMeasure()
{
    static unsigned int TarcoHead;
//Måler tarco ved at lave en runing mean på periodetiderne, hvis der en variation
//på over 20% bliver den pågældende periode skippet
//Hvilket btyder at man skipper den lange Syncpuls, og kun tællere på de korte

    static bool MistedPeriod; //dette var en lang periode
    int thisperiode;
    float periodechange=0;
    t.stop();
    if (TarcoHead>=TarcoRunMean) TarcoHead=0;
    thisperiode=t.read_us();
    if (lastperiode!=0)
        periodechange=(float) thisperiode/lastperiode;
    if((periodechange<1.2) || (lastperiode==0) || MistedPeriod) {
        AdvPeriode[TarcoHead++]=thisperiode;
        MistedPeriod=false;
    } else
        MistedPeriod=true;
    t.reset();
    t.start();
}

float Tarco::Speed()
{
//returns puls/sek [hz]
    unsigned int periodetid;
    static int tarcotimeout;
    
    lastfrekvens=0;
    switch (tarcomode) {
        case RunMeanSwitchAuto: {
            periodetid=0;
            for (int i=0; i<TarcoRunMean; i++) periodetid+=AdvPeriode[i];
            lastperiode=periodetid/TarcoRunMean;
            lastfrekvens=(1e6/periodetid)*(TarcoRunMean/NPulsPrRotation);
        } break;
        case SwitchAuto: {
            if (AdvPeriode[0]) {
             lastfrekvens=(1e6/AdvPeriode[0]);
             tarcotimeout=0; AdvPeriode[0]=0;
            } 
            else {
              if (tarcotimeout>10) {
                  lastfrekvens=0; AdvPeriode[0];
              }              
              tarcotimeout++;                
            }  
        } break;
        case HirthMode: {
            lastfrekvens=(500e3/AdvPeriode[0]); //vi skal kun gannge med det halve da der er 2 pulser /omgang
        } break;

        default: break;
    }
    return (float) lastfrekvens*60;//Giver hastighed tilbage i RPM
}

float Tarco::RPM()
{
    float rpm=lastfrekvens*60;
    return (float) rpm;
}