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
PulseTrain.cpp
00001 #include "PulseTrain.h" 00002 00003 PulseTrain::PulseTrain( 00004 uint32_t const arg_freq_init, 00005 float const arg_duty_init, 00006 uint32_t const arg_freq_max 00007 ): 00008 FREQ_MAX(arg_freq_max), 00009 m_freq(velidateRange<uint32_t>(arg_freq_init, 1, FREQ_MAX)), 00010 m_duty(velidateRange<float>(arg_duty_init, 0.0, 1.0)) 00011 { 00012 m_period_us = 1000000 / m_freq + (1000000 % m_freq > m_freq / 2 ? 1 : 0); 00013 init(); 00014 m_callback_asClock = doNothing; 00015 m_callback_asPulseEdge = doNothing; 00016 00017 } 00018 00019 void PulseTrain::attachCallback_asClock(Callback<void(bool)> arg_callback) 00020 { 00021 m_callback_asClock = arg_callback; 00022 } 00023 00024 void PulseTrain::attachCallback_asPulseEdge (Callback<void(bool)> arg_callback) 00025 { 00026 m_callback_asPulseEdge = arg_callback; 00027 } 00028 00029 void PulseTrain::setFrequency(uint32_t const arg_freq) 00030 { 00031 m_freq = velidateRange<uint32_t>(arg_freq, 1, FREQ_MAX); 00032 m_period_us = 1000000 / m_freq + (1000000 % m_freq > m_freq / 2 ? 1 : 0); 00033 init(); 00034 } 00035 00036 void PulseTrain::setDutycycle(float const arg_duty) 00037 { 00038 m_duty = velidateRange<float>(arg_duty, 0.0, 1.0); 00039 init(); 00040 } 00041 00042 template <typename T> 00043 T PulseTrain::velidateRange(T const arg_val, T const arg_min, T const arg_max) 00044 { 00045 if(arg_val < arg_min) return arg_min; 00046 else if (arg_val <= arg_max) return arg_val; 00047 else return arg_max; 00048 } 00049 00050 void PulseTrain::init() 00051 { 00052 int a, b, r; 00053 a = m_period_us; 00054 b = a * m_duty; 00055 r = a % b; 00056 while ( r != 0 ) { 00057 a = b; 00058 b = r; 00059 r = a % b; 00060 } 00061 m_clock_period_us = b; 00062 00063 m_period_pcp = m_period_us / m_clock_period_us; 00064 m_falling = m_period_pcp * m_duty; 00065 } 00066 00067 void PulseTrain::incrementClock() 00068 { 00069 static unsigned int l_itr = 0; 00070 00071 if (l_itr == m_raising) { 00072 m_pulsestate = true; 00073 m_callback_asPulseEdge(m_pulsestate); 00074 } else if (l_itr == m_falling) { 00075 m_pulsestate = false; 00076 m_callback_asPulseEdge(m_pulsestate); 00077 } 00078 00079 l_itr = (l_itr + 1) % m_period_pcp; 00080 00081 m_callback_asClock(m_pulsestate); 00082 } 00083 00084 00085 bool PulseTrain::getState() 00086 { 00087 return m_pulsestate; 00088 } 00089 00090 uint32_t PulseTrain::getFrequency() 00091 { 00092 return m_freq; 00093 } 00094 00095 float PulseTrain::getDutycycle() 00096 { 00097 return m_duty; 00098 } 00099 00100 uint32_t PulseTrain::getPeriod_us() 00101 { 00102 return m_period_us; 00103 } 00104 00105 uint32_t PulseTrain::getClockperiod_us() 00106 { 00107 return m_clock_period_us; 00108 }
Generated on Tue Jul 12 2022 22:17:22 by 1.7.2