Wireless rotating thermocouple project

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


Version 4 :

Présentation :

Ce projet consiste en la transmission à distance de mesures de température sur une partie tournante d'un banc machine (rotor d'une machine asynchrone).
Cette version ne comporte que la partie transmission basé sur un module Bluetooth RN41. La réception se fait sur un PC équipé d'un module Bluetooth (clef USB BT ou intégré).
Nous utilisons un microcontrôleur dsPIC 30F3010 de chez Microchip comme système numérique pour le traitement.

mots clefs : microcontrôleur dspic 30F3010, conditionneur de thermocouple MAX 6675, capture des données logiciel écrit sous CodeGear C++ 2007.


Thermocouple_V4 :
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 module (BT) Bluetooth RN41 afin d'être transmis en profil SPP.


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


Détail sur le module Bluetooth
Détail sur le module Bluetooth


Détail sur le dspic et les conditionneurs numériques (MAX 6675) de thermocouple Type K
Détail sur le dspic et les conditionneurs numériques (MAX 6675) de thermocouple Type K






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.   SPI1CON = 0x0423;  // Master mode, SCK = Fcy/8 = 2.5 MHz, CKP=0, CKE=0, Clk idle is low, 16 bits
  11.   SPI1STAT = 0x8000;  // Enable SPI port
  12. }



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. }



Les mesures de température sont envoyés par liaison série via l'UART au module BT RN41 :
   
  1. unsigned char OutData[] = {"$TS=0000 S0=0000 S1=0000 S2=0000 S3=0000 SR0=0000.00\r"};
  2. #define OffsetTimeStamp  4        // offset in OutData : position de la val de TimeStamp
  3. #define OffsetSensor0_T 12        // offset in OutData : position de la val de Sensor0_T
  4. #define OffsetSensor1_T 20        // offset in OutData : position de la val de Sensor1_T
  5. #define OffsetSensor2_T 28        // offset in OutData : position de la val de Sensor2_T
  6. #define OffsetSensor3_T 36        // offset in OutData : position de la val de Sensor3_T
  7. #define OffsetSensor0_Tr 45    // offset in OutData : position de la val de Sensor0_Tr
  8. int SeqComm;   
  9. //#define SeqCommMax 5000   // ttes les 1 s
  10. //#define SeqCommMax 2500     // combien de fois pour ariver en Te=0.50s avec des pas de 200us :
  11. #define SeqCommMax 1250     // combien de fois pour ariver en Te=0.25s avec des pas de 200us :
  12.  
  13.  
  14.  
  15.  
  16. //----------------------------------------------------
  17. // Convertit un "Word" hexa en "4 chars Hexadécimaux"
  18. // et les sort sur la table en memoire
  19. //----------------------------------------------------
  20. inline void ConvHexa(int Var, int tablePos, unsigned char * table)
  21. { 
  22. int tmp;
  23.       tmp=Var & 0x000F;
  24.       if (tmp<=9)  tmp+=0x30;
  25.           else      tmp+=0x37;
  26.       table[tablePos+3]=tmp;
  27.  
  28.       tmp=Var>>4 & 0x000F;
  29.       if (tmp<=9)  tmp+=0x30;
  30.           else      tmp+=0x37;
  31.       table[tablePos+2]=tmp;
  32.  
  33.       tmp=Var>>8 & 0x000F;
  34.       if (tmp<=9)  tmp+=0x30;
  35.           else      tmp+=0x37;
  36.       table[tablePos+1]=tmp;
  37.  
  38.       tmp=Var>>12 & 0x000F;
  39.       if (tmp<=9)  tmp+=0x30;
  40.           else      tmp+=0x37;
  41.       table[tablePos]=tmp;
  42. }
  43. //----------------------------------------------------
  44. // Convertit un "12 bits" en "4 chars décimaux. 2 chars" xxxx.xx
  45. // maximum : 1023.75 pour 12 bits
  46. // et les sort sur la table en memoire
  47. //----------------------------------------------------
  48. inline void ConvDec(int Var, int tablePos, unsigned char * table)
  49. { 
  50. unsigned int k;
  51. unsigned char c;
  52. // Char
  53.   k = Var>>2;
  54.   c = k/1000;
  55.   if (c > 0)
  56.     k = k - c*1000;
  57.   table[tablePos]  =(c + 0x30);
  58.   c = k/100;
  59.   if (c > 0)
  60.     k = k - c*100;
  61.   table[tablePos+1]=(c + 0x30);
  62.   c = k/10;
  63.   if (c > 0)
  64.     k = k - c*10;
  65.   table[tablePos+2]=(c + 0x30);
  66.   table[tablePos+3]=(char)(k + 0x30);
  67.   // apres la virgule :
  68.   switch (Var & 0x03)
  69.     {
  70.     case 0 :  table[tablePos+5]=0x30;  // xxxx.00
  71.               table[tablePos+6]=0x30; break;
  72.     case 1 :  table[tablePos+5]=0x32;  // xxxx.25
  73.               table[tablePos+6]=0x35; break;
  74.     case 2 :  table[tablePos+5]=0x35;  // xxxx.50
  75.               table[tablePos+6]=0x30; break;
  76.     case 3 :  table[tablePos+5]=0x37;  // xxxx.75
  77.               table[tablePos+6]=0x35; break;
  78.     }
  79. }
  80. //-----------------------------------------------------------------------------
  81. void SendMsg(void)
  82. {
  83. while (*TXPtr)
  84.   {
  85.   while (U1STAbits.UTXBF);
  86.   U1TXREG = *TXPtr++;
  87.   }
  88. }
  89. //------------------------------------------------------------------------
  90. // SendData sends the debug information on the uart at 19200 baud
  91. void SendData()
  92. {
  93. // Codage ASCII de la donnée hexa
  94.   ConvHexa( TimeStamp, OffsetTimeStamp, OutData);    // TimeStamp en Hexa
  95.   ConvHexa( Sensor0_T, OffsetSensor0_T, OutData);    // Sensor0_T en Hexa
  96.   ConvHexa( Sensor1_T, OffsetSensor1_T, OutData);    // Sensor1_T en Hexa
  97.   ConvHexa( Sensor2_T, OffsetSensor2_T, OutData);    // Sensor2_T en Hexa
  98.   ConvHexa( Sensor3_T, OffsetSensor3_T, OutData);    // Sensor3_T en Hexa
  99.  
  100.   Sensor0_Tr=(Sensor0_T >> 3) & 0xFFF;
  101.   ConvDec( Sensor0_Tr, OffsetSensor0_Tr, OutData);        // Sensor0_T en Decimal
  102.  
  103.   TXPtr = &OutData[0];
  104.   SendMsg();
  105. }


commdspic.zip   Logiciel d'acquisition dédié.
Il permet d'afficher les valeurs des température au maximum de la période d'échantillonage (0.25 s)
et de capturer dans un fichier de données texte, formaté pour Excel.



Exemple de capture de température
Exemple de capture de température.
Mesure à la sortie de la buse de ventilation d'un PC portable !




Download executable and sources.
Download :
commdspic.zip   Logiciel d'acquisition dédié. Il permet d'afficher les valeurs des température au maximum de la période d'échantillonage (0.25 s) et de capturer dans un fichier de données texte, formaté pour Excel.
thermocouple_v4_bds.arj   Sources du logiciel d'acquisition dédié. CodeGear C++ 2007 (C++ Builder).
thermocouple_v4.arj   Sources du code pour dspic 30F3010. MPLAB et C30 compiler pour créer le .hex.
thermocouple_txV4_orcad.pdf   Schéma électronique de la carte.


Back to homepage

Last update : 03/06/2008