This library generate four classic waves, have an escape button to stop to generate wave. And is possible to use function for calculate period,... separately
Revision 1:cb84b066ab29, committed 2016-05-06
- Comitter:
- fangoman91
- Date:
- Fri May 06 06:40:10 2016 +0000
- Parent:
- 0:c1150498cbe9
- Commit message:
- there isn't documentation or istructions
Changed in this revision
WaveGen.cpp | Show annotated file Show diff for this revision Revisions of this file |
WaveGen.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r c1150498cbe9 -r cb84b066ab29 WaveGen.cpp --- a/WaveGen.cpp Fri Jul 24 13:38:10 2015 +0000 +++ b/WaveGen.cpp Fri May 06 06:40:10 2016 +0000 @@ -3,9 +3,8 @@ using namespace mbed; -WaveGen::WaveGen(PinName ext,PinName WaveForm):_ext(ext),_WaveForm(WaveForm) +WaveGen::WaveGen(PinName WaveForm):_WaveForm(WaveForm) { - _ext.mode(PullUp); _WaveForm.write(0); } @@ -40,107 +39,110 @@ return temp; } -bool WaveGen::SineWave(float Frequency,float Amplitude) +void WaveGen::SineWave(float Frequency,float Amplitude) { float temp = 0; - int T = TCalc(20,Frequency); + int T1 = TCalc(6,Frequency);//porzione 30° + int T2 = TCalc(12,Frequency);//porzione 120° float V = VCalc(Amplitude) * 2; - while(1) + for(int a = 0; a <= 30; a += 5) + { + temp = 0.5 + V * sin(RadCalc((float)a)); + _WaveForm = temp; + wait_us(T1); + } + for(int b = 30; b <= 150; b += 10) + { + temp = 0.5 + V * sin(RadCalc((float)b)); + _WaveForm = temp; + wait_us(T2); + } + for(int c = 150; c <= 210; c += 5) { - for(int i = 0; i < 360; i += 18) - { - temp = 0.5 + V * sin(RadCalc((float)i)); - _WaveForm = temp; - wait_us(T); - if(!_ext.read()) - return true; - else - return false; - } - } -} - -bool WaveGen::SquareWave(float Frequency,float Amplitude,float DutyCycle) -{ - int Ton = TCalc(0,Frequency); - Ton *= DutyCycle; - int Toff = Ton - TCalc(0,Frequency); - float V = VCalc(Amplitude); - while(1) + temp = 0.5 + V * sin(RadCalc((float)c)); + _WaveForm = temp; + wait_us(T1); + } + for(int d = 210; d <= 330; d += 10) { - _WaveForm = V; - wait_us(Ton); - _WaveForm = 0; - wait_us(Toff); - if(!_ext.read()) - return true; - } + temp = 0.5 + V * sin(RadCalc((float)d)); + _WaveForm = temp; + wait_us(T2); + } + for(int e = 330; e <= 360; e += 5) + { + temp = 0.5 + V * sin(RadCalc((float)e)); + _WaveForm = temp; + wait_us(T1); + } } -bool WaveGen::TriangularWave(float Frequency,float Amplitude) +void WaveGen::SquareWave(float Frequency,float Amplitude,float DutyCycle) +{ + float V = VCalc(Amplitude); + float temp = 0; + int Ton,Toff = 0; + int Temp = TCalc(0,Frequency); + if(DutyCycle != 50) + { + temp = DutyCycle / 100; + temp *= (float)Temp; + Ton = (int)temp; + Toff = Temp - Ton; + } + else + { + Ton = TCalc(0,Frequency); + Toff = Ton; + } + _WaveForm = V; + wait_us(Ton); + _WaveForm = 0; + wait_us(Toff); +} + +void WaveGen::TriangularWave(float Frequency,float Amplitude) { float temp = 0; - int T = TCalc(80,Frequency); + int T = TCalc(50,Frequency); float V = VCalc(Amplitude); - while(1) + int min,max,pass; + //Calcola gli intervalli di tensione + temp = V * 1000; + min = 500 - (int)temp; + max = 500 + (int)temp; + pass = (max - min) / 50; + for(int a = min; a <= max; a += pass) { - for(int a = 50; a < V; a += 5) - { - temp = (float)a / 100; - _WaveForm = temp; - wait_us(T); - if(!_ext.read()) - return true; - } - for(int b = V; b > 50; b -= 5) - { - temp = (float)b / 100; - _WaveForm = temp; - wait_us(T); - if(!_ext.read()) - return true; - } - for(int c = 50; c < V - 50; c -= 5) - { - temp = (float)c / 100; - _WaveForm = temp; - wait_us(T); - if(!_ext.read()) - return true; - } - for(int d = V - 50; d < 50; d += 5) - { - temp = (float)d / 100; - _WaveForm = temp; - wait_us(T); - if(!_ext.read()) - return true; - } + temp = (float)a; + temp /= 1000; + _WaveForm = temp; + wait_us(T); + } + for(int b = max; b >= min; b -= pass) + { + temp = (float)b; + temp /= 1000; + _WaveForm = temp; + wait_us(T); } } -bool WaveGen::SawToothWave(float Frequency,float Amplitude) +void WaveGen::SawToothWave(float Frequency,float Amplitude) { float temp = 0; - int T = TCalc(40,Frequency); + int T = TCalc(50,Frequency); float V = VCalc(Amplitude); - while(1) + int min,max,pass; + temp = V * 100; + min = 50 - (int)temp; + max = 50 + (int)temp; + pass = (max - min) / 50; + for(int a = min; a <= max; a += pass) { - for(int a = 50; a < V; a += 5) - { - temp = (float)a / 100; - _WaveForm = temp; - wait_us(T); - if(!_ext.read()) - return true; - } - for(int b = 50; b > V - 50; b -= 5) - { - temp = (float)b / 100; - _WaveForm = temp; - wait_us(T); - if(!_ext.read()) - return true; - } - } + temp = (float)a; + temp /= 100; + _WaveForm = temp; + wait_us(T); + } }
diff -r c1150498cbe9 -r cb84b066ab29 WaveGen.h --- a/WaveGen.h Fri Jul 24 13:38:10 2015 +0000 +++ b/WaveGen.h Fri May 06 06:40:10 2016 +0000 @@ -8,16 +8,61 @@ class WaveGen { public: - WaveGen(PinName ext, PinName WaveForm); - bool SineWave(float Frequency, float Amplitude); - bool SquareWave(float Frequency, float Amplitude, float DutyCycle); - bool TriangularWave(float Frequency, float Amplitude); - bool SawToothWave(float Frequency, float Amplitude); + WaveGen(PinName WaveForm); + + /********************************************************************* + + Questa funzione gestisce la generazione della forma d'onda sinusoidale + + *********************************************************************/ + void SineWave(float Frequency, float Amplitude); + + /********************************************************************* + + Questa funzione gestisce la generazione della forma d'onda quadra + + *********************************************************************/ + void SquareWave(float Frequency, float Amplitude, float DutyCycle); + + /********************************************************************* + + Questa funzione gestisce la generazione della forma d'onda triangolare + + *********************************************************************/ + void TriangularWave(float Frequency, float Amplitude); + + /********************************************************************* + + Questa funzione gestisce la generazione della forma d'onda a dente di + sega + + *********************************************************************/ + void SawToothWave(float Frequency, float Amplitude); + + /********************************************************************* + + Questa funzione gestisce il calcolo del periodo e la divisione di + questo in intervalli di tempo durante il quale tenere stabile + un valore di tensione + + *********************************************************************/ int TCalc(int div, float Freq); + + /********************************************************************* + + Questa funzione adatta il valore di tensione fornito alle specifiche + della funzione che gestisce il DAC + + *********************************************************************/ float VCalc(float Volt); + + /********************************************************************* + + Questa funzione la conversione da gradi a radianti + + *********************************************************************/ float RadCalc(float Ang); protected: - DigitalIn _ext; AnalogOut _WaveForm; }; }