Reciprocal Frequency counter only for STM32F401、F411 and F466. Reciprocal mode(pulse width measurement)

Dependencies:   fc_recipro_STM32F4xx

main.cpp

Committer:
kenjiArai
Date:
2020-01-19
Revision:
1:46cbfefcaa48
Parent:
0:da29cdc50643

File content as of revision 1:46cbfefcaa48:

/*
 * mbed Library / Frequency Counter / Reciprocal type only
 *      Frequency Counter program
 *      Only for Nucleo-F401RE,-F411RE,-F446RE
 *
 * Copyright (c) 2014,'15,'16,'20 Kenji Arai / JH1PJL
 *      http://www7b.biglobe.ne.jp/~kenjia/
 *      https://os.mbed.com/users/kenjiArai/
 *      Started:    October   18th, 2014
 *      Revised:    January   19th, 2020
 *
 */

//  Include --------------------------------------------------------------------
#include    "mbed.h"
#include    "fc_recipro.h"

//  Definition -----------------------------------------------------------------
#if (MBED_MAJOR_VERSION == 2)
#   define WAIT(x) wait_ms(x)
#elif (MBED_MAJOR_VERSION == 5)
#   define WAIT(x) ThisThread::sleep_for(x)
#endif

#define EXAMPLE_NUMBER      1   // select 0 to 2

#if EXAMPLE_NUMBER   == 0
#   define EXAMPLE0
#elif EXAMPLE_NUMBER == 1
#   define EXAMPLE1
#elif EXAMPLE_NUMBER == 2
#   define EXAMPLE2
#else
#   error " Please set 0 to 2 number for EXAMPLE_NUMBER!!"
#endif


using namespace Frequency_counter;

//  Object ---------------------------------------------------------------------
DigitalOut  led1(LED1);
Serial      pc(USBTX, USBRX);
Timer       t;
FRQ_CUNTR   fc;     //Frequency Counter

//  RAM ------------------------------------------------------------------------
Recipro_result_TypeDef freq;
Recipro_status_TypeDef status;
int64_t raw_buf[4];

//  ROM / Constant data --------------------------------------------------------

//  Function prototypes --------------------------------------------------------

//------------------------------------------------------------------------------
//  Control Program
//------------------------------------------------------------------------------
#ifdef EXAMPLE0
int main()
{
    //pc.printf("\r\nStart Frequency Counter\r\n");
    fc.recipro_start_measurement();
    while(true) {
        t.reset();
        t.start();
        if (fc.recipro_check_status(&status) == true) {
            fc.recipro_get_result(&freq);
            pc.printf("freq = %.3f [Hz], time(rise_fall) = %.6f [mS]\r\n",
                      freq.freq_rise2rise, freq.time_us_rise2fall);
        } else {
            pc.printf("------   data is NOT ready -------\r\n");
        }
        uint32_t pass = t.read_ms();
        if (pass < 990) {
            WAIT(1000 - pass);
        }
    }
}
#endif

#ifdef EXAMPLE1
int main()
{
    pc.printf("\r\nStart Frequency Counter\r\n");
    fc.recipro_start_measurement();
    while(true) {
        t.reset();
        t.start();
        if (fc.recipro_check_status(&status) == true) {
            fc.recipro_get_result(&freq);
            pc.printf("freq/rise_rise[Hz]= %f, ",
                      freq.freq_rise2rise);
            pc.printf("/fall_fall= %f, ",
                      freq.freq_fall2fall);
            pc.printf("time/rise_fall[mS]= %f, ",
                      freq.time_us_rise2fall);
            pc.printf("/fall_rise= %f, ",
                      freq.time_us_fall2rise);
        } else {
            pc.printf("------   data is NOT ready -------,,,,");
        }
        pc.printf("Rise= %d, Fall= %d, ",
                  status.rise_cnt, status.fall_cnt);
        pc.printf("Input= %d, Passed-time[sec]= %.0f\r\n",
                  status.input_level, status.passed_time);
        uint32_t pass = t.read_ms();
        if (pass < 990) {
            WAIT(1000 - pass);
        }
    }
}
#endif

#ifdef EXAMPLE2
int main()
{
    pc.printf("\r\nStart Frequency Counter\r\n");
    fc.recipro_start_measurement();
    while(true) {
        t.reset();
        t.start();
        if (fc.recipro_check_status(&status) == true) {
            fc.recipro_get_result(&freq);
            pc.printf("freq/rise_rise[Hz]= %f, ",
                      freq.freq_rise2rise);
            pc.printf("/fall_fall= %f, ",
                      freq.freq_fall2fall);
            pc.printf("time/rise_fall[mS]= %f, ",
                      freq.time_us_rise2fall);
            pc.printf("/fall_rise= %f, ",
                      freq.time_us_fall2rise);
        } else {
            pc.printf("------   data is NOT ready -------,,,,");
        }
        pc.printf("Rise= %d, Fall= %d, ",
                  status.rise_cnt, status.fall_cnt);
        pc.printf("Input= %d, Passed-time[sec]= %.0f\r\n",
                  status.input_level, status.passed_time);
        fc.recipro_get_raw_data(raw_buf);
        pc.printf("Rise raw data0= %.0f, Rise raw data1= %.0f, ",
                  (float)raw_buf[0], (float)raw_buf[1]);
        pc.printf("Fall raw data0= %.0f, Fall raw data1= %.0f\r\n",
                  (float)raw_buf[2], (float)raw_buf[3]);
        float base_clock = (float)(SystemCoreClock / 2);
        float resolution = 1.0f / (float)base_clock * 1.0e9; // nano seconds(nS)
        pc.printf("TIMER2 base clock = %.0f [Hz], resolution= %.3f [nS]\r\n",
                  base_clock, resolution);
        uint32_t pass = t.read_ms();
        if (pass < 990) {
            WAIT(1000 - pass);
        }
    }
}
#endif