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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers WaveGen.cpp Source File

WaveGen.cpp

00001 #include "mbed.h"
00002 #include "WaveGen.h"
00003 
00004 using namespace mbed;
00005 
00006 WaveGen::WaveGen(PinName WaveForm):_WaveForm(WaveForm)
00007 {
00008     _WaveForm.write(0);   
00009 }
00010 
00011 int WaveGen::TCalc(int div,float Freq)
00012 {
00013     float temp = 0;
00014     if(div == 0)   
00015     {
00016         temp = 1 / Freq;
00017         temp *= 1000000;
00018     }
00019     else 
00020     {
00021         temp = 1 / Freq;
00022         temp *= 1000000;
00023         temp /= div;
00024     }
00025     return (int)temp;
00026 }
00027 
00028 float WaveGen::VCalc(float Volt)
00029 {
00030     float temp = Volt / 3.30;
00031     temp /= 2;
00032     return temp;
00033 }
00034 
00035 float WaveGen::RadCalc(float Ang)
00036 {
00037     float temp = 0;
00038     temp = Ang * 0.0174532925;
00039     return temp;   
00040 }
00041 
00042 void WaveGen::SineWave(float Frequency,float Amplitude)
00043 {
00044     float temp = 0;
00045     int T1 = TCalc(6,Frequency);//porzione 30°
00046     int T2 = TCalc(12,Frequency);//porzione 120°
00047     float V = VCalc(Amplitude) * 2;
00048     for(int a = 0; a <= 30; a += 5)
00049     {
00050         temp = 0.5 + V * sin(RadCalc((float)a));
00051         _WaveForm = temp;
00052         wait_us(T1);       
00053     }
00054     for(int b = 30; b <= 150; b += 10)
00055     {
00056         temp = 0.5 + V * sin(RadCalc((float)b));
00057         _WaveForm = temp;
00058         wait_us(T2);    
00059     } 
00060     for(int c = 150; c <= 210; c += 5)
00061     {
00062         temp = 0.5 + V * sin(RadCalc((float)c));
00063         _WaveForm = temp;
00064         wait_us(T1);    
00065     } 
00066     for(int d = 210; d <= 330; d += 10)
00067     {
00068         temp = 0.5 + V * sin(RadCalc((float)d));
00069         _WaveForm = temp;
00070         wait_us(T2);    
00071     } 
00072     for(int e = 330; e <= 360; e += 5)
00073     {
00074         temp = 0.5 + V * sin(RadCalc((float)e));
00075         _WaveForm = temp;
00076         wait_us(T1);    
00077     } 
00078 }
00079 
00080 void WaveGen::SquareWave(float Frequency,float Amplitude,float DutyCycle)
00081 {
00082     float V = VCalc(Amplitude);
00083     float temp = 0;
00084     int Ton,Toff = 0;
00085     int Temp = TCalc(0,Frequency);
00086     if(DutyCycle != 50)
00087     {
00088         temp = DutyCycle / 100;
00089         temp *= (float)Temp;
00090         Ton = (int)temp;
00091         Toff = Temp - Ton;
00092     }
00093     else 
00094     {
00095         Ton = TCalc(0,Frequency);
00096         Toff = Ton;    
00097     } 
00098     _WaveForm = V;
00099     wait_us(Ton);
00100     _WaveForm = 0;
00101     wait_us(Toff);
00102 }
00103 
00104 void WaveGen::TriangularWave(float Frequency,float Amplitude)
00105 {
00106     float temp = 0;
00107     int T = TCalc(50,Frequency);
00108     float V = VCalc(Amplitude);
00109     int min,max,pass;
00110     //Calcola gli intervalli di tensione
00111     temp = V * 1000;
00112     min = 500 - (int)temp;
00113     max = 500 + (int)temp;
00114     pass = (max - min) / 50;
00115     for(int a = min; a <= max; a += pass)
00116     {
00117         temp = (float)a;
00118         temp /= 1000;
00119         _WaveForm = temp;
00120         wait_us(T);   
00121     }
00122     for(int b = max; b >= min; b -= pass)
00123     {
00124         temp = (float)b;
00125         temp /= 1000;
00126         _WaveForm = temp;
00127         wait_us(T);   
00128     }
00129 }
00130 
00131 void WaveGen::SawToothWave(float Frequency,float Amplitude)
00132 {
00133     float temp = 0;
00134     int T = TCalc(50,Frequency);
00135     float V = VCalc(Amplitude);
00136     int min,max,pass;
00137     temp = V * 100;
00138     min = 50 - (int)temp;
00139     max = 50 + (int)temp;
00140     pass = (max - min) / 50;
00141     for(int a = min; a <= max; a += pass)
00142     {
00143         temp = (float)a;
00144         temp /= 100;
00145         _WaveForm = temp;
00146         wait_us(T);
00147     }  
00148 }