Temperature Sampling

Dependencies:   mbed

Fork of Nucleo-DAC-Algorithm by Giuseppe Falagario

Revision:
1:ffc7a5d0f629
Parent:
0:3106d3fc6696
diff -r 3106d3fc6696 -r ffc7a5d0f629 main.cpp
--- a/main.cpp	Tue Jan 23 10:19:50 2018 +0000
+++ b/main.cpp	Tue Jan 30 16:30:54 2018 +0000
@@ -1,81 +1,103 @@
 #include "mbed.h"
 
-AnalogIn in(A0);
+AnalogIn InLocale(PA_6);
+AnalogOut OutLocale(PA_4);
+AnalogOut OutCampagna(PA_5);
 Serial pc(SERIAL_TX, SERIAL_RX);
 
 #if !DEVICE_ANALOGOUT
 #error You cannot use this example as the AnalogOut is not supported on this device.
 #else
+#endif
 
-AnalogOut OutLocale(PA_4);
-AnalogOut OutCampagna(PA_5);
-#endif
-// numero di campioni che compongono un periodo della sinusoide
-#define SAMPLENUM   360 // consigliabile avere  multipli di 180
+
+// Numero di periodi di sinusoide di cui è composto ciascuno step della PSK
+#define fPerStep1  23.0
+#define fPerStep2  1.25
+#define fPerStep3  15.0
+#define fPerStep4  1.25
+#define fPerStep5  7.0
+#define fPerStep6  1.25
+#define fPerStep7  7.0
+#define fPerStep8  1.25
+
+// numero di campioni che compongono un periodo della sinusoide in Output sull'ADC
+#define SAMPLESINENUM   45 // consigliabile avere  multipli di 45
+// numero di campioni generati durante una intera modulazione PSK. Nominalmente la somma del numero di periodi degli step è 57. 
+#define nNumPeriodi (fPerStep1 + fPerStep2 + fPerStep3 + fPerStep4 + fPerStep5 + fPerStep6 + fPerStep7 + fPerStep8)
+#define SAMPLEOUTNUM    (SAMPLESINENUM*nNumPeriodi)
+// numero di campioni acquisiti dall'ADC e che compongono l'array
+#define SAMPLEINNUM (SAMPLESINENUM*nNumPeriodi*2)+2   // contiene una intera onda (in Byte) generata con PSK, + 2 caratteri 
+
 // periodo in millisecondi della 83.3 Hz
 #define T833   (1/83.3) 
 // periodo in millisecondi della 50 Hz
 #define T50    (1/50.0)
 // periodo in millisecondi del Bridge tra le diverse fasi = 9,6 ms
 #define T96     (0.0096)
+// periodo di acquisizione dall'ADC
+#define TADC (0.0048) // impostato aper avere 3 campioni nel periodo di bridge (1.25 * 9.6 ms)
 // numero di campioni in 1/4 di periodo
-#define QUARTERSAMPLENUM SAMPLENUM/4
+#define QUARTERSAMPLEOUTNUM SAMPLESINENUM/4
+
 
 // parametri dell'onda coseno da generare
 #define PI        (3.141592653589793238462)
 #define AMPLITUDE 32767 //(1.0)    // x * 3.3V
-#define PHASE     (PI/2) // 2*pi is one period
-//#define RANGE     (1.0) //(0x7FFF)
+#define PHASE     (PI/2) // 2*pi è un periodo
 #define OFFSET    32767 //(0x7FFF)
 
-// Buffer contenente la sinusoide da porre in output.
-unsigned short usaSine[SAMPLENUM];
-
-//uint16_t usaBuffer[SAMPLENUM];
-
-void CalculateSinewave(void);
-
-
 // Output LED di diagnostica
 DigitalOut led(LED1);
 
-// ticker per la generazione dell'onda
-Ticker SampleTicker;
+// ticker per la generazione dell'onda con DAC
+Ticker SampleOutTicker;
+// ticker per l'acquisizione dell'onda con ADC
+//Ticker SampleInTicker;
+
+// Buffer contenente la sinusoide da porre in output.
+unsigned short usaSine[SAMPLESINENUM];
 
+// array con i dati acquisiti dall'ADC Locale
+//volatile unsigned short usaLocaleADC[SAMPLEINNUM];
+volatile char caTxPacket[(int)SAMPLEINNUM];
 
-// indice per i cicli
-int nIndex;
+// prototipo di funzione che genera i campioni della sinusoide da utilizzare per la generazione tramite DAC
+void CalculateSinewave(void);
+
 // carattere in arrivo dal PC
 volatile char cReadChar;
 // valore letto dall'ADC
 volatile unsigned short usReadADC;
-
+ 
 // Tipo di PSK da generare
 volatile int nPSK;
 // indice, nell'array, del campione da porre in output
-int nSampleIndex;
-// contatore dei campioni inviati
-int nSampleCount;
+volatile int nSampleOutIndex;
+// indice, nell'array, del campione acquisito in input
+volatile int nSampleInIndex;
+// contatore dei campioni in output sul DAC
+volatile int nSampleOutCount;
+// contatore dei campioni in input dall'ADC
+volatile int nSampleInCount;
 // Periodo di generazione campioni in output DeltaT = T/NumSample
 double fDeltaT;
 // amplificazione per il dato da spedire sull'ADC
 volatile double fAmp;
 //volatile double fAmpNew;
 // Step attuale e nuovo Step nella generazione di una PSK
-int nStep;
-int nNewStep;
-
-// ritardo tra un campione e l'altro della generazione ADC
-//volatile int nDelay;
-//variabile ausiliaria
+volatile int nStep;
+volatile int nNewStep;
+//variabili ausiliarie
 volatile unsigned short usAux;
-// variabili in cui memorizzare i prossimi valori da implementare
-//volatile int nDelayNew;
+volatile char cAux;
 // flag per bloccare la generazione del segnale
 volatile bool bStop;
 // frequenza segnale da generare
 volatile double fFreq;
 
+
+
 //****************************
 // Create the sinewave buffer
 //****************************
@@ -90,8 +112,8 @@
     // angolo per il quale bisogna calcolare il valore di sinusoide: fAngle = nIndex*DeltaF
     double fAngle;
     
-    fDeltaF = 360.0/SAMPLENUM;
-    for (nIndex = 0; nIndex < SAMPLENUM; nIndex++) 
+    fDeltaF = 360.0/SAMPLESINENUM;
+    for (nIndex = 0; nIndex < SAMPLESINENUM; nIndex++) 
     {
         fAngle = nIndex*fDeltaF; // angolo per il quale bisogna calcolare il campione di sinusoide
         fRads = (PI * fAngle)/180.0; // Convert degree in radian
@@ -101,11 +123,13 @@
 }
 
 
+
 //***************************
 // generazione sample da DAC
 //***************************
 void SampleOut() 
 {
+   
     
     // se è stato inviato il comando Stop, non fare niente fino a nuovo comando
     if(bStop)
@@ -114,80 +138,97 @@
     else // se non è stato inviato il comando di bStop continua
     {
         // output del campione della forma d'onda
-        //usAux=(usaSine[nSampleIndex])/fAmp;
-        //usAux=usaSine[nSampleIndex];
-        OutLocale.write_u16(usaSine[nSampleIndex]);
-        OutCampagna.write_u16(usaSine[nSampleIndex]);
+        //usAux=(usaSine[nSampleOutIndex])/fAmp;
+        //usAux=usaSine[nSampleOutIndex];
+        OutLocale.write_u16(usaSine[nSampleOutIndex]);
+        OutCampagna.write_u16(usaSine[nSampleOutIndex]);
+        
+        // incrementa l'indice del campione in output, modulo NUMSAMPLE: se NUMSAMPLE è 360, nSampleOutIndex va da 0 a 359
+        nSampleOutIndex++;
+        if(nSampleOutIndex >= SAMPLESINENUM) 
+        {
+            nSampleOutIndex=0; 
+        }
         
-        // incrementa l'indice del campione in output, modulo NUMSAMPLE: se NUMSAMPLE è 360, nSAmpleIndex va da 0 a 359
-        nSampleIndex++;
-        if(nSampleIndex >= SAMPLENUM) 
-        {
-            nSampleIndex=0; 
-        }
+        // acquisisce dato da ADC
+        usReadADC = InLocale.read_u16();
+        // prepara il pacchetto di dati acquisiti  da restituire al PC
+        caTxPacket[nSampleInCount]= (char)(usReadADC&0xFF);
+        //+++caTxPacket[nSampleInCount]= 'a';
+        nSampleInCount++;
+        caTxPacket[nSampleInCount] = (char)((usReadADC>>8)&0xFF);
+        //++++caTxPacket[nSampleInCount]= 'b';
+        
         // incrementa il numero di campioni inviati, e individua la fase in cui ci si trova, relativamente alla modulazione PSK selezionata
-        nSampleCount++;
-        //pc.printf(" nSampleIndex= %3d ; nSampleCount= %5d ; nPSK = % 1d ; nNewStep = %1d \n\r",nSampleIndex, nSampleCount, nPSK, nNewStep);
+        nSampleOutCount++;
+        nSampleInCount = nSampleOutCount*2;
         
+                
         switch(nPSK)
         {
+            case 0: 
+            {
+                // in questo caso sto generando sinusoidi a frequenza fissa, senza PSK; reinizializza gli indici degli array di campioni acquisiti e generati
+                if(nSampleOutCount >= SAMPLEOUTNUM) // nSampleInCount è sempre pari a nSampleOutCount*2
+                {
+                    nSampleOutCount=0;
+                }
+            } break;
             case 1:
             {
-                switch(nSampleCount)
+                switch(nSampleOutCount)
                 {
-                    case 0: //if(nSampleCount == 0) // dopo il ciclo completo, si ritorna allo step 1
+                    case 0: //if(nSampleOutCount == 0) // dopo il ciclo completo, si ritorna allo step 1
                     {
                         nNewStep = 1; // genera 23 periodi di sinusoide
                         //pc.printf(" nStep = %1d \n\r",nNewStep);
                     } break;
-                    case (23*SAMPLENUM): //if(nSampleCount == (23*SAMPLENUM)) // dopo 23 periodi a 83.3 Hz, passa allo step 2 in cui genera il primo Bridge
+                    case (fPerStep1*SAMPLESINENUM): //if(nSampleOutCount == (23*SAMPLESINENUM)) // dopo 23 periodi a 83.3 Hz, passa allo step 2 in cui genera il primo Bridge
                     {
                         nNewStep = 2; // genera Bridge
                         //pc.printf(" nStep = %1d \n\r",nNewStep);
                     } break;
-                    case (24.25*SAMPLENUM): //if(nSampleCount == ((23*SAMPLENUM)+(1.25*SAMPLENUM))) // dopo 23 periodi a 83.3 Hz, e un Bridge genera 15 sinusoidi a 83.3 Hz
+                    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
                     {
                         nNewStep = 3; // genera 15 periodi di sinusoide
                         //pc.printf(" nStep = %1d \n\r",nNewStep);
                     }
-                    case (39.25*SAMPLENUM): //if(nSampleCount == ((23*SAMPLENUM)+(1.25*SAMPLENUM)+(15*SAMPLENUM))) // dopo 23 periodi a 83.3 Hz, Bridge e 15 periodi a 83.3 Hz, genera un bridge
+                    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
                     {
                         nNewStep = 4; // Genera Bridge
                         //pc.printf(" nStep = %1d \n\r",nNewStep);
                     } break;
-                    case (40.5*SAMPLENUM): //if(nSampleCount == ((23*SAMPLENUM)+(1.25*SAMPLENUM)+(15*SAMPLENUM)+(1.25*SAMPLENUM))) // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge, genera 7 periodi a 83.3Hz
+                    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
                     {
                         nNewStep = 5; // genera 7 periodi di sinusoide
                         //pc.printf(" nStep = %1d \n\r",nNewStep);
                     } break;
-                    case (47.5*SAMPLENUM):  //if(nSampleCount == ((23*SAMPLENUM)+(1.25*SAMPLENUM)+(15*SAMPLENUM)+(1.25*SAMPLENUM)+(7*SAMPLENUM))) // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, genera bridge
+                    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
                     {
                         nNewStep = 6; // Genera Bridge
                         //pc.printf(" nStep = %1d \n\r",nNewStep);
                     } break;
-                    case (48.75*SAMPLENUM): //if(nSampleCount == ((23*SAMPLENUM)+(1.25*SAMPLENUM)+(15*SAMPLENUM)+(1.25*SAMPLENUM)+(7*SAMPLENUM)+(1.25*SAMPLENUM))) // 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
+                    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
                     {
                         nNewStep = 7; // genera 7 periodi di sinusoide
                         //pc.printf(" nStep = %1d \n\r",nNewStep);
                     } break;
-                    case (55.75*SAMPLENUM): //if(nSampleCount == ((23*SAMPLENUM)+(1.25*SAMPLENUM)+(15*SAMPLENUM)+(1.25*SAMPLENUM)+(7*SAMPLENUM)+(1.25*SAMPLENUM)+(7*SAMPLENUM))) // 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
+                    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
                     {
                         nNewStep =8; // genera bridge
                         //pc.printf(" nStep = %1d \n\r",nNewStep);
                     } break;
-                    case (57*SAMPLENUM): //if(nSampleCount == ((23*SAMPLENUM)+(1.25*SAMPLENUM)+(15*SAMPLENUM)+(1.25*SAMPLENUM)+(7*SAMPLENUM)+(1.25*SAMPLENUM)+(7*SAMPLENUM)+(1.25*SAMPLENUM))) // 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    
+                    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    
                     {
                         nNewStep =1;
-                        nSampleCount =0;
+                        nSampleOutCount =0;
                         //pc.printf(" nStep = %1d \n\r",nNewStep);
                     } break;
                     default: {} break;
                 }    
             } break;
-            default: break;
-        }  
-             
-        //led = !led;
+            default:{} break;
+        }
     }
 }
 
@@ -199,26 +240,37 @@
  //*******************  
 int main()
 {
+    // indice per i cicli
+    int nIndex;
+    
     // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto
     pc.baud(921600); //921600 bps
+    //pc.baud(256000); //256000 bps
     pc.printf("*** SineWave Generation ***\n\r");
     
     //inizializza variabili
+    nSampleInIndex =0;
     fAmp = 1.0;
     cReadChar = 0;
-    nSampleIndex=0;
-    nSampleCount=0;
+    nSampleOutIndex=0;
+    nSampleOutCount=0;
     nPSK =0;
     bStop= false;
     fFreq = 83.3;
+    for(nIndex =0; nIndex < SAMPLEINNUM; nIndex++)
+    {
+        caTxPacket[nIndex]='\0';
+    }
     
+    
+    
+        
     // genera sinusoide
-    CalculateSinewave(32767, 32767, (PI/2.0));
-        
+    //+++SampleInTicker.attach(&SampleIn,TADC);  // Ticker di acquisizione dall'ADC  
     // avvia il ciclo di generazione sinusoide
     while(true) 
     {
-                        
+                             
         // verifica se è arrivato un carattere dalla seriale del PC
         if(pc.readable())
         {
@@ -227,69 +279,86 @@
             
             if(cReadChar == '1') // genera sinusoide a 83.3Hz con ampiezza ridotta a metà della nominale
             {
-                pc.printf("--- Selezionato PSK-I ---\n\r");
+                pc.printf("\n\r--- Selezionato PSK-I ---\n\r");
                 bStop = false; // è stato inviato un comando, quindi bStop = False
                 nPSK = 1;
                 fAmp = 1.0;
-                nSampleIndex=0;
-                nSampleCount=0;
+                nSampleOutIndex=0;
+                nSampleOutCount=0;
+                // generazione della sinusoide con valori nominali
+                CalculateSinewave(32767, 32767, (PI/2.0));
                 nStep = 0; // inizializza lo step che sarà aggiornato nella routine di generazione campione
                 //fAmpNew = 1.0;
-                //fDeltaT= T833/SAMPLENUM; // frequenza di generazione iniziale
+                //fDeltaT= T833/SAMPLEOUTNUM; // frequenza di generazione iniziale
             }    
             if (cReadChar == 'a') // genera sinusoide a 83.3Hz con ampiezza nominale
             {
-                fFreq = 83.3;
-                pc.printf("--- Generazione %.1f Hz ampiezza nominale ---\n\r", fFreq);
-                bStop = false; // è stato inviato un comando, quindi bStop = False                
+                bStop = true;
                 nPSK = 0; // nessuna PSK da generare
+                fFreq = 83.3;
+                pc.printf("\n\r--- Generazione %.1f Hz ampiezza nominale ---\n\r", fFreq);
+                //nSampleOutIndex=0;
+                //nSampleOutCount=0;
                 fAmp = 1.0;
-                fDeltaT = 1.0/(fFreq*SAMPLENUM);
-                SampleTicker.attach(&SampleOut,fDeltaT);
+                // generazione della sinusoide con valori nominali
+                CalculateSinewave(32767, 32767, (PI/2.0));
+                fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
+                bStop = false;
+                SampleOutTicker.attach(&SampleOut,fDeltaT);
             }
             if (cReadChar == 'b') // genera sinusoide a 50 Hz con ampiezza ridotta a metà della nominale
             {
-               fFreq = 50.0;
-               pc.printf("--- Generazione %.1f Hz ampiezza 1/2 della nominale ---\n\r", fFreq);
-               nPSK = 0; // nessuna PSK da generare
-               fAmp = 1.0;
-               // genera sinusoide
-               CalculateSinewave(32767, (32767/2), (PI/2.0));
-               // attach ticker
-               fDeltaT = 1.0/(fFreq*SAMPLENUM);
-               SampleTicker.attach(&SampleOut,fDeltaT);
+                bStop = true;
+                nPSK = 0; // nessuna PSK da generare
+                fFreq = 50.0;
+                pc.printf("\n\r--- Generazione %.1f Hz ampiezza 1/2 della nominale ---\n\r", fFreq);
+                //nSampleOutIndex=0;
+                //nSampleOutCount=0;
+                fAmp = 1.0;
+                // genera sinusoide
+                CalculateSinewave(32767, (32767/2), (PI/2.0));
+                // attach ticker
+                fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
+                bStop = false;
+                SampleOutTicker.attach(&SampleOut,fDeltaT);
             }
             if (cReadChar == 'c') // genera sinusoide a 45 Hz con ampiezza ridotta a 1/4 del valore nominale
             {
-               fFreq = 45.0;
-               pc.printf("--- Generazione %.1f Hz ampiezza 1/4 della nominale ---\n\r", fFreq);
-               nPSK = 0; // nessuna PSK da generare
-               fAmp = 1.0;
-               // genera sinusoide
-               CalculateSinewave(32767, (32767/4), (PI/2.0));
-               // attach ticker
-               fDeltaT = 1.0/(fFreq*SAMPLENUM);
-               SampleTicker.attach(&SampleOut,fDeltaT);
+                bStop = true;
+                nPSK = 0; // nessuna PSK da generare
+                fFreq = 45.0;
+                pc.printf("\n\r--- Generazione %.1f Hz ampiezza 1/4 della nominale ---\n\r", fFreq);
+                //nSampleOutIndex=0;
+                //nSampleOutCount=0;
+                fAmp = 1.0;
+                // genera sinusoide
+                CalculateSinewave(32767, (32767/4), (PI/2.0));
+                // attach ticker
+                fDeltaT = (double)(1.0/((double)fFreq*(double)SAMPLESINENUM));
+                bStop = false; // è stato inviato un comando, quindi bStop = False     
+                SampleOutTicker.attach(&SampleOut,fDeltaT);
             }
             
             if (cReadChar == 'z') // Stop
             {
-                pc.printf("--- Stop Generazione ---\n\r");
+                nPSK = 0; // nessuna PSK da generare
+                pc.printf("\n\r--- Stop Generazione ---\n\r");
                 bStop=true;
             }
-            led.write(1);
+            //led.write(1);
         }  // if (pc.readable())
         
                                                     
         // In base alla PSK selezionata, ci saranno diversi step da seguire
         switch (nPSK)
         {
+            case 0: {} break;
             case 1: // PSK-I
             {
                 // Avvia il primo step della PSK selezionata. Nello Step 0 non si ritornerà più
                 if(nStep == 0)
                 {
-                    pc.printf("*** Avvio generazione ***\n\r");
+            //pc.printf("*** Avvio generazione ***\n\r");
                     nNewStep = 1;
                 }
                 // se è stato raggiunto il numero di campioni per la variazione di Step, aggiorna il numero di Step e modifica i parametri di generazione
@@ -301,59 +370,63 @@
                     {
                         case 1:
                         {
+                            // invia il buffer di campioni relativi ad una intera generazione PSK con sfasamento totale di 360°
+                            pc.printf("%s", caTxPacket); // 50 caratteri
+
                             // genera 23 periodi a 83.3 Hz
                             //+++pc.printf("+++ 23 sinusoidi a 83,3Hz +++\n\r");
-                            fDeltaT = double((double)T833/(double)SAMPLENUM);
-                            SampleTicker.attach(&SampleOut,fDeltaT);
+                            fDeltaT = double((double)T833/(double)SAMPLESINENUM);
+                            SampleOutTicker.attach(&SampleOut,fDeltaT);
+                                                         
                         } break;
                         case 2:
                         {
                             // dopo 23 periodi a 83.3 Hz, genera il primo Bridge
                             //+++pc.printf("+++ Primo Bridge +++\n\r");
-                            fDeltaT = (double)((double)T96/(double)(SAMPLENUM));
-                            SampleTicker.attach(&SampleOut,fDeltaT);
+                            fDeltaT = (double)((double)T96/(double)(SAMPLESINENUM));
+                            SampleOutTicker.attach(&SampleOut,fDeltaT);
                         } break;   
                         case 3:
                         {
                             // dopo 23 periodi a 83.3 Hz, e un Bridge genera 15 sinusoidi a 83.3 Hz
                             //+++pc.printf("+++ 15 sinusoidi a 83,3Hz +++\n\r");
-                            fDeltaT = double((double)T833/(double)SAMPLENUM);
-                            SampleTicker.attach(&SampleOut, fDeltaT);
+                            fDeltaT = double((double)T833/(double)SAMPLESINENUM);
+                            SampleOutTicker.attach(&SampleOut, fDeltaT);
                         } break;
                         case 4:
                         {
                             // dopo 23 periodi a 83.3 Hz, Bridge e 15 periodi a 83.3 Hz, genera un bridge
                             //+++pc.printf("+++ Secondo Bridge +++\n\r");
-                            fDeltaT = (double)((double)T96/(double)(SAMPLENUM));
-                            SampleTicker.attach(&SampleOut, fDeltaT);
+                            fDeltaT = (double)((double)T96/(double)(SAMPLESINENUM));
+                            SampleOutTicker.attach(&SampleOut, fDeltaT);
                         } break;
                         case 5:
                         {
                             // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge, genera 7 periodi a 83.3Hz
                             //+++pc.printf("+++ 7 Sinusoidi a 83.3Hz +++\n\r");
-                            fDeltaT = double((double)T833/(double)SAMPLENUM);
-                            SampleTicker.attach(&SampleOut, fDeltaT);
+                            fDeltaT = double((double)T833/(double)SAMPLESINENUM);
+                            SampleOutTicker.attach(&SampleOut, fDeltaT);
                         } break;
                         case 6:
                         {
                             // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, genera bridge
                             //+++pc.printf("+++ Terzo Bridge +++\n\r");
-                            fDeltaT = (double)((double)T96/(double)(SAMPLENUM));
-                            SampleTicker.attach(&SampleOut, fDeltaT);
+                            fDeltaT = (double)((double)T96/(double)(SAMPLESINENUM));
+                            SampleOutTicker.attach(&SampleOut, fDeltaT);
                         } break;
                         case 7:
                         {
                             // 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
                             //+++pc.printf("+++ 7 sinusoidi a 83.3Hz +++\n\r");
-                            fDeltaT = double((double)T833/(double)SAMPLENUM);
-                            SampleTicker.attach(&SampleOut, fDeltaT);
+                            fDeltaT = double((double)T833/(double)SAMPLESINENUM);
+                            SampleOutTicker.attach(&SampleOut, fDeltaT);
                         } break;
                         case 8:
                         {
                             // 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
                             //+++pc.printf("+++ Quarto Bridge +++\n\r");
-                            fDeltaT = (double)((double)T96/(double)(SAMPLENUM));
-                            SampleTicker.attach(&SampleOut, fDeltaT);
+                            fDeltaT = (double)((double)T96/(double)(SAMPLESINENUM));
+                            SampleOutTicker.attach(&SampleOut, fDeltaT);
                         } break;
                         default: break;
                     } //switch (nStep)