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
WaveGen.cpp
- Committer:
- fangoman91
- Date:
- 2016-05-06
- Revision:
- 1:cb84b066ab29
- Parent:
- 0:c1150498cbe9
File content as of revision 1:cb84b066ab29:
#include "mbed.h" #include "WaveGen.h" using namespace mbed; WaveGen::WaveGen(PinName WaveForm):_WaveForm(WaveForm) { _WaveForm.write(0); } int WaveGen::TCalc(int div,float Freq) { float temp = 0; if(div == 0) { temp = 1 / Freq; temp *= 1000000; } else { temp = 1 / Freq; temp *= 1000000; temp /= div; } return (int)temp; } float WaveGen::VCalc(float Volt) { float temp = Volt / 3.30; temp /= 2; return temp; } float WaveGen::RadCalc(float Ang) { float temp = 0; temp = Ang * 0.0174532925; return temp; } void WaveGen::SineWave(float Frequency,float Amplitude) { float temp = 0; int T1 = TCalc(6,Frequency);//porzione 30° int T2 = TCalc(12,Frequency);//porzione 120° float V = VCalc(Amplitude) * 2; 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) { temp = 0.5 + V * sin(RadCalc((float)c)); _WaveForm = temp; wait_us(T1); } for(int d = 210; d <= 330; d += 10) { 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); } } 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(50,Frequency); float V = VCalc(Amplitude); 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) { 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); } } void WaveGen::SawToothWave(float Frequency,float Amplitude) { float temp = 0; int T = TCalc(50,Frequency); float V = VCalc(Amplitude); 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) { temp = (float)a; temp /= 100; _WaveForm = temp; wait_us(T); } }