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
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 }
Generated on Mon Jul 18 2022 18:31:26 by
1.7.2