Cet article est un article miroir de traduction automatique, veuillez cliquer ici pour accéder à l’article original.

Vue: 10718|Répondre: 0

Zigbee Journey (6) : Plusieurs expériences fondamentales importantes de CC2430 - Échantillonnage unique ADC

[Copié le lien]
Publié sur 30/10/2014 23:20:31 | | | |
1. Reliant les niveaux supérieur et inférieur

Dans les réseaux de capteurs sans fil, il est important de convertir les valeurs analogiques des capteurs en quantités numériques pour faciliter la transmission et le traitement. L’ADC (Convertisseur analogique-numérique) est utilisé pour compléter cette conversion.

Dans la section précédente, nous avons introduit la communication par port série entre le CC2430 et un PC. CC2430 est équipé d’un capteur de température intégré, et cette section va mettre en œuvre une expérience simple de surveillance de la température intégrée basée sur la section précédente : utiliser l’ADC pour convertir la valeur de tension du capteur de température intégré en une grandeur numérique, utiliser la formule pour calculer la valeur de température, puis transmettre la valeur de température au PC via le port série et l’afficher.

2. ADC échantillonnage simple(1) Introduction à l’expérience

L’ADC sert à convertir la valeur de température du capteur de température intégré au CC2430, et la valeur de température est envoyée au PC via le port série et affichée.

(2) Organigramme de programme

(3) Code source expérimental et analyse/*
    Description expérimentale : L’expérience d’acquisition de température intégrée à la puce envoie les données au PC via le port série 0
*/

#include

#define menait P1_0
#define P1_1
#define a mené 3 P1_2
#define P1_3 mené

/*32M晶振初始化
-------------------------------------------------------*/
vidextal_init(vide)
{
  SOMMEIL &= ~0x04;            //都上电
  tandis que(! (SOMMEIL &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;         Choisissez un oscillateur à cristal de 32 MHz
  SOMMEIL |=0x04;
}

/*LED灯初始化
-------------------------------------------------------*/
videled_init(vide)
{
  P1SEL =0x00;         P1 est le port d’E/S normal
  P1DIR |=0x0F;         Sortie P1.0 P1.1 P1.2 P1.3
  
  mené1 =1;
  mené2 =1;
  mené3 =1;
  mené4 =1;
}

/*UART0初始化
-------------------------------------------------------*/
vide  Uart0Init(non signé CharStopBits,non signé CharParité)
{
   P0SEL |=  0x0C;                  //初始化UART0端口
   PERCFG&= ~0x01;                  //选择UART0为可选位置一
   U0CSR =0xC0;                    Réglez en mode UART et activez l’accepteur
   U0GCR =11;
   U0BAUD =216;                    //设置UART0波特率为115200bps
   U0UCR |= StopBits| Parité ;        //设置停止位与奇偶校验
}

/*UART0发送字符
-------------------------------------------------------*/
vide  Uart0Send(non signé Chardonnées)
{
  tandis que(U0CSR&0x01);   //等待UART空闲时发送数据
  U0DBUF = data ;
}

/*UART0发送字符串
-------------------------------------------------------*/
videUart0SendString(non signé Char*s)
{
  tandis que(*s !=0)
    Uart0Send(*s++) ;
}

/*UART0接收数据
-------------------------------------------------------*/
non signé CharUart0Receive(vide)
{
  non signé Chardonnées ;
  tandis que(! (U0CSR&0x04));//查询是否收到数据,否则继续等待
  data=U0DBUF ;
  Retourdonnées ;
}

/*延时函数
-------------------------------------------------------*/
videDélai (non signé intn)
{
  non signé intJe;
  pour(i=0; i<n ; i++) ;
  pour(i=0; i<n ; i++) ;
  pour(i=0; i<n ; i++) ;
  pour(i=0; i<n ; i++) ;
  pour(i=0; i<n ; i++) ;
}

/*得到实际温度值
-------------------------------------------------------*/
FlotteurgetTemperature(vide)
{
  non signé int  valeur ;

  ADCCON3 = (0x3E);                  //选择1.25V为参考电压;14位分辨率;对片内温度传感器采样
   
  ADCCON1 |=0x30;                    //选择ADC的启动模式为手动
  ADCCON1 |=0x40;                    Initier les conversions AD            
   
  tandis que(! (ADCCON1 &0x80));           //等待ADC转化结束

  valeur = ADCL >>2;
  valeur |= (ADCH <<6);               //取得最终转化结果,存入value中
  
  RetourValue*0.06229-311.43;        //根据公式计算出温度值
}

/*主函数
-------------------------------------------------------*/
videmain(vide)
{
  CharJe;
  FlotteurmgTemp ;
  non signé CharSortie[]="";
        
  xtal_init() ;
  led_init() ;
  
  mené1 =0;

  Uart0Init(0x00, 0x00);   //初始化串口:无奇偶校验,停止位为1位

  Uart0SendString(« Bonjour CC2430 - TempSensor !");

  tandis que(1)
  {
    mené1 =0;
    avgTemp =0;
    pour(i =0; Je <64; i++)
    {
      avgTemp += getTemperature() ;
      avgTemp = apgTemp/2;            //每采样1次,取1次平均值
    }
   
    Sortie[0] = (non signé Char(modgTemp)/10 + 48;         //十位
    Sortie[1] = (non signé Char(mgTemp) %10 + 48;         //个位
    Sortie[2] ='.';                                       //小数点
    Sortie[3] = (non signé Char(mgTemp*10)%10+48;         //十分位
    Sortie[4] = (non signé Char(mgTemp*100)%10+48;        //百分位
    Sortie[5] ='';                                      //字符串结束符
   
    Uart0SendString (sortie) ;
    Uart0SendString("°C");
    mené1 =1;                          //LED熄灭,表示转换结束,
   
    Délai (20000);
    Délai (20000);
    Délai (20000);
    Délai (20000);
    Délai (20000);
    Délai (20000);
    Délai (20000);
    Délai (20000);
    Délai (20000);
    Délai (20000);
  }
}

Pour le contenu du code de la communication par port série, veuillez vous référer à la section précédente, qui ne sera pas expliquée ici~

Les ADC impliquent généralement 6 SFR :

ADCCON1Pour le contrôle général de l’ADC, y compris le drapeau de fin de conversion, la méthode de déclenchement de l’ADC, le générateur de nombres aléatoires
ADCCON2Configuration pour la conversion continue des ADC (cette expérience n’implique pas la conversion continue des ADC et n’utilise donc pas ce SFR)
ADCCON3Configuration pour une conversion ADC unique, incluant la sélection de la tension de référence, de la résolution, de la source de conversion
ADCH[7:0]Le niveau élevé du résultat de conversion ADC, c’est-à-dire ADC [13:6]
ADCL[7:2]Le bas niveau du résultat de conversion ADC, c’est-à-dire ADC [5:0]
ADCCFGAIN0~AIN7 avec P0.0~P0.7 comme entrée ADC (ce SFR n’est pas utilisé car le capteur de température intégré est sélectionné comme source de conversion dans ce test et n’implique pas AIN0~AIN7)

(Note : veuillez consulter le manuel chinois CC2430 pour les détails SFR ci-dessus)

Ensuite, concentrons-nous là-dessusgetTempuraturefonction, qui est la clé pour obtenir la valeur de température :

(1) D’abord, configurez l’ADC pour un échantillonnage unique : réglez ADCCON3=0x3E, sélectionnez 1,25V comme tension système, sélectionnez la résolution 14 bits, et sélectionnez le capteur de température intégré CC2430 comme source de conversion ADC

(2) Puis régler ADCCON1 |= 0x30 pour mettre la méthode de déclenchement de l’ADC en manuel (c’est-à-dire que, lorsque l’ADCCON.6=1, commence la transition de l’ADC)

(3) Alors ADCCON1 |= 0x40 pour commencer la conversion simple ADC

(4) Utiliser l’instruction pendant que ( !( ADCCON1 & 0x80)) Attendre la fin de la transition ADC

(5) Le résultat de conversion est stocké dans ADCH[7:0] (8 bits de haut), ADCH [7:2] (6 bits de moins), et passé :

    valeur = ADCL >>2;
    valeur |= (ADCH <<6);   

Enregistrer le résultat de conversion dans la valeur

(6) Enfin, utiliser la formuletempérature= valeur*0,06229-311,43, calculer la valeur de température et le retour

Conseils CC2430
Vous devez être perplexe face à la dernière formule, pourquoi une fonction unique ? Pourquoi a-t-il une pente de 0,06229 et une interception de 211,43 ? OK, voici la réponse :
Ce capteur de température est situé à l’intérieur de la puce CC2430, donc sa description se trouve certainement dans son manuel. Effectivement, je suis làSpécifications électriquesLe contenu pertinent se trouve dans cette section, et la capture d’écran est la suivante :
Ce tableau décrit la température (°C) du capteur de température en relation avec la tension de sortie (V).
Premier regard sur la deuxième boîte rouge :Coefficient de température。 « Coefficient » ? Ça ne fait pas un peu ? Puis regardez son unité : mV/°C, et vous réaliserez soudain que la relation entre température et tension est linéaire~ C’est-à-dire :
où V est la valeur de tension de sortie, T est la valeur de température, et 2,45 est la pente. L’interception b doit être déterminée ci-dessous.
À première vue, on verra sur la première boîte rouge que la tension à 0°C est de 743 mV, donc b est égal à 743 ? Sinon, si vous continuez à regarder vers le bas, vous constaterez que son erreur absolue peut atteindre jusqu’à 8°C ! Puis, en regardant vers la droite, on verra qu’elle fournit déjà l’intercept le plus approprié, c’est-à-dire : b=763, donc il existe la formule suivante :
OK, maintenant nous avons déjà le capteur de températureEntrer la température TetTension de sortie VL’étape suivante est de trouver l’ADCTension d’entrée VetValeur de sortie N(c’est-à-dire le résultat de conversion de 14 bits), et enfin trouver la formule de conversion de N et T.
Le résultat de conversion N est de 14 bits, et lorsque N=11 1111 1111 1111 (binaire), la tension de sortie doit être la valeur maximale (c’est-à-dire la tension de référence 1,25V). Par conséquent, nous avons la relation proportionnelle suivante :
(Note : Puisque la sortie de 14 bits est un complément binaire, le 14e bit est le bit de symbole.) Donc, en termes absolus, la valeur effective n’est que de 13 bits, donc elle est de 2 à la puissance de 13)
En combinant les deux formules, on peut déduire la relation entre T et N :
TERMINÉ~

Enfin, quelques mots expliquant pourquoi 64 cycles sont nécessaires par échantillon. Comme les capteurs sont inévitablement sujets à des interférences ou à des erreurs aléatoires lors de la mesure de la température, les données obtenues par les capteurs sont parfois exagérées (par exemple, un changement soudain de 10°C, puis un retour instantané à la normale). Mais nous savons que le changement de température est un processus intégral, et il est rare qu’un saut important se produise instantanément). Par conséquent, nous utilisons la méthode moyenne pour réduire ces erreurs.

(4) Résultats expérimentaux

D’abord, ouvrez l’outil de débogage des ports série, puis téléchargez le programme et lancez-le, et l’écran suivant apparaîtra :

La température à l’intérieur du film est d’environ 14,5°C. L’auteur ressent la température de la chambre avec son corps, qui est un peu plus de 10°C. L’intérieur de la puce a besoin de chauffer, donc 14°C est quasiment normal~

C’est la fin de l’expérience.

3. Conclusion

Cet article décrit la mise en œuvre de l’échantillonnage simple ADC. Dans la section suivante, nous introduirons un mode de transfert de donnéesDMA(accès direct à la mémoire), c’est-à-dire « accès direct à la mémoire ». Les unités périphériques telles que les émetteurs-récepteurs ADC/UART/RF et les dispositifs mémoire peuvent être échangées directement sous le contrôle du « contrôleur DMA »Peu d’intervention du processeur est nécessaire, ce qui améliore considérablement l’efficacité globale du système.

Restez à l’écoute !


</n ; i++) ;
</n ; i++) ;
</n ; i++) ;
</n ; i++) ;
</n ; i++) ;




Précédent:Zigbee Journey (5) : Plusieurs expériences fondamentales importantes de CC2430 - communication série
Prochain:Zigbee Journey (7) : Plusieurs expériences fondamentales importantes de CC2430 - transmission DMA
Démenti:
Tous les logiciels, supports de programmation ou articles publiés par Code Farmer Network sont uniquement destinés à l’apprentissage et à la recherche ; Le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon les utilisateurs assumeront toutes les conséquences. Les informations sur ce site proviennent d’Internet, et les litiges de droits d’auteur n’ont rien à voir avec ce site. Vous devez supprimer complètement le contenu ci-dessus de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, merci de soutenir un logiciel authentique, d’acheter l’immatriculation et d’obtenir de meilleurs services authentiques. En cas d’infraction, veuillez nous contacter par e-mail.

Mail To:help@itsvse.com