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; }