Wireless rotating thermocouple project

Mesure de température embarquée sur un système tournant



Nouvelle VERSION V4, avril 2008 : Conditionneur MAX6675 et transmetteur Bluetooth



Version 2 :

Présentation :

Ce projet conciste en la transmission à distance de mesures de température sur une partie tournante d'un banc machine (rotor d'une machine asynchrone).
Nous utilisons un microcontrôleur dsPIC 30F3010 de chez Microchip comme système numérique, aussi bien pour le transmetteur que pour le récepteur.

mots clefs : microcontrôleur dspic 30F3010, conditionneur de thermocouple MAX 6675, interface USB MAX 3420e, régulateur de tension MAX 1792, liaison série UART MAX 3233e, debugage via PocketPC, capture des données logiciel écrit sous Borland C++ BDS.


Partie transmission : thermocouple_TX :
La mesure de température se fait à l'aide de thermocouples de type-K puis le signal est conditionné et numérisé à l'aide du composant MAX 6675.
Ce composant permet de compenser la soudure froide et offre une plage de mesure de 0°C à +1024°C.
Ensuite la conversion en numérique se fait grâce à un ADC 12-Bits offrant une résolution de 0.25°C.
Le signal est envoyé au microcontrôleur via le port SPI (Interface série synchrone) sur demande du microcontrôleur dspic.

Ces 4 mesures de température ainsi qu'un signal indicateur du temps (time stamp) sont envoyé sur la liaison série UART au MAX3233 pour être disponible sur une RS232 (utilisé à des fins de debuggage).
Le time stamp et les mesures de température sont également envoyés via la SPI au transmetteur HF RF24G. Il est à base du composant Nordic nRF2401.


Transmetteur, il doit être embarqué sur le rotor de machine asynchrone

Transmetteur, il doit être embarqué sur le rotor de machine asynchrone



Configuration de la SPI à 2.5 MHz pour la communication avec le MAX6675 et le nRF2401 (RF24G) :
   
  1. //-----------------------------------------------------------------------------
  2. //  intitialise SPI pour MAX6675 et pour RF24G
  3. //-----------------------------------------------------------------------------
  4. void InitSPI()
  5. {
  6.   Sensor0_CS = 1;         // Set SPI CS pin des Sensors MAX6675 à high : donc non actif
  7.   Sensor1_CS = 1;         // Set SPI CS pin des Sensors MAX6675 à high : donc non actif
  8.   Sensor2_CS = 1;         // Set SPI CS pin des Sensors MAX6675 à high : donc non actif
  9.   Sensor3_CS = 1;         // Set SPI CS pin des Sensors MAX6675 à high : donc non actif
  10.   RF24G_CS = 0;      // Set RF24G_CS pin du RF24G à 0 : donc non actif
  11.   RF24G_CE = 0;      // Set RF24G_CE pin du RF24G à 0 : donc non actif => en VEILLE
  12.   SPI1CON = 0x0423;  // Master mode, SCK = Fcy/8 = 2.5 MHz, CKP=0, CKE=0, Clk idle is low, 16 bits
  13.   SPI1STAT = 0x8000;  // Enable SPI port
  14. }



protocole SPI du MAX6675

Lecture via la SPI des données provenant du MAX6675 :
   
  1. //------------------------------------------------------------------------
  2. // Read the Data from the Sensor MAX6675
  3. inline unsigned int ReadSensor(unsigned int SensorNum)
  4. {
  5. unsigned int uidummy;
  6. InfoLED=1;
  7.   switch (SensorNum)
  8.     {// Desacive le Sensor via le /CS
  9.     case 0 :  Sensor0_CS=1break;
  10.     case 1 :  Sensor1_CS=1break;
  11.     case 2 :  Sensor2_CS=1break;
  12.     case 3 :  Sensor3_CS=1break;
  13.     }         
  14.   SPI1STATbits.SPIROV = 0;      // Clear overflow flag
  15.  
  16.   uidummy=SPI1BUF;              // Read buffer to avoid overflow
  17.  
  18.   switch (SensorNum)
  19.     {// Acive la reception du Sensor via le /CS, il commence à envoyer
  20.     case 0 :  Sensor0_CS=0break;
  21.     case 1 :  Sensor1_CS=0break;
  22.     case 2 :  Sensor2_CS=0break;
  23.     case 3 :  Sensor3_CS=0break;
  24.     }         
  25.   SPI1BUF=0x0000;     // Dummy Write to the output to start the reception !
  26.   // Wait for transmission to begin and for Reception to complete
  27.   while (SPI1STATbits.SPITBF)while ( !SPI1STATbits.SPIRBF);
  28.   uidummy=SPI1BUF;                    // Get the Tre of Sensor(SensorNum)
  29.  
  30.   switch (SensorNum)
  31.     {// Desacive le Sensor via le /CS
  32.     case 0 :  Sensor0_CS=1break;
  33.     case 1 :  Sensor1_CS=1break;
  34.     case 2 :  Sensor2_CS=1break;
  35.     case 3 :  Sensor3_CS=1break;
  36.     }  
  37. InfoLED=0;
  38.   return uidummy;       
  39. }





Transmetteur avec le thermocouple type-K



Les mesures de température sont envoyés via la SPI au transmetteur HF RF24G (Nordic nRF2401) :
   
  1. //---------------------------------------------------------------------
  2. // Envoie des donnees au RF24G, en burstmode
  3. //---------------------------------------------------------------------
  4. void SendDataRF()
  5. {
  6. unsigned int uidummy, j;
  7. //    SPI1CON = 0x002E;  // Master mode, SCK = Fcy/5/4 = 1.0 MHz |1110), CKP=0, CKE=0, Clk idle is low, 8 bits
  8.   SPI1CON = 0x012E;  // Master mode, SCK = Fcy/5/4 = 1.0 MHz |1110), CKP=0,  CKE=1, Clk idle is low, 8 bits
  9.   RF24G_CS = 0; RF24G_CE = 1;  // Set RF24G Active RX/TX mode
  10. // debug introduire 5 us de delais !
  11.     // perd 5 us    // Tcs2data
  12.     for (j=0; j<20; j++)    __builtin_nop();
  13.     // debug, verif delais à l oscillo
  14.  
  15.   SPI1STATbits.SPIROV = 0;            // Clear overflow flag
  16.   uidummy = SPI1BUF; SPI1BUF=0xE7;  while (SPI1STATbits.SPITBF)while ( !SPI1STATbits.SPIRBF);    // Send l adresse du Channel1   40 bits
  17.   uidummy = SPI1BUF; SPI1BUF=0xE7;  while (SPI1STATbits.SPITBF)while ( !SPI1STATbits.SPIRBF);   
  18.   uidummy = SPI1BUF; SPI1BUF=0xE7;  while (SPI1STATbits.SPITBF)while ( !SPI1STATbits.SPIRBF);   
  19.   uidummy = SPI1BUF; SPI1BUF=0xE7;  while (SPI1STATbits.SPITBF)while ( !SPI1STATbits.SPIRBF);   
  20.   uidummy = SPI1BUF; SPI1BUF=0xE7;  while (SPI1STATbits.SPITBF)while ( !SPI1STATbits.SPIRBF);   
  21.  
  22.   uidummy = SPI1BUF; SPI1BUF= TimeStamp  & 0xFF;      while (SPI1STATbits.SPITBF)while ( !SPI1STATbits.SPIRBF)// Send le Hi
  23.   uidummy = SPI1BUF; SPI1BUF=(TimeStamp>> 8) & 0xFF;  while (SPI1STATbits.SPITBF)while ( !SPI1STATbits.SPIRBF)// Send le low
  24.   uidummy = SPI1BUF; SPI1BUF= Sensor0_T  & 0xFF;      while (SPI1STATbits.SPITBF)while ( !SPI1STATbits.SPIRBF)// Send le Hi
  25.   uidummy = SPI1BUF; SPI1BUF=(Sensor0_T>> 8) & 0xFF;  while (SPI1STATbits.SPITBF)while ( !SPI1STATbits.SPIRBF)// Send le low
  26.   uidummy = SPI1BUF; SPI1BUF= Sensor1_T  & 0xFF;      while (SPI1STATbits.SPITBF)while ( !SPI1STATbits.SPIRBF)// Send le Hi
  27.   uidummy = SPI1BUF; SPI1BUF=(Sensor1_T>> 8) & 0xFF;  while (SPI1STATbits.SPITBF)while ( !SPI1STATbits.SPIRBF)// Send le low
  28.   uidummy = SPI1BUF; SPI1BUF= Sensor2_T  & 0xFF;      while (SPI1STATbits.SPITBF)while ( !SPI1STATbits.SPIRBF)// Send le Hi
  29.   uidummy = SPI1BUF; SPI1BUF=(Sensor2_T>> 8) & 0xFF;  while (SPI1STATbits.SPITBF)while ( !SPI1STATbits.SPIRBF)// Send le low
  30.   uidummy = SPI1BUF; SPI1BUF= Sensor3_T  & 0xFF;      while (SPI1STATbits.SPITBF)while ( !SPI1STATbits.SPIRBF)// Send le Hi
  31.   uidummy = SPI1BUF; SPI1BUF=(Sensor3_T>> 8) & 0xFF;  while (SPI1STATbits.SPITBF)while ( !SPI1STATbits.SPIRBF)// Send le low
  32.  
  33. // introduire 5 us de delais !  Tcs2data
  34.     for (j=0; j<20; j++)    __builtin_nop();
  35.   RF24G_CS = 0; RF24G_CE = 0;  // Set RF24G non actif => en VEILLE
  36. // remet comme c était, pour le MAX6675 / thermocouple
  37. // ici : la même freq SPI donc inutile de : SPI1CON = 0x0423;    // Master mode, SCK = Fcy/8 = 2.5 MHz, CKP=0, CKE=0, Clk idle is low, 16 bits
  38. }






Partie réception : thermocouple_RX :



Récepteur, complet




comming.......... soon







Partie récepteur, écran LCD (compatible Nokia 3310) pour la visualisation du résultat





Récepteur, partie dspic, interface USB (MAX3420E), récepteur nRF24L01 et son antenne









Anciennes versions, prototypage et tests :

Carte d'envoi : thermocouple_tx

Carte d'envoi : thermocouple_tx



Vérification par liaison série des températures mesurées sur la carte thermocouple_tx

Vérification par liaison série des températures mesurées sur la carte thermocouple_tx



Carte de réception : carte thermocouple_rx

Carte de réception : carte thermocouple_rx



Signaux récupérés par la carte thermocouple_rx

Signaux récupérés par la carte thermocouple_rx



Visualisation par liaison série des signaux reçus

Visualisation par liaison série des signaux reçus






Under construction (30/06/2007) revenez plus tard...



Download executable and sources.
Download :
DataCapture.zip   Logiciel d'acquisition dédié à la carte thermcouple_rx.


Back to homepage

Last update : 04/03/2007