www.gusucode.com > Arduino_Engineering_Kit_Hardware_Support_18b 工具箱matlab源码程序 > Arduino_Engineering_Kit_Hardware_Support_18b/simulink/src/MW_Tachometer.cpp

    #include <Arduino.h>
#include "MW_Tachometer.h"

volatile uint32_T counter;
unsigned long passedtime;
#define MW_ARDUINO_RPM_STEP_SIZE 60*1000


/* 
 * Interrupt Routine
 */
void countISR(void)

{
   //Update count
    counter++;
}


/*
 * Tachometer initialization
 */
extern "C" void MW_Tachometer_Init(uint8_T pin, uint8_T mode) 
{
    counter = 0;
    passedtime = 0; 
    
    //Set the pin to INPUT mode
    pinMode(pin, INPUT); 
 
    switch(mode){
        case 0:
            attachInterrupt(digitalPinToInterrupt(pin), countISR, RISING); 
            break;
        case 1:
            attachInterrupt(digitalPinToInterrupt(pin), countISR, FALLING); 
            break;
        case 2:
            attachInterrupt(digitalPinToInterrupt(pin), countISR, CHANGE); 
            break;
        case 3:
            attachInterrupt(digitalPinToInterrupt(pin), countISR, LOW); 
            break;
        case 4:
            attachInterrupt(digitalPinToInterrupt(pin), countISR, HIGH); 
            break;
        default:
            //Do Nothing
            break;
    }
    

}

/*
 * Calculate RPM
 */
extern "C" uint32_T MW_Tachometer_GetSpeed(void)
{
    uint32_T rpm;
    
    rpm = (counter * (1000/(millis() - passedtime)) * 60);
    passedtime = millis();
    
    counter = 0;
    return rpm;
}

// [EOF]