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

Tarco.cpp

Committer:
gert_lauritsen
Date:
2014-09-11
Revision:
8:2e6b17f1da02
Parent:
7:752b8065ce2d
Child:
9:6b8619ccb136

File content as of revision 8:2e6b17f1da02:

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

DigitalOut debug(LED2);

Tarco::Tarco(PinName tarcosignal, char mode,callback_type _callback) :
    _tarcosensor(tarcosignal)
{
    tarcomode=mode;
//   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);
    callback = _callback;    
}

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::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;
    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/25);
        } break;
        case SwitchAuto: {
            lastfrekvens=(1e6/AdvPeriode[0]);
        } 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;
}

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