Temperature Sampling
Dependencies: mbed
Fork of Nucleo-DAC-Algorithm by
main.cpp@1:ffc7a5d0f629, 2018-01-30 (annotated)
- Committer:
- pinofal
- Date:
- Tue Jan 30 16:30:54 2018 +0000
- Revision:
- 1:ffc7a5d0f629
- Parent:
- 0:3106d3fc6696
new revision
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pinofal | 0:3106d3fc6696 | 1 | #include "mbed.h" |
pinofal | 0:3106d3fc6696 | 2 | |
pinofal | 1:ffc7a5d0f629 | 3 | AnalogIn InLocale(PA_6); |
pinofal | 1:ffc7a5d0f629 | 4 | AnalogOut OutLocale(PA_4); |
pinofal | 1:ffc7a5d0f629 | 5 | AnalogOut OutCampagna(PA_5); |
pinofal | 0:3106d3fc6696 | 6 | Serial pc(SERIAL_TX, SERIAL_RX); |
pinofal | 0:3106d3fc6696 | 7 | |
pinofal | 0:3106d3fc6696 | 8 | #if !DEVICE_ANALOGOUT |
pinofal | 0:3106d3fc6696 | 9 | #error You cannot use this example as the AnalogOut is not supported on this device. |
pinofal | 0:3106d3fc6696 | 10 | #else |
pinofal | 1:ffc7a5d0f629 | 11 | #endif |
pinofal | 0:3106d3fc6696 | 12 | |
pinofal | 1:ffc7a5d0f629 | 13 | |
pinofal | 1:ffc7a5d0f629 | 14 | // Numero di periodi di sinusoide di cui è composto ciascuno step della PSK |
pinofal | 1:ffc7a5d0f629 | 15 | #define fPerStep1 23.0 |
pinofal | 1:ffc7a5d0f629 | 16 | #define fPerStep2 1.25 |
pinofal | 1:ffc7a5d0f629 | 17 | #define fPerStep3 15.0 |
pinofal | 1:ffc7a5d0f629 | 18 | #define fPerStep4 1.25 |
pinofal | 1:ffc7a5d0f629 | 19 | #define fPerStep5 7.0 |
pinofal | 1:ffc7a5d0f629 | 20 | #define fPerStep6 1.25 |
pinofal | 1:ffc7a5d0f629 | 21 | #define fPerStep7 7.0 |
pinofal | 1:ffc7a5d0f629 | 22 | #define fPerStep8 1.25 |
pinofal | 1:ffc7a5d0f629 | 23 | |
pinofal | 1:ffc7a5d0f629 | 24 | // numero di campioni che compongono un periodo della sinusoide in Output sull'ADC |
pinofal | 1:ffc7a5d0f629 | 25 | #define SAMPLESINENUM 45 // consigliabile avere multipli di 45 |
pinofal | 1:ffc7a5d0f629 | 26 | // numero di campioni generati durante una intera modulazione PSK. Nominalmente la somma del numero di periodi degli step è 57. |
pinofal | 1:ffc7a5d0f629 | 27 | #define nNumPeriodi (fPerStep1 + fPerStep2 + fPerStep3 + fPerStep4 + fPerStep5 + fPerStep6 + fPerStep7 + fPerStep8) |
pinofal | 1:ffc7a5d0f629 | 28 | #define SAMPLEOUTNUM (SAMPLESINENUM*nNumPeriodi) |
pinofal | 1:ffc7a5d0f629 | 29 | // numero di campioni acquisiti dall'ADC e che compongono l'array |
pinofal | 1:ffc7a5d0f629 | 30 | #define SAMPLEINNUM (SAMPLESINENUM*nNumPeriodi*2)+2 // contiene una intera onda (in Byte) generata con PSK, + 2 caratteri |
pinofal | 1:ffc7a5d0f629 | 31 | |
pinofal | 0:3106d3fc6696 | 32 | // periodo in millisecondi della 83.3 Hz |
pinofal | 0:3106d3fc6696 | 33 | #define T833 (1/83.3) |
pinofal | 0:3106d3fc6696 | 34 | // periodo in millisecondi della 50 Hz |
pinofal | 0:3106d3fc6696 | 35 | #define T50 (1/50.0) |
pinofal | 0:3106d3fc6696 | 36 | // periodo in millisecondi del Bridge tra le diverse fasi = 9,6 ms |
pinofal | 0:3106d3fc6696 | 37 | #define T96 (0.0096) |
pinofal | 1:ffc7a5d0f629 | 38 | // periodo di acquisizione dall'ADC |
pinofal | 1:ffc7a5d0f629 | 39 | #define TADC (0.0048) // impostato aper avere 3 campioni nel periodo di bridge (1.25 * 9.6 ms) |
pinofal | 0:3106d3fc6696 | 40 | // numero di campioni in 1/4 di periodo |
pinofal | 1:ffc7a5d0f629 | 41 | #define QUARTERSAMPLEOUTNUM SAMPLESINENUM/4 |
pinofal | 1:ffc7a5d0f629 | 42 | |
pinofal | 0:3106d3fc6696 | 43 | |
pinofal | 0:3106d3fc6696 | 44 | // parametri dell'onda coseno da generare |
pinofal | 0:3106d3fc6696 | 45 | #define PI (3.141592653589793238462) |
pinofal | 0:3106d3fc6696 | 46 | #define AMPLITUDE 32767 //(1.0) // x * 3.3V |
pinofal | 1:ffc7a5d0f629 | 47 | #define PHASE (PI/2) // 2*pi è un periodo |
pinofal | 0:3106d3fc6696 | 48 | #define OFFSET 32767 //(0x7FFF) |
pinofal | 0:3106d3fc6696 | 49 | |
pinofal | 0:3106d3fc6696 | 50 | // Output LED di diagnostica |
pinofal | 0:3106d3fc6696 | 51 | DigitalOut led(LED1); |
pinofal | 0:3106d3fc6696 | 52 | |
pinofal | 1:ffc7a5d0f629 | 53 | // ticker per la generazione dell'onda con DAC |
pinofal | 1:ffc7a5d0f629 | 54 | Ticker SampleOutTicker; |
pinofal | 1:ffc7a5d0f629 | 55 | // ticker per l'acquisizione dell'onda con ADC |
pinofal | 1:ffc7a5d0f629 | 56 | //Ticker SampleInTicker; |
pinofal | 1:ffc7a5d0f629 | 57 | |
pinofal | 1:ffc7a5d0f629 | 58 | // Buffer contenente la sinusoide da porre in output. |
pinofal | 1:ffc7a5d0f629 | 59 | unsigned short usaSine[SAMPLESINENUM]; |
pinofal | 0:3106d3fc6696 | 60 | |
pinofal | 1:ffc7a5d0f629 | 61 | // array con i dati acquisiti dall'ADC Locale |
pinofal | 1:ffc7a5d0f629 | 62 | //volatile unsigned short usaLocaleADC[SAMPLEINNUM]; |
pinofal | 1:ffc7a5d0f629 | 63 | volatile char caTxPacket[(int)SAMPLEINNUM]; |
pinofal | 0:3106d3fc6696 | 64 | |
pinofal | 1:ffc7a5d0f629 | 65 | // prototipo di funzione che genera i campioni della sinusoide da utilizzare per la generazione tramite DAC |
pinofal | 1:ffc7a5d0f629 | 66 | void CalculateSinewave(void); |
pinofal | 1:ffc7a5d0f629 | 67 | |
pinofal | 0:3106d3fc6696 | 68 | // carattere in arrivo dal PC |
pinofal | 0:3106d3fc6696 | 69 | volatile char cReadChar; |
pinofal | 0:3106d3fc6696 | 70 | // valore letto dall'ADC |
pinofal | 0:3106d3fc6696 | 71 | volatile unsigned short usReadADC; |
pinofal | 1:ffc7a5d0f629 | 72 | |
pinofal | 0:3106d3fc6696 | 73 | // Tipo di PSK da generare |
pinofal | 0:3106d3fc6696 | 74 | volatile int nPSK; |
pinofal | 0:3106d3fc6696 | 75 | // indice, nell'array, del campione da porre in output |
pinofal | 1:ffc7a5d0f629 | 76 | volatile int nSampleOutIndex; |
pinofal | 1:ffc7a5d0f629 | 77 | // indice, nell'array, del campione acquisito in input |
pinofal | 1:ffc7a5d0f629 | 78 | volatile int nSampleInIndex; |
pinofal | 1:ffc7a5d0f629 | 79 | // contatore dei campioni in output sul DAC |
pinofal | 1:ffc7a5d0f629 | 80 | volatile int nSampleOutCount; |
pinofal | 1:ffc7a5d0f629 | 81 | // contatore dei campioni in input dall'ADC |
pinofal | 1:ffc7a5d0f629 | 82 | volatile int nSampleInCount; |
pinofal | 0:3106d3fc6696 | 83 | // Periodo di generazione campioni in output DeltaT = T/NumSample |
pinofal | 0:3106d3fc6696 | 84 | double fDeltaT; |
pinofal | 0:3106d3fc6696 | 85 | // amplificazione per il dato da spedire sull'ADC |
pinofal | 0:3106d3fc6696 | 86 | volatile double fAmp; |
pinofal | 0:3106d3fc6696 | 87 | //volatile double fAmpNew; |
pinofal | 0:3106d3fc6696 | 88 | // Step attuale e nuovo Step nella generazione di una PSK |
pinofal | 1:ffc7a5d0f629 | 89 | volatile int nStep; |
pinofal | 1:ffc7a5d0f629 | 90 | volatile int nNewStep; |
pinofal | 1:ffc7a5d0f629 | 91 | //variabili ausiliarie |
pinofal | 0:3106d3fc6696 | 92 | volatile unsigned short usAux; |
pinofal | 1:ffc7a5d0f629 | 93 | volatile char cAux; |
pinofal | 0:3106d3fc6696 | 94 | // flag per bloccare la generazione del segnale |
pinofal | 0:3106d3fc6696 | 95 | volatile bool bStop; |
pinofal | 0:3106d3fc6696 | 96 | // frequenza segnale da generare |
pinofal | 0:3106d3fc6696 | 97 | volatile double fFreq; |
pinofal | 0:3106d3fc6696 | 98 | |
pinofal | 1:ffc7a5d0f629 | 99 | |
pinofal | 1:ffc7a5d0f629 | 100 | |
pinofal | 0:3106d3fc6696 | 101 | //**************************** |
pinofal | 0:3106d3fc6696 | 102 | // Create the sinewave buffer |
pinofal | 0:3106d3fc6696 | 103 | //**************************** |
pinofal | 0:3106d3fc6696 | 104 | void CalculateSinewave(int nOffset, int nAmplitude, double fPhase) |
pinofal | 0:3106d3fc6696 | 105 | { |
pinofal | 0:3106d3fc6696 | 106 | // variabile contenente l'angolo in radianti |
pinofal | 0:3106d3fc6696 | 107 | double fRads; |
pinofal | 0:3106d3fc6696 | 108 | // indici per i cicli |
pinofal | 0:3106d3fc6696 | 109 | int nIndex; |
pinofal | 0:3106d3fc6696 | 110 | // passo in frequenza fissato dal numero di campioni in cui voglio dividere un periodo di sinusoide: DeltaF = 360°/NUMSAMPLE |
pinofal | 0:3106d3fc6696 | 111 | double fDeltaF; |
pinofal | 0:3106d3fc6696 | 112 | // angolo per il quale bisogna calcolare il valore di sinusoide: fAngle = nIndex*DeltaF |
pinofal | 0:3106d3fc6696 | 113 | double fAngle; |
pinofal | 0:3106d3fc6696 | 114 | |
pinofal | 1:ffc7a5d0f629 | 115 | fDeltaF = 360.0/SAMPLESINENUM; |
pinofal | 1:ffc7a5d0f629 | 116 | for (nIndex = 0; nIndex < SAMPLESINENUM; nIndex++) |
pinofal | 0:3106d3fc6696 | 117 | { |
pinofal | 0:3106d3fc6696 | 118 | fAngle = nIndex*fDeltaF; // angolo per il quale bisogna calcolare il campione di sinusoide |
pinofal | 0:3106d3fc6696 | 119 | fRads = (PI * fAngle)/180.0; // Convert degree in radian |
pinofal | 0:3106d3fc6696 | 120 | //usaSine[nIndex] = AMPLITUDE * cos(fRads + PHASE) + OFFSET; |
pinofal | 0:3106d3fc6696 | 121 | usaSine[nIndex] = nAmplitude * cos(fRads + fPhase) + nOffset; |
pinofal | 0:3106d3fc6696 | 122 | } |
pinofal | 0:3106d3fc6696 | 123 | } |
pinofal | 0:3106d3fc6696 | 124 | |
pinofal | 0:3106d3fc6696 | 125 | |
pinofal | 1:ffc7a5d0f629 | 126 | |
pinofal | 0:3106d3fc6696 | 127 | //*************************** |
pinofal | 0:3106d3fc6696 | 128 | // generazione sample da DAC |
pinofal | 0:3106d3fc6696 | 129 | //*************************** |
pinofal | 0:3106d3fc6696 | 130 | void SampleOut() |
pinofal | 0:3106d3fc6696 | 131 | { |
pinofal | 1:ffc7a5d0f629 | 132 | |
pinofal | 0:3106d3fc6696 | 133 | |
pinofal | 0:3106d3fc6696 | 134 | // se è stato inviato il comando Stop, non fare niente fino a nuovo comando |
pinofal | 0:3106d3fc6696 | 135 | if(bStop) |
pinofal | 0:3106d3fc6696 | 136 | { |
pinofal | 0:3106d3fc6696 | 137 | } |
pinofal | 0:3106d3fc6696 | 138 | else // se non è stato inviato il comando di bStop continua |
pinofal | 0:3106d3fc6696 | 139 | { |
pinofal | 0:3106d3fc6696 | 140 | // output del campione della forma d'onda |
pinofal | 1:ffc7a5d0f629 | 141 | //usAux=(usaSine[nSampleOutIndex])/fAmp; |
pinofal | 1:ffc7a5d0f629 | 142 | //usAux=usaSine[nSampleOutIndex]; |
pinofal | 1:ffc7a5d0f629 | 143 | OutLocale.write_u16(usaSine[nSampleOutIndex]); |
pinofal | 1:ffc7a5d0f629 | 144 | OutCampagna.write_u16(usaSine[nSampleOutIndex]); |
pinofal | 1:ffc7a5d0f629 | 145 | |
pinofal | 1:ffc7a5d0f629 | 146 | // incrementa l'indice del campione in output, modulo NUMSAMPLE: se NUMSAMPLE è 360, nSampleOutIndex va da 0 a 359 |
pinofal | 1:ffc7a5d0f629 | 147 | nSampleOutIndex++; |
pinofal | 1:ffc7a5d0f629 | 148 | if(nSampleOutIndex >= SAMPLESINENUM) |
pinofal | 1:ffc7a5d0f629 | 149 | { |
pinofal | 1:ffc7a5d0f629 | 150 | nSampleOutIndex=0; |
pinofal | 1:ffc7a5d0f629 | 151 | } |
pinofal | 0:3106d3fc6696 | 152 | |
pinofal | 1:ffc7a5d0f629 | 153 | // acquisisce dato da ADC |
pinofal | 1:ffc7a5d0f629 | 154 | usReadADC = InLocale.read_u16(); |
pinofal | 1:ffc7a5d0f629 | 155 | // prepara il pacchetto di dati acquisiti da restituire al PC |
pinofal | 1:ffc7a5d0f629 | 156 | caTxPacket[nSampleInCount]= (char)(usReadADC&0xFF); |
pinofal | 1:ffc7a5d0f629 | 157 | //+++caTxPacket[nSampleInCount]= 'a'; |
pinofal | 1:ffc7a5d0f629 | 158 | nSampleInCount++; |
pinofal | 1:ffc7a5d0f629 | 159 | caTxPacket[nSampleInCount] = (char)((usReadADC>>8)&0xFF); |
pinofal | 1:ffc7a5d0f629 | 160 | //++++caTxPacket[nSampleInCount]= 'b'; |
pinofal | 1:ffc7a5d0f629 | 161 | |
pinofal | 0:3106d3fc6696 | 162 | // incrementa il numero di campioni inviati, e individua la fase in cui ci si trova, relativamente alla modulazione PSK selezionata |
pinofal | 1:ffc7a5d0f629 | 163 | nSampleOutCount++; |
pinofal | 1:ffc7a5d0f629 | 164 | nSampleInCount = nSampleOutCount*2; |
pinofal | 0:3106d3fc6696 | 165 | |
pinofal | 1:ffc7a5d0f629 | 166 | |
pinofal | 0:3106d3fc6696 | 167 | switch(nPSK) |
pinofal | 0:3106d3fc6696 | 168 | { |
pinofal | 1:ffc7a5d0f629 | 169 | case 0: |
pinofal | 1:ffc7a5d0f629 | 170 | { |
pinofal | 1:ffc7a5d0f629 | 171 | // in questo caso sto generando sinusoidi a frequenza fissa, senza PSK; reinizializza gli indici degli array di campioni acquisiti e generati |
pinofal | 1:ffc7a5d0f629 | 172 | if(nSampleOutCount >= SAMPLEOUTNUM) // nSampleInCount è sempre pari a nSampleOutCount*2 |
pinofal | 1:ffc7a5d0f629 | 173 | { |
pinofal | 1:ffc7a5d0f629 | 174 | nSampleOutCount=0; |
pinofal | 1:ffc7a5d0f629 | 175 | } |
pinofal | 1:ffc7a5d0f629 | 176 | } break; |
pinofal | 0:3106d3fc6696 | 177 | case 1: |
pinofal | 0:3106d3fc6696 | 178 | { |
pinofal | 1:ffc7a5d0f629 | 179 | switch(nSampleOutCount) |
pinofal | 0:3106d3fc6696 | 180 | { |
pinofal | 1:ffc7a5d0f629 | 181 | case 0: //if(nSampleOutCount == 0) // dopo il ciclo completo, si ritorna allo step 1 |
pinofal | 0:3106d3fc6696 | 182 | { |
pinofal | 0:3106d3fc6696 | 183 | nNewStep = 1; // genera 23 periodi di sinusoide |
pinofal | 0:3106d3fc6696 | 184 | //pc.printf(" nStep = %1d \n\r",nNewStep); |
pinofal | 0:3106d3fc6696 | 185 | } break; |
pinofal | 1:ffc7a5d0f629 | 186 | case (fPerStep1*SAMPLESINENUM): //if(nSampleOutCount == (23*SAMPLESINENUM)) // dopo 23 periodi a 83.3 Hz, passa allo step 2 in cui genera il primo Bridge |
pinofal | 0:3106d3fc6696 | 187 | { |
pinofal | 0:3106d3fc6696 | 188 | nNewStep = 2; // genera Bridge |
pinofal | 0:3106d3fc6696 | 189 | //pc.printf(" nStep = %1d \n\r",nNewStep); |
pinofal | 0:3106d3fc6696 | 190 | } break; |
pinofal | 1:ffc7a5d0f629 | 191 | case ((fPerStep1+fPerStep2)*SAMPLESINENUM): //if(nSampleOutCount == ((23*SAMPLESINENUM)+(1.25*SAMPLESINENUM))) // dopo 23 periodi a 83.3 Hz, e un Bridge genera 15 sinusoidi a 83.3 Hz |
pinofal | 0:3106d3fc6696 | 192 | { |
pinofal | 0:3106d3fc6696 | 193 | nNewStep = 3; // genera 15 periodi di sinusoide |
pinofal | 0:3106d3fc6696 | 194 | //pc.printf(" nStep = %1d \n\r",nNewStep); |
pinofal | 0:3106d3fc6696 | 195 | } |
pinofal | 1:ffc7a5d0f629 | 196 | case ((fPerStep1+fPerStep2+fPerStep3)*SAMPLESINENUM): //if(nSampleOutCount == ((23*SAMPLESINENUM)+(1.25*SAMPLESINENUM)+(15*SAMPLESINENUM))) // dopo 23 periodi a 83.3 Hz, Bridge e 15 periodi a 83.3 Hz, genera un bridge |
pinofal | 0:3106d3fc6696 | 197 | { |
pinofal | 0:3106d3fc6696 | 198 | nNewStep = 4; // Genera Bridge |
pinofal | 0:3106d3fc6696 | 199 | //pc.printf(" nStep = %1d \n\r",nNewStep); |
pinofal | 0:3106d3fc6696 | 200 | } break; |
pinofal | 1:ffc7a5d0f629 | 201 | case ((fPerStep1+fPerStep2+fPerStep3+fPerStep4)*SAMPLESINENUM): //if(nSampleOutCount == ((23*SSAMPLESINENUM)+(1.25*SAMPLESINENUM)+(15*SAMPLESINENUM)+(1.25*SAMPLESINENUM))) // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge, genera 7 periodi a 83.3Hz |
pinofal | 0:3106d3fc6696 | 202 | { |
pinofal | 0:3106d3fc6696 | 203 | nNewStep = 5; // genera 7 periodi di sinusoide |
pinofal | 0:3106d3fc6696 | 204 | //pc.printf(" nStep = %1d \n\r",nNewStep); |
pinofal | 0:3106d3fc6696 | 205 | } break; |
pinofal | 1:ffc7a5d0f629 | 206 | case ((fPerStep1+fPerStep2+fPerStep3+fPerStep4+fPerStep5)*SAMPLESINENUM): //if(nSampleOutCount == ((23*SAMPLESINENUM)+(1.25*SAMPLESINENUM)+(15*SAMPLESINENUM)+(1.25*SAMPLESINENUM)+(7*SAMPLESINENUM))) // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, genera bridge |
pinofal | 0:3106d3fc6696 | 207 | { |
pinofal | 0:3106d3fc6696 | 208 | nNewStep = 6; // Genera Bridge |
pinofal | 0:3106d3fc6696 | 209 | //pc.printf(" nStep = %1d \n\r",nNewStep); |
pinofal | 0:3106d3fc6696 | 210 | } break; |
pinofal | 1:ffc7a5d0f629 | 211 | case ((fPerStep1+fPerStep2+fPerStep3+fPerStep4+fPerStep5+fPerStep6)*SAMPLESINENUM): //if(nSampleOutCount == ((23*SAMPLESINENUM)+(1.25*SAMPLESINENUM)+(15*SAMPLESINENUM)+(1.25*SAMPLESINENUM)+(7*SAMPLESINENUM)+(1.25*SAMPLESINENUM))) // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, bridge, genera 7 periodi a 83.3Hz |
pinofal | 0:3106d3fc6696 | 212 | { |
pinofal | 0:3106d3fc6696 | 213 | nNewStep = 7; // genera 7 periodi di sinusoide |
pinofal | 0:3106d3fc6696 | 214 | //pc.printf(" nStep = %1d \n\r",nNewStep); |
pinofal | 0:3106d3fc6696 | 215 | } break; |
pinofal | 1:ffc7a5d0f629 | 216 | case ((fPerStep1+fPerStep2+fPerStep3+fPerStep4+fPerStep5+fPerStep6+fPerStep7)*SAMPLESINENUM): //if(nSampleOutCount == ((23*SAMPLESINENUM)+(1.25*SAMPLESINENUM)+(15*SAMPLESINENUM)+(1.25*SAMPLESINENUM)+(7*SAMPLESINENUM)+(1.25*SAMPLESINENUM)+(7*SAMPLESINENUM))) // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, bridge, 7 periodi a 83.3Hz, genera bridge |
pinofal | 0:3106d3fc6696 | 217 | { |
pinofal | 0:3106d3fc6696 | 218 | nNewStep =8; // genera bridge |
pinofal | 0:3106d3fc6696 | 219 | //pc.printf(" nStep = %1d \n\r",nNewStep); |
pinofal | 0:3106d3fc6696 | 220 | } break; |
pinofal | 1:ffc7a5d0f629 | 221 | case ((fPerStep1+fPerStep2+fPerStep3+fPerStep4+fPerStep5+fPerStep6+fPerStep7+fPerStep8)*SAMPLESINENUM): //if(nSampleOutCount == ((23*SAMPLESINENUM)+(1.25*SAMPLESINENUM)+(15*SAMPLESINENUM)+(1.25*SAMPLESINENUM)+(7*SAMPLESINENUM)+(1.25*SAMPLESINENUM)+(7*SAMPLESINENUM)+(1.25*SAMPLESINENUM))) // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, bridge, 7 periodi a 83.3Hz, bridge, ritorna a generare 23 periodi a 83.3Hz |
pinofal | 0:3106d3fc6696 | 222 | { |
pinofal | 0:3106d3fc6696 | 223 | nNewStep =1; |
pinofal | 1:ffc7a5d0f629 | 224 | nSampleOutCount =0; |
pinofal | 0:3106d3fc6696 | 225 | //pc.printf(" nStep = %1d \n\r",nNewStep); |
pinofal | 0:3106d3fc6696 | 226 | } break; |
pinofal | 0:3106d3fc6696 | 227 | default: {} break; |
pinofal | 0:3106d3fc6696 | 228 | } |
pinofal | 0:3106d3fc6696 | 229 | } break; |
pinofal | 1:ffc7a5d0f629 | 230 | default:{} break; |
pinofal | 1:ffc7a5d0f629 | 231 | } |
pinofal | 0:3106d3fc6696 | 232 | } |
pinofal | 0:3106d3fc6696 | 233 | } |
pinofal | 0:3106d3fc6696 | 234 | |
pinofal | 0:3106d3fc6696 | 235 | |
pinofal | 0:3106d3fc6696 | 236 | |
pinofal | 0:3106d3fc6696 | 237 | |
pinofal | 0:3106d3fc6696 | 238 | //******************* |
pinofal | 0:3106d3fc6696 | 239 | // Loop Principale |
pinofal | 0:3106d3fc6696 | 240 | //******************* |
pinofal | 0:3106d3fc6696 | 241 | int main() |
pinofal | 0:3106d3fc6696 | 242 | { |
pinofal | 1:ffc7a5d0f629 | 243 | // indice per i cicli |
pinofal | 1:ffc7a5d0f629 | 244 | int nIndex; |
pinofal | 1:ffc7a5d0f629 | 245 | |
pinofal | 0:3106d3fc6696 | 246 | // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto |
pinofal | 0:3106d3fc6696 | 247 | pc.baud(921600); //921600 bps |
pinofal | 1:ffc7a5d0f629 | 248 | //pc.baud(256000); //256000 bps |
pinofal | 0:3106d3fc6696 | 249 | pc.printf("*** SineWave Generation ***\n\r"); |
pinofal | 0:3106d3fc6696 | 250 | |
pinofal | 0:3106d3fc6696 | 251 | //inizializza variabili |
pinofal | 1:ffc7a5d0f629 | 252 | nSampleInIndex =0; |
pinofal | 0:3106d3fc6696 | 253 | fAmp = 1.0; |
pinofal | 0:3106d3fc6696 | 254 | cReadChar = 0; |
pinofal | 1:ffc7a5d0f629 | 255 | nSampleOutIndex=0; |
pinofal | 1:ffc7a5d0f629 | 256 | nSampleOutCount=0; |
pinofal | 0:3106d3fc6696 | 257 | nPSK =0; |
pinofal | 0:3106d3fc6696 | 258 | bStop= false; |
pinofal | 0:3106d3fc6696 | 259 | fFreq = 83.3; |
pinofal | 1:ffc7a5d0f629 | 260 | for(nIndex =0; nIndex < SAMPLEINNUM; nIndex++) |
pinofal | 1:ffc7a5d0f629 | 261 | { |
pinofal | 1:ffc7a5d0f629 | 262 | caTxPacket[nIndex]='\0'; |
pinofal | 1:ffc7a5d0f629 | 263 | } |
pinofal | 0:3106d3fc6696 | 264 | |
pinofal | 1:ffc7a5d0f629 | 265 | |
pinofal | 1:ffc7a5d0f629 | 266 | |
pinofal | 1:ffc7a5d0f629 | 267 | |
pinofal | 0:3106d3fc6696 | 268 | // genera sinusoide |
pinofal | 1:ffc7a5d0f629 | 269 | //+++SampleInTicker.attach(&SampleIn,TADC); // Ticker di acquisizione dall'ADC |
pinofal | 0:3106d3fc6696 | 270 | // avvia il ciclo di generazione sinusoide |
pinofal | 0:3106d3fc6696 | 271 | while(true) |
pinofal | 0:3106d3fc6696 | 272 | { |
pinofal | 1:ffc7a5d0f629 | 273 | |
pinofal | 0:3106d3fc6696 | 274 | // verifica se è arrivato un carattere dalla seriale del PC |
pinofal | 0:3106d3fc6696 | 275 | if(pc.readable()) |
pinofal | 0:3106d3fc6696 | 276 | { |
pinofal | 0:3106d3fc6696 | 277 | cReadChar = pc.getc(); // Read hyperterminal |
pinofal | 0:3106d3fc6696 | 278 | bStop = false; // è stato inviato un comando, quindi resetta il flag di Stop: bStop = False |
pinofal | 0:3106d3fc6696 | 279 | |
pinofal | 0:3106d3fc6696 | 280 | if(cReadChar == '1') // genera sinusoide a 83.3Hz con ampiezza ridotta a metà della nominale |
pinofal | 0:3106d3fc6696 | 281 | { |
pinofal | 1:ffc7a5d0f629 | 282 | pc.printf("\n\r--- Selezionato PSK-I ---\n\r"); |
pinofal | 0:3106d3fc6696 | 283 | bStop = false; // è stato inviato un comando, quindi bStop = False |
pinofal | 0:3106d3fc6696 | 284 | nPSK = 1; |
pinofal | 0:3106d3fc6696 | 285 | fAmp = 1.0; |
pinofal | 1:ffc7a5d0f629 | 286 | nSampleOutIndex=0; |
pinofal | 1:ffc7a5d0f629 | 287 | nSampleOutCount=0; |
pinofal | 1:ffc7a5d0f629 | 288 | // generazione della sinusoide con valori nominali |
pinofal | 1:ffc7a5d0f629 | 289 | CalculateSinewave(32767, 32767, (PI/2.0)); |
pinofal | 0:3106d3fc6696 | 290 | nStep = 0; // inizializza lo step che sarà aggiornato nella routine di generazione campione |
pinofal | 0:3106d3fc6696 | 291 | //fAmpNew = 1.0; |
pinofal | 1:ffc7a5d0f629 | 292 | //fDeltaT= T833/SAMPLEOUTNUM; // frequenza di generazione iniziale |
pinofal | 0:3106d3fc6696 | 293 | } |
pinofal | 0:3106d3fc6696 | 294 | if (cReadChar == 'a') // genera sinusoide a 83.3Hz con ampiezza nominale |
pinofal | 0:3106d3fc6696 | 295 | { |
pinofal | 1:ffc7a5d0f629 | 296 | bStop = true; |
pinofal | 0:3106d3fc6696 | 297 | nPSK = 0; // nessuna PSK da generare |
pinofal | 1:ffc7a5d0f629 | 298 | fFreq = 83.3; |
pinofal | 1:ffc7a5d0f629 | 299 | pc.printf("\n\r--- Generazione %.1f Hz ampiezza nominale ---\n\r", fFreq); |
pinofal | 1:ffc7a5d0f629 | 300 | //nSampleOutIndex=0; |
pinofal | 1:ffc7a5d0f629 | 301 | //nSampleOutCount=0; |
pinofal | 0:3106d3fc6696 | 302 | fAmp = 1.0; |
pinofal | 1:ffc7a5d0f629 | 303 | // generazione della sinusoide con valori nominali |
pinofal | 1:ffc7a5d0f629 | 304 | CalculateSinewave(32767, 32767, (PI/2.0)); |
pinofal | 1:ffc7a5d0f629 | 305 | fDeltaT = 1.0/(fFreq*SAMPLESINENUM); |
pinofal | 1:ffc7a5d0f629 | 306 | bStop = false; |
pinofal | 1:ffc7a5d0f629 | 307 | SampleOutTicker.attach(&SampleOut,fDeltaT); |
pinofal | 0:3106d3fc6696 | 308 | } |
pinofal | 0:3106d3fc6696 | 309 | if (cReadChar == 'b') // genera sinusoide a 50 Hz con ampiezza ridotta a metà della nominale |
pinofal | 0:3106d3fc6696 | 310 | { |
pinofal | 1:ffc7a5d0f629 | 311 | bStop = true; |
pinofal | 1:ffc7a5d0f629 | 312 | nPSK = 0; // nessuna PSK da generare |
pinofal | 1:ffc7a5d0f629 | 313 | fFreq = 50.0; |
pinofal | 1:ffc7a5d0f629 | 314 | pc.printf("\n\r--- Generazione %.1f Hz ampiezza 1/2 della nominale ---\n\r", fFreq); |
pinofal | 1:ffc7a5d0f629 | 315 | //nSampleOutIndex=0; |
pinofal | 1:ffc7a5d0f629 | 316 | //nSampleOutCount=0; |
pinofal | 1:ffc7a5d0f629 | 317 | fAmp = 1.0; |
pinofal | 1:ffc7a5d0f629 | 318 | // genera sinusoide |
pinofal | 1:ffc7a5d0f629 | 319 | CalculateSinewave(32767, (32767/2), (PI/2.0)); |
pinofal | 1:ffc7a5d0f629 | 320 | // attach ticker |
pinofal | 1:ffc7a5d0f629 | 321 | fDeltaT = 1.0/(fFreq*SAMPLESINENUM); |
pinofal | 1:ffc7a5d0f629 | 322 | bStop = false; |
pinofal | 1:ffc7a5d0f629 | 323 | SampleOutTicker.attach(&SampleOut,fDeltaT); |
pinofal | 0:3106d3fc6696 | 324 | } |
pinofal | 0:3106d3fc6696 | 325 | if (cReadChar == 'c') // genera sinusoide a 45 Hz con ampiezza ridotta a 1/4 del valore nominale |
pinofal | 0:3106d3fc6696 | 326 | { |
pinofal | 1:ffc7a5d0f629 | 327 | bStop = true; |
pinofal | 1:ffc7a5d0f629 | 328 | nPSK = 0; // nessuna PSK da generare |
pinofal | 1:ffc7a5d0f629 | 329 | fFreq = 45.0; |
pinofal | 1:ffc7a5d0f629 | 330 | pc.printf("\n\r--- Generazione %.1f Hz ampiezza 1/4 della nominale ---\n\r", fFreq); |
pinofal | 1:ffc7a5d0f629 | 331 | //nSampleOutIndex=0; |
pinofal | 1:ffc7a5d0f629 | 332 | //nSampleOutCount=0; |
pinofal | 1:ffc7a5d0f629 | 333 | fAmp = 1.0; |
pinofal | 1:ffc7a5d0f629 | 334 | // genera sinusoide |
pinofal | 1:ffc7a5d0f629 | 335 | CalculateSinewave(32767, (32767/4), (PI/2.0)); |
pinofal | 1:ffc7a5d0f629 | 336 | // attach ticker |
pinofal | 1:ffc7a5d0f629 | 337 | fDeltaT = (double)(1.0/((double)fFreq*(double)SAMPLESINENUM)); |
pinofal | 1:ffc7a5d0f629 | 338 | bStop = false; // è stato inviato un comando, quindi bStop = False |
pinofal | 1:ffc7a5d0f629 | 339 | SampleOutTicker.attach(&SampleOut,fDeltaT); |
pinofal | 0:3106d3fc6696 | 340 | } |
pinofal | 0:3106d3fc6696 | 341 | |
pinofal | 0:3106d3fc6696 | 342 | if (cReadChar == 'z') // Stop |
pinofal | 0:3106d3fc6696 | 343 | { |
pinofal | 1:ffc7a5d0f629 | 344 | nPSK = 0; // nessuna PSK da generare |
pinofal | 1:ffc7a5d0f629 | 345 | pc.printf("\n\r--- Stop Generazione ---\n\r"); |
pinofal | 0:3106d3fc6696 | 346 | bStop=true; |
pinofal | 0:3106d3fc6696 | 347 | } |
pinofal | 1:ffc7a5d0f629 | 348 | //led.write(1); |
pinofal | 0:3106d3fc6696 | 349 | } // if (pc.readable()) |
pinofal | 0:3106d3fc6696 | 350 | |
pinofal | 0:3106d3fc6696 | 351 | |
pinofal | 0:3106d3fc6696 | 352 | // In base alla PSK selezionata, ci saranno diversi step da seguire |
pinofal | 0:3106d3fc6696 | 353 | switch (nPSK) |
pinofal | 0:3106d3fc6696 | 354 | { |
pinofal | 1:ffc7a5d0f629 | 355 | case 0: {} break; |
pinofal | 0:3106d3fc6696 | 356 | case 1: // PSK-I |
pinofal | 0:3106d3fc6696 | 357 | { |
pinofal | 0:3106d3fc6696 | 358 | // Avvia il primo step della PSK selezionata. Nello Step 0 non si ritornerà più |
pinofal | 0:3106d3fc6696 | 359 | if(nStep == 0) |
pinofal | 0:3106d3fc6696 | 360 | { |
pinofal | 1:ffc7a5d0f629 | 361 | //pc.printf("*** Avvio generazione ***\n\r"); |
pinofal | 0:3106d3fc6696 | 362 | nNewStep = 1; |
pinofal | 0:3106d3fc6696 | 363 | } |
pinofal | 0:3106d3fc6696 | 364 | // se è stato raggiunto il numero di campioni per la variazione di Step, aggiorna il numero di Step e modifica i parametri di generazione |
pinofal | 0:3106d3fc6696 | 365 | if(nStep != nNewStep) |
pinofal | 0:3106d3fc6696 | 366 | { |
pinofal | 0:3106d3fc6696 | 367 | // aggiorna il numero di Step e modifica i parametri di generazione |
pinofal | 0:3106d3fc6696 | 368 | nStep = nNewStep; |
pinofal | 0:3106d3fc6696 | 369 | switch (nStep) |
pinofal | 0:3106d3fc6696 | 370 | { |
pinofal | 0:3106d3fc6696 | 371 | case 1: |
pinofal | 0:3106d3fc6696 | 372 | { |
pinofal | 1:ffc7a5d0f629 | 373 | // invia il buffer di campioni relativi ad una intera generazione PSK con sfasamento totale di 360° |
pinofal | 1:ffc7a5d0f629 | 374 | pc.printf("%s", caTxPacket); // 50 caratteri |
pinofal | 1:ffc7a5d0f629 | 375 | |
pinofal | 0:3106d3fc6696 | 376 | // genera 23 periodi a 83.3 Hz |
pinofal | 0:3106d3fc6696 | 377 | //+++pc.printf("+++ 23 sinusoidi a 83,3Hz +++\n\r"); |
pinofal | 1:ffc7a5d0f629 | 378 | fDeltaT = double((double)T833/(double)SAMPLESINENUM); |
pinofal | 1:ffc7a5d0f629 | 379 | SampleOutTicker.attach(&SampleOut,fDeltaT); |
pinofal | 1:ffc7a5d0f629 | 380 | |
pinofal | 0:3106d3fc6696 | 381 | } break; |
pinofal | 0:3106d3fc6696 | 382 | case 2: |
pinofal | 0:3106d3fc6696 | 383 | { |
pinofal | 0:3106d3fc6696 | 384 | // dopo 23 periodi a 83.3 Hz, genera il primo Bridge |
pinofal | 0:3106d3fc6696 | 385 | //+++pc.printf("+++ Primo Bridge +++\n\r"); |
pinofal | 1:ffc7a5d0f629 | 386 | fDeltaT = (double)((double)T96/(double)(SAMPLESINENUM)); |
pinofal | 1:ffc7a5d0f629 | 387 | SampleOutTicker.attach(&SampleOut,fDeltaT); |
pinofal | 0:3106d3fc6696 | 388 | } break; |
pinofal | 0:3106d3fc6696 | 389 | case 3: |
pinofal | 0:3106d3fc6696 | 390 | { |
pinofal | 0:3106d3fc6696 | 391 | // dopo 23 periodi a 83.3 Hz, e un Bridge genera 15 sinusoidi a 83.3 Hz |
pinofal | 0:3106d3fc6696 | 392 | //+++pc.printf("+++ 15 sinusoidi a 83,3Hz +++\n\r"); |
pinofal | 1:ffc7a5d0f629 | 393 | fDeltaT = double((double)T833/(double)SAMPLESINENUM); |
pinofal | 1:ffc7a5d0f629 | 394 | SampleOutTicker.attach(&SampleOut, fDeltaT); |
pinofal | 0:3106d3fc6696 | 395 | } break; |
pinofal | 0:3106d3fc6696 | 396 | case 4: |
pinofal | 0:3106d3fc6696 | 397 | { |
pinofal | 0:3106d3fc6696 | 398 | // dopo 23 periodi a 83.3 Hz, Bridge e 15 periodi a 83.3 Hz, genera un bridge |
pinofal | 0:3106d3fc6696 | 399 | //+++pc.printf("+++ Secondo Bridge +++\n\r"); |
pinofal | 1:ffc7a5d0f629 | 400 | fDeltaT = (double)((double)T96/(double)(SAMPLESINENUM)); |
pinofal | 1:ffc7a5d0f629 | 401 | SampleOutTicker.attach(&SampleOut, fDeltaT); |
pinofal | 0:3106d3fc6696 | 402 | } break; |
pinofal | 0:3106d3fc6696 | 403 | case 5: |
pinofal | 0:3106d3fc6696 | 404 | { |
pinofal | 0:3106d3fc6696 | 405 | // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge, genera 7 periodi a 83.3Hz |
pinofal | 0:3106d3fc6696 | 406 | //+++pc.printf("+++ 7 Sinusoidi a 83.3Hz +++\n\r"); |
pinofal | 1:ffc7a5d0f629 | 407 | fDeltaT = double((double)T833/(double)SAMPLESINENUM); |
pinofal | 1:ffc7a5d0f629 | 408 | SampleOutTicker.attach(&SampleOut, fDeltaT); |
pinofal | 0:3106d3fc6696 | 409 | } break; |
pinofal | 0:3106d3fc6696 | 410 | case 6: |
pinofal | 0:3106d3fc6696 | 411 | { |
pinofal | 0:3106d3fc6696 | 412 | // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, genera bridge |
pinofal | 0:3106d3fc6696 | 413 | //+++pc.printf("+++ Terzo Bridge +++\n\r"); |
pinofal | 1:ffc7a5d0f629 | 414 | fDeltaT = (double)((double)T96/(double)(SAMPLESINENUM)); |
pinofal | 1:ffc7a5d0f629 | 415 | SampleOutTicker.attach(&SampleOut, fDeltaT); |
pinofal | 0:3106d3fc6696 | 416 | } break; |
pinofal | 0:3106d3fc6696 | 417 | case 7: |
pinofal | 0:3106d3fc6696 | 418 | { |
pinofal | 0:3106d3fc6696 | 419 | // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, bridge, genera 7 periodi a 83.3Hz |
pinofal | 0:3106d3fc6696 | 420 | //+++pc.printf("+++ 7 sinusoidi a 83.3Hz +++\n\r"); |
pinofal | 1:ffc7a5d0f629 | 421 | fDeltaT = double((double)T833/(double)SAMPLESINENUM); |
pinofal | 1:ffc7a5d0f629 | 422 | SampleOutTicker.attach(&SampleOut, fDeltaT); |
pinofal | 0:3106d3fc6696 | 423 | } break; |
pinofal | 0:3106d3fc6696 | 424 | case 8: |
pinofal | 0:3106d3fc6696 | 425 | { |
pinofal | 0:3106d3fc6696 | 426 | // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, bridge, 7 periodi a 83.3Hz, genera bridge |
pinofal | 0:3106d3fc6696 | 427 | //+++pc.printf("+++ Quarto Bridge +++\n\r"); |
pinofal | 1:ffc7a5d0f629 | 428 | fDeltaT = (double)((double)T96/(double)(SAMPLESINENUM)); |
pinofal | 1:ffc7a5d0f629 | 429 | SampleOutTicker.attach(&SampleOut, fDeltaT); |
pinofal | 0:3106d3fc6696 | 430 | } break; |
pinofal | 0:3106d3fc6696 | 431 | default: break; |
pinofal | 0:3106d3fc6696 | 432 | } //switch (nStep) |
pinofal | 0:3106d3fc6696 | 433 | } // if(nStep != nNewStep) |
pinofal | 0:3106d3fc6696 | 434 | } break; //case 1: |
pinofal | 0:3106d3fc6696 | 435 | default: {} break; |
pinofal | 0:3106d3fc6696 | 436 | } //switch (nPSK) |
pinofal | 0:3106d3fc6696 | 437 | } // while(true) |
pinofal | 0:3106d3fc6696 | 438 | } |
pinofal | 0:3106d3fc6696 | 439 | |
pinofal | 0:3106d3fc6696 | 440 | |
pinofal | 0:3106d3fc6696 | 441 | |
pinofal | 0:3106d3fc6696 | 442 | |
pinofal | 0:3106d3fc6696 | 443 | |
pinofal | 0:3106d3fc6696 | 444 | |
pinofal | 0:3106d3fc6696 | 445 | |
pinofal | 0:3106d3fc6696 | 446 | |
pinofal | 0:3106d3fc6696 | 447 | |
pinofal | 0:3106d3fc6696 | 448 | |
pinofal | 0:3106d3fc6696 | 449 | |
pinofal | 0:3106d3fc6696 | 450 | |
pinofal | 0:3106d3fc6696 | 451 | |
pinofal | 0:3106d3fc6696 | 452 |