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

Tarco.cpp

Committer:
gert_lauritsen
Date:
2014-03-07
Revision:
7:752b8065ce2d
Parent:
6:2ad5029f7b1a
Child:
8:2e6b17f1da02

File content as of revision 7:752b8065ce2d:

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

DigitalOut debug(LED2);

Tarco::Tarco(PinName tarcosignal, char mode) :
    _tarcosensor(tarcosignal)
{
    tarcomode=mode;
//   AdvPeriode=0;
    if (mode==0)
        _tarcosensor.fall(this, &Tarco::RunMeanMeasure);
    if (mode==1)
        _tarcosensor.fall(this, &Tarco::Rotationtimer);
}

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) {
        t.stop();
        AdvPeriode[0]=t.read_us();
        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
    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 0: {
            periodetid=0;
            for (int i=0; i<TarcoRunMean; i++) periodetid+=AdvPeriode[i];
            lastperiode=periodetid/TarcoRunMean;
            lastfrekvens=(1e6/periodetid)*(TarcoRunMean/25);
        } break;
        case 1: {
            lastfrekvens=(1e6/AdvPeriode[0]);
        } break;
        default: break;
    }
    return (float) lastfrekvens;
}

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