genera sinusoide

Dependencies:   mbed

Committer:
pinofal
Date:
Wed Aug 31 14:01:23 2022 +0000
Revision:
3:7df960e4e4d5
genera sinusoide

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pinofal 3:7df960e4e4d5 1 // Tested : NUCLEO F207ZG
pinofal 3:7df960e4e4d5 2 // Tested : NUCLEO L476RG
pinofal 3:7df960e4e4d5 3 #include "mbed.h"
pinofal 3:7df960e4e4d5 4
pinofal 3:7df960e4e4d5 5 // Definizione periferiche
pinofal 3:7df960e4e4d5 6 Serial pc(USBTX, USBRX);
pinofal 3:7df960e4e4d5 7 //AnalogOut OutWave(PA_5); //F207ZG
pinofal 3:7df960e4e4d5 8 AnalogOut OutWave(PA_4); //L476RG
pinofal 3:7df960e4e4d5 9 DigitalOut DigitalWave(PA_1);
pinofal 3:7df960e4e4d5 10 DigitalOut led1(LED1);
pinofal 3:7df960e4e4d5 11 DigitalOut led2(LED2);
pinofal 3:7df960e4e4d5 12 DigitalOut led3(LED3);
pinofal 3:7df960e4e4d5 13
pinofal 3:7df960e4e4d5 14 // definizione della frequenza delle note ottava centrale del pianoforte
pinofal 3:7df960e4e4d5 15 #define Z 100.00 // diagnostica
pinofal 3:7df960e4e4d5 16 #define C 261.63
pinofal 3:7df960e4e4d5 17 #define Cd 277.18
pinofal 3:7df960e4e4d5 18 #define Db 277.18
pinofal 3:7df960e4e4d5 19 #define D 293.66
pinofal 3:7df960e4e4d5 20 #define Dd 311.13
pinofal 3:7df960e4e4d5 21 #define Eb 311.13
pinofal 3:7df960e4e4d5 22 #define E 329.63
pinofal 3:7df960e4e4d5 23 #define F 349.23
pinofal 3:7df960e4e4d5 24 #define Fd 369.99
pinofal 3:7df960e4e4d5 25 #define Gb 369.99
pinofal 3:7df960e4e4d5 26 #define G 392.9
pinofal 3:7df960e4e4d5 27 #define Gd 415.3
pinofal 3:7df960e4e4d5 28 #define Ab 415.3
pinofal 3:7df960e4e4d5 29 #define A 440.0
pinofal 3:7df960e4e4d5 30 #define Ad 466.16
pinofal 3:7df960e4e4d5 31 #define Bb 466.16
pinofal 3:7df960e4e4d5 32 #define B 493.18
pinofal 3:7df960e4e4d5 33
pinofal 3:7df960e4e4d5 34
pinofal 3:7df960e4e4d5 35
pinofal 3:7df960e4e4d5 36
pinofal 3:7df960e4e4d5 37
pinofal 3:7df960e4e4d5 38
pinofal 3:7df960e4e4d5 39 // numero di campioni che compongono un periodo della sinusoide in Output sull'ADC
pinofal 3:7df960e4e4d5 40 #define SAMPLESINENUM 45// consigliabile avere multipli di 45
pinofal 3:7df960e4e4d5 41
pinofal 3:7df960e4e4d5 42 // parametri dell'onda coseno da generare
pinofal 3:7df960e4e4d5 43 #define PI (3.141592653589793238462)
pinofal 3:7df960e4e4d5 44 #define AMPLITUDE 32767 //(1.0) // x * 3.3V
pinofal 3:7df960e4e4d5 45 #define PHASE (PI/2) // 2*pi è un periodo
pinofal 3:7df960e4e4d5 46 #define OFFSET 32767 //(0x7FFF)
pinofal 3:7df960e4e4d5 47
pinofal 3:7df960e4e4d5 48 // numero di note componenti la scala diatonica
pinofal 3:7df960e4e4d5 49 #define NUMTONE 120
pinofal 3:7df960e4e4d5 50
pinofal 3:7df960e4e4d5 51 // Output LED di diagnostica
pinofal 3:7df960e4e4d5 52 DigitalOut led(LED1);
pinofal 3:7df960e4e4d5 53
pinofal 3:7df960e4e4d5 54 // ticker per la generazione dell'onda con DAC
pinofal 3:7df960e4e4d5 55 Ticker SampleOutTicker;
pinofal 3:7df960e4e4d5 56
pinofal 3:7df960e4e4d5 57 // Buffer contenente la sinusoide da porre in output.
pinofal 3:7df960e4e4d5 58 unsigned short usaSine[SAMPLESINENUM];
pinofal 3:7df960e4e4d5 59
pinofal 3:7df960e4e4d5 60 // prototipo di funzione che genera i campioni della sinusoide da utilizzare per la generazione tramite DAC
pinofal 3:7df960e4e4d5 61 void CalculateSinewave(void);
pinofal 3:7df960e4e4d5 62
pinofal 3:7df960e4e4d5 63 // carattere in arrivo dal PC
pinofal 3:7df960e4e4d5 64 volatile char cReadChar=0;
pinofal 3:7df960e4e4d5 65 volatile char cOldReadChar=0;
pinofal 3:7df960e4e4d5 66
pinofal 3:7df960e4e4d5 67 // indice, nell'array, del campione da porre in output
pinofal 3:7df960e4e4d5 68 volatile int nSampleOutIndex;
pinofal 3:7df960e4e4d5 69 // contatore dei campioni in output sul DAC
pinofal 3:7df960e4e4d5 70 volatile int nSampleOutCount;
pinofal 3:7df960e4e4d5 71 // Periodo di generazione campioni in output DeltaT = T/NumSample
pinofal 3:7df960e4e4d5 72 double fDeltaT;
pinofal 3:7df960e4e4d5 73 // amplificazione per il dato da spedire sull'ADC
pinofal 3:7df960e4e4d5 74 volatile double fAmp;
pinofal 3:7df960e4e4d5 75 //volatile double fAmpNew;
pinofal 3:7df960e4e4d5 76 // flag per bloccare la generazione del segnale
pinofal 3:7df960e4e4d5 77 volatile bool bStop;
pinofal 3:7df960e4e4d5 78 // frequenza segnale da generare
pinofal 3:7df960e4e4d5 79 volatile double fFreq;
pinofal 3:7df960e4e4d5 80 // periodo della sinusoide da generare
pinofal 3:7df960e4e4d5 81 double fPeriod;
pinofal 3:7df960e4e4d5 82 double dDiatonic[NUMTONE];
pinofal 3:7df960e4e4d5 83
pinofal 3:7df960e4e4d5 84 //****************************
pinofal 3:7df960e4e4d5 85 // Create the sinewave buffer
pinofal 3:7df960e4e4d5 86 //****************************
pinofal 3:7df960e4e4d5 87 void CalculateSinewave(int nOffset, int nAmplitude, double fPhase)
pinofal 3:7df960e4e4d5 88 {
pinofal 3:7df960e4e4d5 89 // variabile contenente l'angolo in radianti
pinofal 3:7df960e4e4d5 90 double fRads;
pinofal 3:7df960e4e4d5 91 // indici per i cicli
pinofal 3:7df960e4e4d5 92 int nIndex;
pinofal 3:7df960e4e4d5 93 // passo in frequenza fissato dal numero di campioni in cui voglio dividere un periodo di sinusoide: DeltaF = 360°/NUMSAMPLE
pinofal 3:7df960e4e4d5 94 double fDeltaF;
pinofal 3:7df960e4e4d5 95 // angolo per il quale bisogna calcolare il valore di sinusoide: fAngle = nIndex*DeltaF
pinofal 3:7df960e4e4d5 96 double fAngle;
pinofal 3:7df960e4e4d5 97
pinofal 3:7df960e4e4d5 98 fDeltaF = 360.0/SAMPLESINENUM;
pinofal 3:7df960e4e4d5 99 for (nIndex = 0; nIndex < SAMPLESINENUM; nIndex++)
pinofal 3:7df960e4e4d5 100 {
pinofal 3:7df960e4e4d5 101 fAngle = nIndex*fDeltaF; // angolo per il quale bisogna calcolare il campione di sinusoide
pinofal 3:7df960e4e4d5 102 fRads = (PI * fAngle)/180.0; // Convert degree in radian
pinofal 3:7df960e4e4d5 103 //usaSine[nIndex] = AMPLITUDE * cos(fRads + PHASE) + OFFSET;
pinofal 3:7df960e4e4d5 104 usaSine[nIndex] = nAmplitude * cos(fRads + fPhase) + nOffset;
pinofal 3:7df960e4e4d5 105 }
pinofal 3:7df960e4e4d5 106 }
pinofal 3:7df960e4e4d5 107
pinofal 3:7df960e4e4d5 108
pinofal 3:7df960e4e4d5 109 //**********************************************
pinofal 3:7df960e4e4d5 110 // Crea le frequenze delle note del pianoforte
pinofal 3:7df960e4e4d5 111 //**********************************************
pinofal 3:7df960e4e4d5 112 void CreateDiatonic()
pinofal 3:7df960e4e4d5 113 {
pinofal 3:7df960e4e4d5 114 int nTono;
pinofal 3:7df960e4e4d5 115 int nOttava;
pinofal 3:7df960e4e4d5 116
pinofal 3:7df960e4e4d5 117 // ottava centrale = ottava 4
pinofal 3:7df960e4e4d5 118 dDiatonic[4*12+0]=261.63; // C
pinofal 3:7df960e4e4d5 119 dDiatonic[4*12+1]=277.18; // C#/Db
pinofal 3:7df960e4e4d5 120 dDiatonic[4*12+2]=293.66; // D
pinofal 3:7df960e4e4d5 121 dDiatonic[4*12+3]=311.13; // D#/Eb
pinofal 3:7df960e4e4d5 122 dDiatonic[4*12+4]=329.63; // E
pinofal 3:7df960e4e4d5 123 dDiatonic[4*12+5]=349.23; // F
pinofal 3:7df960e4e4d5 124 dDiatonic[4*12+6]=369.99; // F#/Gb
pinofal 3:7df960e4e4d5 125 dDiatonic[4*12+7]=392.00; // G
pinofal 3:7df960e4e4d5 126 dDiatonic[4*12+8]=415.30; // G#/Ab
pinofal 3:7df960e4e4d5 127 dDiatonic[4*12+9]=440.00; // A
pinofal 3:7df960e4e4d5 128 dDiatonic[4*12+10]=466.16; // A#/Bb
pinofal 3:7df960e4e4d5 129 dDiatonic[4*12+11]=493.88; // B
pinofal 3:7df960e4e4d5 130
pinofal 3:7df960e4e4d5 131 // dalla ottava 5 alla 9
pinofal 3:7df960e4e4d5 132 for(nOttava=5; nOttava<9; nOttava++)
pinofal 3:7df960e4e4d5 133 {
pinofal 3:7df960e4e4d5 134 for(nTono=0; nTono<12; nTono++)
pinofal 3:7df960e4e4d5 135 {
pinofal 3:7df960e4e4d5 136 dDiatonic[(nOttava*12)+nTono]=dDiatonic[((nOttava-1)*12)+nTono]*2;
pinofal 3:7df960e4e4d5 137 }
pinofal 3:7df960e4e4d5 138 }
pinofal 3:7df960e4e4d5 139
pinofal 3:7df960e4e4d5 140 // dalla ottava 0 alla 3
pinofal 3:7df960e4e4d5 141 for(nOttava=3; nOttava>=0; nOttava--)
pinofal 3:7df960e4e4d5 142 {
pinofal 3:7df960e4e4d5 143 for(nTono=0; nTono<12; nTono++)
pinofal 3:7df960e4e4d5 144 {
pinofal 3:7df960e4e4d5 145 dDiatonic[(nOttava*12)+nTono]=dDiatonic[((nOttava+1)*12)+nTono]/2;
pinofal 3:7df960e4e4d5 146 }
pinofal 3:7df960e4e4d5 147 }
pinofal 3:7df960e4e4d5 148 }
pinofal 3:7df960e4e4d5 149
pinofal 3:7df960e4e4d5 150 //***************************
pinofal 3:7df960e4e4d5 151 // generazione sample da DAC
pinofal 3:7df960e4e4d5 152 //***************************
pinofal 3:7df960e4e4d5 153 void SampleOut()
pinofal 3:7df960e4e4d5 154 {
pinofal 3:7df960e4e4d5 155 // se è stato inviato il comando Stop, non fare niente fino a nuovo comando
pinofal 3:7df960e4e4d5 156 if(bStop)
pinofal 3:7df960e4e4d5 157 {
pinofal 3:7df960e4e4d5 158 }
pinofal 3:7df960e4e4d5 159 else // se non è stato inviato il comando di bStop continua
pinofal 3:7df960e4e4d5 160 {
pinofal 3:7df960e4e4d5 161 // output del campione della forma d'onda
pinofal 3:7df960e4e4d5 162 OutWave.write_u16(usaSine[nSampleOutIndex]);
pinofal 3:7df960e4e4d5 163
pinofal 3:7df960e4e4d5 164 // incrementa l'indice del campione in output, modulo NUMSAMPLE: se NUMSAMPLE è 360, nSampleOutIndex va da 0 a 359
pinofal 3:7df960e4e4d5 165 nSampleOutIndex++;
pinofal 3:7df960e4e4d5 166 if(nSampleOutIndex >= SAMPLESINENUM)
pinofal 3:7df960e4e4d5 167 {
pinofal 3:7df960e4e4d5 168 nSampleOutIndex=0;
pinofal 3:7df960e4e4d5 169 }
pinofal 3:7df960e4e4d5 170
pinofal 3:7df960e4e4d5 171 }
pinofal 3:7df960e4e4d5 172 }
pinofal 3:7df960e4e4d5 173
pinofal 3:7df960e4e4d5 174
pinofal 3:7df960e4e4d5 175
pinofal 3:7df960e4e4d5 176
pinofal 3:7df960e4e4d5 177 //*******************
pinofal 3:7df960e4e4d5 178 // Loop Principale
pinofal 3:7df960e4e4d5 179 //*******************
pinofal 3:7df960e4e4d5 180 int main()
pinofal 3:7df960e4e4d5 181 {
pinofal 3:7df960e4e4d5 182 // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto
pinofal 3:7df960e4e4d5 183 pc.baud(921600); //921600 bps
pinofal 3:7df960e4e4d5 184
pinofal 3:7df960e4e4d5 185
pinofal 3:7df960e4e4d5 186 // messaggio di benvenuto
pinofal 3:7df960e4e4d5 187 pc.printf("\r\nHallo \r\n");
pinofal 3:7df960e4e4d5 188 pc.printf("\r\n*** SineWave Generation ***\r\n");
pinofal 3:7df960e4e4d5 189
pinofal 3:7df960e4e4d5 190 //inizializza variabili
pinofal 3:7df960e4e4d5 191 cReadChar = 0;
pinofal 3:7df960e4e4d5 192 nSampleOutIndex=0;
pinofal 3:7df960e4e4d5 193 nSampleOutCount=0;
pinofal 3:7df960e4e4d5 194 bStop=true;
pinofal 3:7df960e4e4d5 195
pinofal 3:7df960e4e4d5 196 // test dei LED
pinofal 3:7df960e4e4d5 197 led1=1; //Verde
pinofal 3:7df960e4e4d5 198 wait_ms(1000);
pinofal 3:7df960e4e4d5 199 led1=0;
pinofal 3:7df960e4e4d5 200 led2=1; // Blu
pinofal 3:7df960e4e4d5 201 wait_ms(1000);
pinofal 3:7df960e4e4d5 202 led2=0;
pinofal 3:7df960e4e4d5 203 led3=1; //Rosso
pinofal 3:7df960e4e4d5 204 wait_ms(1000);
pinofal 3:7df960e4e4d5 205 led3=0;
pinofal 3:7df960e4e4d5 206 //+++++++++++++++++++++++++++++++++++ START Test ONDA DIGITALE ++++++++++++++++++++++++++++++++++++++
pinofal 3:7df960e4e4d5 207 /*
pinofal 3:7df960e4e4d5 208 led1=1;
pinofal 3:7df960e4e4d5 209 led2=1;
pinofal 3:7df960e4e4d5 210 led3=1;
pinofal 3:7df960e4e4d5 211 while(true)
pinofal 3:7df960e4e4d5 212 {
pinofal 3:7df960e4e4d5 213 DigitalWave=0;
pinofal 3:7df960e4e4d5 214 //wait_us(2024); //SI
pinofal 3:7df960e4e4d5 215 //wait_us(2551); //SOL
pinofal 3:7df960e4e4d5 216 wait_ms(300); //MI
pinofal 3:7df960e4e4d5 217 DigitalWave=1;
pinofal 3:7df960e4e4d5 218 wait_ms(300);
pinofal 3:7df960e4e4d5 219 }
pinofal 3:7df960e4e4d5 220 */
pinofal 3:7df960e4e4d5 221 //+++++++++++++++++++++++++++++++++++ END Test ONDA DIGITALE +++++++++++++++++++++++++++++++++++++++++++++
pinofal 3:7df960e4e4d5 222
pinofal 3:7df960e4e4d5 223
pinofal 3:7df960e4e4d5 224 //+++++++++++++++++++++++++++++++++++ START Test ONDA ANALOGICA ++++++++++++++++++++++++++++++++++++++++++
pinofal 3:7df960e4e4d5 225 fFreq=20.0; // frequenza della sinusoide di test
pinofal 3:7df960e4e4d5 226 pc.printf("\n\r--- Generazione LA = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 3:7df960e4e4d5 227 bStop = false;
pinofal 3:7df960e4e4d5 228 // genera la frequenza relativa alla nota che è stata selezionata
pinofal 3:7df960e4e4d5 229 fAmp = 0.3; // coefficiente per il quale viene moltiplicato l'ampiezza massima
pinofal 3:7df960e4e4d5 230 fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
pinofal 3:7df960e4e4d5 231 CalculateSinewave(32767, (32767*fAmp), (PI/2.0)); // generazione della sinusoide con valori nominali
pinofal 3:7df960e4e4d5 232 SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia output della sinusoide per generazione
pinofal 3:7df960e4e4d5 233 while(true){};
pinofal 3:7df960e4e4d5 234 //+++++++++++++++++++++++++++++++++++ END Test ONDA ANALOGICA ++++++++++++++++++++++++++++++++++++++++++++
pinofal 3:7df960e4e4d5 235
pinofal 3:7df960e4e4d5 236 //+++++++++++++++++++++++++++++++++++ START Test ONDA ANALOGICA ++++++++++++++++++++++++++++++++++++++++++++++
pinofal 3:7df960e4e4d5 237
pinofal 3:7df960e4e4d5 238 // variabile contenente l'angolo in radianti
pinofal 3:7df960e4e4d5 239 double fRads;
pinofal 3:7df960e4e4d5 240 // passo in frequenza fissato dal numero di campioni in cui voglio dividere un periodo di sinusoide: DeltaF = 360°/NUMSAMPLE
pinofal 3:7df960e4e4d5 241 double fDeltaF;
pinofal 3:7df960e4e4d5 242 // angolo per il quale bisogna calcolare il valore di sinusoide: fAngle = nIndex*DeltaF
pinofal 3:7df960e4e4d5 243 double fAngle;
pinofal 3:7df960e4e4d5 244
pinofal 3:7df960e4e4d5 245 fFreq=10.0;// frequenza della sinusoide DO da generare
pinofal 3:7df960e4e4d5 246 pc.printf("\n\r--- Generazione frequenza = %.2f Hz ---\n\r", fFreq);
pinofal 3:7df960e4e4d5 247
pinofal 3:7df960e4e4d5 248
pinofal 3:7df960e4e4d5 249 nSampleOutIndex=0;
pinofal 3:7df960e4e4d5 250 while(true)
pinofal 3:7df960e4e4d5 251 {
pinofal 3:7df960e4e4d5 252
pinofal 3:7df960e4e4d5 253 // output del campione della forma d'onda
pinofal 3:7df960e4e4d5 254 //OutWave.write_u16( 32767*cos(nSampleOutIndex/3.14));
pinofal 3:7df960e4e4d5 255 OutWave.write_u16( nSampleOutIndex);
pinofal 3:7df960e4e4d5 256
pinofal 3:7df960e4e4d5 257 // incrementa l'indice del campione in output, modulo NUMSAMPLE: se NUMSAMPLE è 360, nSampleOutIndex va da 0 a 359
pinofal 3:7df960e4e4d5 258 nSampleOutIndex++;
pinofal 3:7df960e4e4d5 259 if(nSampleOutIndex >= 32768)
pinofal 3:7df960e4e4d5 260 {
pinofal 3:7df960e4e4d5 261 nSampleOutIndex =0;
pinofal 3:7df960e4e4d5 262 }
pinofal 3:7df960e4e4d5 263
pinofal 3:7df960e4e4d5 264 wait_ms(10);
pinofal 3:7df960e4e4d5 265 }
pinofal 3:7df960e4e4d5 266
pinofal 3:7df960e4e4d5 267 //+++++++++++++++++++++++++++++++++++ END Test ONDA ANALOGICA ++++++++++++++++++++++++++++++++++++++++++
pinofal 3:7df960e4e4d5 268
pinofal 3:7df960e4e4d5 269 //+++++++++++++++++++++++++++++++++++ START Loop principale ++++++++++++++++++++++++++++++++++++++++++
pinofal 3:7df960e4e4d5 270 while(true)
pinofal 3:7df960e4e4d5 271 {
pinofal 3:7df960e4e4d5 272 // verifica se è arrivato un carattere dalla seriale del pc
pinofal 3:7df960e4e4d5 273 if(pc.readable())
pinofal 3:7df960e4e4d5 274 //if (true)
pinofal 3:7df960e4e4d5 275 {
pinofal 3:7df960e4e4d5 276 cReadChar = pc.getc(); // Read hyperterminal
pinofal 3:7df960e4e4d5 277 //cReadChar = 'C';
pinofal 3:7df960e4e4d5 278 // genera la nota corrispondente al carattere ricevuto
pinofal 3:7df960e4e4d5 279 switch(cReadChar)
pinofal 3:7df960e4e4d5 280 {
pinofal 3:7df960e4e4d5 281 //DO
pinofal 3:7df960e4e4d5 282 case 'c':
pinofal 3:7df960e4e4d5 283 case 'C':
pinofal 3:7df960e4e4d5 284 {
pinofal 3:7df960e4e4d5 285 fFreq=261.63;// frequenza della sinusoide DO da generare
pinofal 3:7df960e4e4d5 286 pc.printf("\n\r--- Generazione DO = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 3:7df960e4e4d5 287 bStop = false;
pinofal 3:7df960e4e4d5 288 } break;
pinofal 3:7df960e4e4d5 289 // RE
pinofal 3:7df960e4e4d5 290 case 'd':
pinofal 3:7df960e4e4d5 291 case 'D':
pinofal 3:7df960e4e4d5 292 {
pinofal 3:7df960e4e4d5 293 fFreq=293.66;// frequenza della sinusoide RE da generare
pinofal 3:7df960e4e4d5 294 pc.printf("\n\r--- Generazione RE = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 3:7df960e4e4d5 295 bStop = false;
pinofal 3:7df960e4e4d5 296 } break;
pinofal 3:7df960e4e4d5 297 // RE#/MIb
pinofal 3:7df960e4e4d5 298 case 'm':
pinofal 3:7df960e4e4d5 299 case 'M':
pinofal 3:7df960e4e4d5 300 {
pinofal 3:7df960e4e4d5 301 fFreq=311.13;
pinofal 3:7df960e4e4d5 302 pc.printf("\n\r--- Generazione Mib = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 3:7df960e4e4d5 303 bStop = false;
pinofal 3:7df960e4e4d5 304 } break;
pinofal 3:7df960e4e4d5 305 case 'e':
pinofal 3:7df960e4e4d5 306 case 'E':
pinofal 3:7df960e4e4d5 307 {
pinofal 3:7df960e4e4d5 308 fFreq=329.63; // frequenza della sinusoide MI da generare
pinofal 3:7df960e4e4d5 309 pc.printf("\n\r--- Generazione MI = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 3:7df960e4e4d5 310 bStop = false;
pinofal 3:7df960e4e4d5 311 } break;
pinofal 3:7df960e4e4d5 312 case 'f':
pinofal 3:7df960e4e4d5 313 case 'F':
pinofal 3:7df960e4e4d5 314 {
pinofal 3:7df960e4e4d5 315 fFreq=349.23;// frequenza della sinusoide FA da generare
pinofal 3:7df960e4e4d5 316 pc.printf("\n\r--- Generazione FA = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 3:7df960e4e4d5 317 bStop = false;
pinofal 3:7df960e4e4d5 318 } break;
pinofal 3:7df960e4e4d5 319
pinofal 3:7df960e4e4d5 320 // SOL
pinofal 3:7df960e4e4d5 321 case 'g':
pinofal 3:7df960e4e4d5 322 case 'G':
pinofal 3:7df960e4e4d5 323 {
pinofal 3:7df960e4e4d5 324 fFreq=392.0;
pinofal 3:7df960e4e4d5 325 pc.printf("\n\r--- Generazione SOL = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 3:7df960e4e4d5 326 bStop = false;
pinofal 3:7df960e4e4d5 327 } break;
pinofal 3:7df960e4e4d5 328 // LA
pinofal 3:7df960e4e4d5 329 case 'a':
pinofal 3:7df960e4e4d5 330 case 'A':
pinofal 3:7df960e4e4d5 331 {
pinofal 3:7df960e4e4d5 332 fFreq=440.0; // frequenza della sinusoide LA da generare
pinofal 3:7df960e4e4d5 333 pc.printf("\n\r--- Generazione LA = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 3:7df960e4e4d5 334 bStop = false;
pinofal 3:7df960e4e4d5 335 } break;
pinofal 3:7df960e4e4d5 336 //SI
pinofal 3:7df960e4e4d5 337 case 'b':
pinofal 3:7df960e4e4d5 338 case 'B':
pinofal 3:7df960e4e4d5 339 {
pinofal 3:7df960e4e4d5 340 fFreq=493.88;// frequenza della sinusoide SI da generare
pinofal 3:7df960e4e4d5 341 pc.printf("\n\r--- Generazione SI = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 3:7df960e4e4d5 342 bStop = false;
pinofal 3:7df960e4e4d5 343 } break;
pinofal 3:7df960e4e4d5 344
pinofal 3:7df960e4e4d5 345 // pausa
pinofal 3:7df960e4e4d5 346 case ' ':
pinofal 3:7df960e4e4d5 347 {
pinofal 3:7df960e4e4d5 348 bStop=true;
pinofal 3:7df960e4e4d5 349 pc.printf("\n\r--- Generation Stopped ---\n\r");
pinofal 3:7df960e4e4d5 350 } break;
pinofal 3:7df960e4e4d5 351 default:
pinofal 3:7df960e4e4d5 352 {
pinofal 3:7df960e4e4d5 353 bStop=true; // se la nota non è riconosciuta blocca la generazione
pinofal 3:7df960e4e4d5 354 pc.printf("\n\r--- Wrong Tone ---\n\r");
pinofal 3:7df960e4e4d5 355 } break;
pinofal 3:7df960e4e4d5 356 } // switch (cReadChar)
pinofal 3:7df960e4e4d5 357
pinofal 3:7df960e4e4d5 358 // genera la frequenza relativa alla nota che è stata selezionata
pinofal 3:7df960e4e4d5 359 fAmp = 1.0; // coefficiente per il quale viene moltiplicato l'ampiezza massima
pinofal 3:7df960e4e4d5 360 fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
pinofal 3:7df960e4e4d5 361 CalculateSinewave(32767, (32767*fAmp), (PI/2.0)); // generazione della sinusoide con valori nominali
pinofal 3:7df960e4e4d5 362 SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia output della sinusoide per generazione
pinofal 3:7df960e4e4d5 363 }
pinofal 3:7df960e4e4d5 364 else // se non è stato premuto nessun tasto diagnostica
pinofal 3:7df960e4e4d5 365 {
pinofal 3:7df960e4e4d5 366
pinofal 3:7df960e4e4d5 367 }
pinofal 3:7df960e4e4d5 368 }
pinofal 3:7df960e4e4d5 369
pinofal 3:7df960e4e4d5 370
pinofal 3:7df960e4e4d5 371 }