Temperature Sampling

Dependencies:   mbed

Fork of Nucleo-DAC-Algorithm by Giuseppe Falagario

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?

UserRevisionLine numberNew 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