Generates a pulses train on the order of micro-seconds.

Committer:
aktk
Date:
Thu Nov 08 21:58:49 2018 +0000
Revision:
0:986e03d93263
Child:
1:1b5cd3c20187
first version 1.0.2018.nov

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aktk 0:986e03d93263 1 /** Pulse Fenerator cpp file
aktk 0:986e03d93263 2 *
aktk 0:986e03d93263 3 * \file PulseFenerator.cpp
aktk 0:986e03d93263 4 * \author Akifumi Takahashi
aktk 0:986e03d93263 5 * \date 2018.nov.08-
aktk 0:986e03d93263 6 * \version 1.0.2018.nov
aktk 0:986e03d93263 7 */
aktk 0:986e03d93263 8 #include "PulseGenerator.h"
aktk 0:986e03d93263 9 PulseGenerator::PulseGenerator():
aktk 0:986e03d93263 10 m_width(200),
aktk 0:986e03d93263 11 m_period(5000)
aktk 0:986e03d93263 12 {
aktk 0:986e03d93263 13 m_clockperiod = GCD(m_width, m_period);
aktk 0:986e03d93263 14 m_rt = (m_period - m_width) / m_clockperiod;
aktk 0:986e03d93263 15 m_ft = m_width / m_clockperiod;
aktk 0:986e03d93263 16 }
aktk 0:986e03d93263 17
aktk 0:986e03d93263 18 int8_t PulseGenerator::setWaveform(
aktk 0:986e03d93263 19 const uint16_t arg_pulsewidth,///< required in [us]
aktk 0:986e03d93263 20 const uint16_t arg_pulsefreq ///< required in [Hz] > 15 [Hz]
aktk 0:986e03d93263 21 )
aktk 0:986e03d93263 22 {
aktk 0:986e03d93263 23 uint16_t tmp_width = m_width;
aktk 0:986e03d93263 24 uint16_t tmp_period = m_period;
aktk 0:986e03d93263 25
aktk 0:986e03d93263 26 m_width = arg_pulsewidth;
aktk 0:986e03d93263 27 // freq is required over 15 due to the range of the type of the period
aktk 0:986e03d93263 28 m_period= Period_us(arg_pulsefreq > 15 ? arg_pulsefreq : 16);
aktk 0:986e03d93263 29
aktk 0:986e03d93263 30 if(m_width > m_period) {
aktk 0:986e03d93263 31 m_width = tmp_width;
aktk 0:986e03d93263 32 m_period = tmp_period;
aktk 0:986e03d93263 33 return -1;
aktk 0:986e03d93263 34 }
aktk 0:986e03d93263 35 return 0;
aktk 0:986e03d93263 36 }
aktk 0:986e03d93263 37
aktk 0:986e03d93263 38
aktk 0:986e03d93263 39 void PulseGenerator::generatePulseWave()
aktk 0:986e03d93263 40 {
aktk 0:986e03d93263 41 static uint16_t l_counter = 0;
aktk 0:986e03d93263 42
aktk 0:986e03d93263 43 l_counter++;
aktk 0:986e03d93263 44 if(l_counter == m_rt ) {
aktk 0:986e03d93263 45 m_wavestatus = true;
aktk 0:986e03d93263 46 } else if (l_counter >= m_ft) {
aktk 0:986e03d93263 47 m_wavestatus = false;
aktk 0:986e03d93263 48 l_counter = 0;
aktk 0:986e03d93263 49 }
aktk 0:986e03d93263 50 }
aktk 0:986e03d93263 51
aktk 0:986e03d93263 52 void PulseGenerator::startPulseWave()
aktk 0:986e03d93263 53 {
aktk 0:986e03d93263 54 m_clockperiod = GCD(m_width, m_period);
aktk 0:986e03d93263 55 m_rt = (m_period - m_width) / m_clockperiod;
aktk 0:986e03d93263 56 m_ft = m_width / m_clockperiod;
aktk 0:986e03d93263 57
aktk 0:986e03d93263 58 //m_ticker.attach_us(this, &PulseGenerator::generatePulseWave, m_clockperiod);
aktk 0:986e03d93263 59 m_ticker.attach_us(callback(this, &PulseGenerator::generatePulseWave), m_clockperiod);
aktk 0:986e03d93263 60 }
aktk 0:986e03d93263 61
aktk 0:986e03d93263 62 void PulseGenerator::stopPulseWave()
aktk 0:986e03d93263 63 {
aktk 0:986e03d93263 64 m_ticker.detach();
aktk 0:986e03d93263 65 }
aktk 0:986e03d93263 66
aktk 0:986e03d93263 67 uint16_t Period_us(const uint16_t arg_freq)
aktk 0:986e03d93263 68 {
aktk 0:986e03d93263 69 uint16_t l_period, l_carried;
aktk 0:986e03d93263 70
aktk 0:986e03d93263 71 // culc integer part of 1/freq * 10^6
aktk 0:986e03d93263 72 l_period = (uint16_t)(1000000 / arg_freq);
aktk 0:986e03d93263 73
aktk 0:986e03d93263 74 // round factorial part of 1/freq * 10^6
aktk 0:986e03d93263 75 l_carried = (uint16_t)((1000000 % arg_freq > arg_freq / 2) ? 1 : 0);
aktk 0:986e03d93263 76
aktk 0:986e03d93263 77 return l_period + l_carried;
aktk 0:986e03d93263 78 }
aktk 0:986e03d93263 79
aktk 0:986e03d93263 80 uint16_t GCD(uint16_t arg1, uint16_t arg2)
aktk 0:986e03d93263 81 {
aktk 0:986e03d93263 82 uint16_t a,b,r;
aktk 0:986e03d93263 83
aktk 0:986e03d93263 84 if (arg1 == 0 || arg2 == 0) return 0;
aktk 0:986e03d93263 85 if(arg1 > arg2) {
aktk 0:986e03d93263 86 a = arg1;
aktk 0:986e03d93263 87 b = arg2;
aktk 0:986e03d93263 88 } else {
aktk 0:986e03d93263 89 a = arg2;
aktk 0:986e03d93263 90 b = arg1;
aktk 0:986e03d93263 91 }
aktk 0:986e03d93263 92
aktk 0:986e03d93263 93 //Eukleides Algorithm
aktk 0:986e03d93263 94 r = a % b;
aktk 0:986e03d93263 95 while(r != 0) {
aktk 0:986e03d93263 96 a = b;
aktk 0:986e03d93263 97 b = r;
aktk 0:986e03d93263 98 r = a % b;
aktk 0:986e03d93263 99 }
aktk 0:986e03d93263 100
aktk 0:986e03d93263 101 return b;
aktk 0:986e03d93263 102 }