This makes Amplitude Modulated Pulse Train, which can be regarded as the discretized wave of the signal. Pulse Train can be defined by frequency and duty cycle, which can be temporarily changed, referring to PWM.

Dependents:   Interference_Simple

Committer:
aktk
Date:
Mon Jan 13 19:04:11 2020 +0000
Branch:
35e9675a
Revision:
7:5eae3f90d161
Parent:
4:7d5afb2e3b79
PulseTrain: Modified the arg names of the constructor.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aktk 1:19c3a52c80c3 1 #include "PulseTrain.h"
aktk 1:19c3a52c80c3 2
aktk 1:19c3a52c80c3 3 PulseTrain::PulseTrain(
aktk 7:5eae3f90d161 4 uint32_t const arg_freq_init,
aktk 7:5eae3f90d161 5 float const arg_duty_init,
aktk 1:19c3a52c80c3 6 uint32_t const arg_freq_max
aktk 1:19c3a52c80c3 7 ):
aktk 1:19c3a52c80c3 8 FREQ_MAX(arg_freq_max),
aktk 7:5eae3f90d161 9 m_freq(velidateRange<uint32_t>(arg_freq_init, 1, FREQ_MAX)),
aktk 7:5eae3f90d161 10 m_duty(velidateRange<float>(arg_duty_init, 0.0, 1.0))
aktk 1:19c3a52c80c3 11 {
aktk 4:7d5afb2e3b79 12 m_period_us = 1000000 / m_freq + (1000000 % m_freq > m_freq / 2 ? 1 : 0);
aktk 1:19c3a52c80c3 13 init();
aktk 1:19c3a52c80c3 14 m_callback_asClock = doNothing;
aktk 1:19c3a52c80c3 15 m_callback_asPulseEdge = doNothing;
aktk 1:19c3a52c80c3 16
aktk 1:19c3a52c80c3 17 }
aktk 1:19c3a52c80c3 18
aktk 1:19c3a52c80c3 19 void PulseTrain::attachCallback_asClock(Callback<void(bool)> arg_callback)
aktk 1:19c3a52c80c3 20 {
aktk 1:19c3a52c80c3 21 m_callback_asClock = arg_callback;
aktk 1:19c3a52c80c3 22 }
aktk 1:19c3a52c80c3 23
aktk 1:19c3a52c80c3 24 void PulseTrain::attachCallback_asPulseEdge(Callback<void(bool)> arg_callback)
aktk 1:19c3a52c80c3 25 {
aktk 1:19c3a52c80c3 26 m_callback_asPulseEdge = arg_callback;
aktk 1:19c3a52c80c3 27 }
aktk 1:19c3a52c80c3 28
aktk 1:19c3a52c80c3 29 void PulseTrain::setFrequency(uint32_t const arg_freq)
aktk 1:19c3a52c80c3 30 {
aktk 1:19c3a52c80c3 31 m_freq = velidateRange<uint32_t>(arg_freq, 1, FREQ_MAX);
aktk 4:7d5afb2e3b79 32 m_period_us = 1000000 / m_freq + (1000000 % m_freq > m_freq / 2 ? 1 : 0);
aktk 1:19c3a52c80c3 33 init();
aktk 1:19c3a52c80c3 34 }
aktk 1:19c3a52c80c3 35
aktk 1:19c3a52c80c3 36 void PulseTrain::setDutycycle(float const arg_duty)
aktk 1:19c3a52c80c3 37 {
aktk 1:19c3a52c80c3 38 m_duty = velidateRange<float>(arg_duty, 0.0, 1.0);
aktk 1:19c3a52c80c3 39 init();
aktk 1:19c3a52c80c3 40 }
aktk 1:19c3a52c80c3 41
aktk 1:19c3a52c80c3 42 template <typename T>
aktk 1:19c3a52c80c3 43 T PulseTrain::velidateRange(T const arg_val, T const arg_min, T const arg_max)
aktk 1:19c3a52c80c3 44 {
aktk 1:19c3a52c80c3 45 if(arg_val < arg_min) return arg_min;
aktk 1:19c3a52c80c3 46 else if (arg_val <= arg_max) return arg_val;
aktk 1:19c3a52c80c3 47 else return arg_max;
aktk 1:19c3a52c80c3 48 }
aktk 1:19c3a52c80c3 49
aktk 1:19c3a52c80c3 50 void PulseTrain::init()
aktk 1:19c3a52c80c3 51 {
aktk 1:19c3a52c80c3 52 int a, b, r;
aktk 1:19c3a52c80c3 53 a = m_period_us;
aktk 1:19c3a52c80c3 54 b = a * m_duty;
aktk 1:19c3a52c80c3 55 r = a % b;
aktk 1:19c3a52c80c3 56 while ( r != 0 ) {
aktk 1:19c3a52c80c3 57 a = b;
aktk 1:19c3a52c80c3 58 b = r;
aktk 1:19c3a52c80c3 59 r = a % b;
aktk 1:19c3a52c80c3 60 }
aktk 1:19c3a52c80c3 61 m_clock_period_us = b;
aktk 1:19c3a52c80c3 62
aktk 1:19c3a52c80c3 63 m_period_pcp = m_period_us / m_clock_period_us;
aktk 1:19c3a52c80c3 64 m_falling = m_period_pcp * m_duty;
aktk 1:19c3a52c80c3 65 }
aktk 1:19c3a52c80c3 66
aktk 1:19c3a52c80c3 67 void PulseTrain::incrementClock()
aktk 1:19c3a52c80c3 68 {
aktk 1:19c3a52c80c3 69 static unsigned int l_itr = 0;
aktk 1:19c3a52c80c3 70
aktk 1:19c3a52c80c3 71 if (l_itr == m_raising) {
aktk 1:19c3a52c80c3 72 m_pulsestate = true;
aktk 1:19c3a52c80c3 73 m_callback_asPulseEdge(m_pulsestate);
aktk 1:19c3a52c80c3 74 } else if (l_itr == m_falling) {
aktk 1:19c3a52c80c3 75 m_pulsestate = false;
aktk 1:19c3a52c80c3 76 m_callback_asPulseEdge(m_pulsestate);
aktk 1:19c3a52c80c3 77 }
aktk 1:19c3a52c80c3 78
aktk 1:19c3a52c80c3 79 l_itr = (l_itr + 1) % m_period_pcp;
aktk 1:19c3a52c80c3 80
aktk 1:19c3a52c80c3 81 m_callback_asClock(m_pulsestate);
aktk 1:19c3a52c80c3 82 }
aktk 1:19c3a52c80c3 83
aktk 1:19c3a52c80c3 84
aktk 1:19c3a52c80c3 85 bool PulseTrain::getState()
aktk 1:19c3a52c80c3 86 {
aktk 1:19c3a52c80c3 87 return m_pulsestate;
aktk 1:19c3a52c80c3 88 }
aktk 1:19c3a52c80c3 89
aktk 1:19c3a52c80c3 90 uint32_t PulseTrain::getFrequency()
aktk 1:19c3a52c80c3 91 {
aktk 1:19c3a52c80c3 92 return m_freq;
aktk 1:19c3a52c80c3 93 }
aktk 1:19c3a52c80c3 94
aktk 1:19c3a52c80c3 95 float PulseTrain::getDutycycle()
aktk 1:19c3a52c80c3 96 {
aktk 1:19c3a52c80c3 97 return m_duty;
aktk 1:19c3a52c80c3 98 }
aktk 1:19c3a52c80c3 99
aktk 4:7d5afb2e3b79 100 uint32_t PulseTrain::getPeriod_us()
aktk 1:19c3a52c80c3 101 {
aktk 1:19c3a52c80c3 102 return m_period_us;
aktk 1:19c3a52c80c3 103 }
aktk 1:19c3a52c80c3 104
aktk 1:19c3a52c80c3 105 uint32_t PulseTrain::getClockperiod_us()
aktk 1:19c3a52c80c3 106 {
aktk 1:19c3a52c80c3 107 return m_clock_period_us;
aktk 1:19c3a52c80c3 108 }