Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 10718|Respuesta: 0

Zigbee Journey (6): Varios experimentos básicos importantes de CC2430 - ADC muestreo único

[Copiar enlace]
Publicado en 30/10/2014 23:20:31 | | | |
1. Conexión entre los niveles superior e inferior

En redes inalámbricas de sensores, es importante convertir los valores analógicos de los sensores en cantidades digitales para facilitar la transmisión y el procesamiento. Se utiliza ADC (Convertidor analógico-digital) para completar esta conversión.

En la sección anterior, introdujimos la comunicación por puerto serial entre el CC2430 y un PC. CC2430 tiene un sensor de temperatura integrado, y esta sección implementará un experimento sencillo sobre monitorización de temperatura en chip basado en la sección anterior: usar el ADC para convertir el valor de voltaje del sensor de temperatura integrado en una cantidad digital, usar la fórmula para calcular el valor de temperatura y luego transmitir el valor de temperatura al PC a través del puerto serie para mostrarlo.

2. Muestreo único ADC(1) Introducción al experimento

El ADC se utiliza para convertir el valor de temperatura del sensor de temperatura del CC2430 en el chip, y el valor de temperatura se envía al PC a través del puerto serie y se muestra.

(2) Diagrama de flujo del programa

(3) Código fuente experimental y análisis/*
    Descripción experimental: El experimento de adquisición de temperatura integrado en el chip envía los datos al PC a través del puerto serie 0
*/

#include

#define lideró P1_0
#define P1_1 LED2
#define led3 P1_2
#define led4 P1_3

/*32M晶振初始化
-------------------------------------------------------*/
Vacíoxtal_init(Vacío)
{
  SUEÑO &= ~0x04;            //都上电
  mientras(! (SUEÑO &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;         Elige un oscilador de cristal de 32MHz
  SUEÑO |=0x04;
}

/*LED灯初始化
-------------------------------------------------------*/
Vacíoled_init(Vacío)
{
  P1SEL =0x00;         P1 es el puerto normal de E/S
  P1DIR |=0x0F;         P1.0 P1.1 P1.2 P1.3 salida
  
  liderado1 =1;
  Liderado2 =1;
  liderado3 =1;
  Liderado4 =1;
}

/*UART0初始化
-------------------------------------------------------*/
Vacío  Uart0Init(sin firmar charStopBits,sin firmar charParidad)
{
   P0SEL |=  0x0C;                  //初始化UART0端口
   PERCFG&= ~0x01;                  //选择UART0为可选位置一
   U0CSR =0xC0;                    Configura en modo UART y activa el aceptor
   U0GCR =11;
   U0BAUD =216;                    //设置UART0波特率为115200bps
   U0UCR |= StopBits| Paridad;        //设置停止位与奇偶校验
}

/*UART0发送字符
-------------------------------------------------------*/
Vacío  Uart0Send(sin firmar chardatos)
{
  mientras(U0CSR&0x01);   //等待UART空闲时发送数据
  U0DBUF = datos;
}

/*UART0发送字符串
-------------------------------------------------------*/
VacíoUart0SendString(sin firmar char*s)
{
  mientras(*s !=0)
    Uart0Send(*s++);
}

/*UART0接收数据
-------------------------------------------------------*/
sin firmar charUart0Receive(Vacío)
{
  sin firmar chardatos;
  mientras(! (U0CSR&0x04));//查询是否收到数据,否则继续等待
  data=U0DBUF;
  devolucióndatos;
}

/*延时函数
-------------------------------------------------------*/
VacíoRetraso(sin firmar intn)
{
  sin firmar intYo;
  para(i=0; i<n; i++);
  para(i=0; i<n; i++);
  para(i=0; i<n; i++);
  para(i=0; i<n; i++);
  para(i=0; i<n; i++);
}

/*得到实际温度值
-------------------------------------------------------*/
FlotadorgetTemperature(Vacío)
{
  sin firmar int  valor;

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

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

/*主函数
-------------------------------------------------------*/
Vacíomain(Vacío)
{
  charYo;
  FlotadorTemp medio;
  sin firmar charsalida[]="";
        
  xtal_init();
  led_init();
  
  liderado1 =0;

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

  Uart0SendString("¡Hola CC2430 - SensorTemperatura!");

  mientras(1)
  {
    liderado1 =0;
    avgTemp =0;
    para(i =0; Yo <64; i++)
    {
      avgTemp += getTemperature();
      AvgTemp = avgTemp/2;            //每采样1次,取1次平均值
    }
   
    Salida[0] = (sin firmar char(avgTemp)/10 + 48;         //十位
    Salida[1] = (sin firmar char(aproxgTemp)%10 + 48;         //个位
    Salida[2] ='.';                                       //小数点
    Salida[3] = (sin firmar char(Temp medio*10)%10+48;         //十分位
    Salida[4] = (sin firmar char(Temp medio*100)%10+48;        //百分位
    salida[5] ='';                                      //字符串结束符
   
    Uart0SendString (salida);
    Uart0SendString("°C");
    liderado1 =1;                          //LED熄灭,表示转换结束,
   
    Retraso(20000);
    Retraso(20000);
    Retraso(20000);
    Retraso(20000);
    Retraso(20000);
    Retraso(20000);
    Retraso(20000);
    Retraso(20000);
    Retraso(20000);
    Retraso(20000);
  }
}

Para el contenido del código de la comunicación por puertos seriales, por favor consulte la sección anterior, que no se explicará aquí~

Los ADC generalmente involucran 6 SFR:

ADCCON1Para el control general del ADC, incluyendo la bandera de final de conversión, el método de disparo del ADC, el generador de números aleatorios
ADCCON2Configuración para la conversión continua de ADC (este experimento no implica conversión continua de ADC y, por tanto, no utiliza este SFR)
ADCCON3Configuración para una conversión de ADC único, incluyendo selección de voltaje de referencia, resolución y fuente de conversión
ADCH[7:0]El alto nivel del resultado de conversión ADC, es decir, ADC [13:6]
ADCL[7:2]El nivel bajo del resultado de conversión ADC, es decir, ADC [5:0]
ADCCFGAIN0~AIN7 con P0.0~P0.7 como entrada ADC (este SFR no se utiliza porque el sensor de temperatura integrado en el chip se selecciona como fuente de conversión en esta prueba y no involucra a AIN0~AIN7)

(Nota: Por favor, consulte el manual chino CC2430 para los detalles anteriores sobre el SFR)

Ahora, centrémonos en ellogetTempuraturefunción, que es la clave para obtener el valor de temperatura:

(1) Primero, configurar el ADC para un único muestreo: establecer ADCCON3=0x3E, seleccionar 1,25V como voltaje del sistema, seleccionar resolución de 14 bits y seleccionar el sensor de temperatura del CC2430 integrado en el chip como fuente de conversión del ADC

(2) Luego se establece ADCCON1 |= 0x30 para poner el método de disparo del ADC en manual (es decir, cuando ADCCON.6=1, inicia la transición del ADC)

(3) Entonces dejemos ADCCON1 |= 0x40 para iniciar la conversión de un solo ADC

(4) Usa la afirmación mientras (!( ADCCON1 &0x80)) Esperar al final de la transición del ADC

(5) El resultado de conversión se almacena en ADCH[7:0] (8 bits de altura), ADCH [7:2] (6 bits menos) y se pasa:

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

Guardar el resultado de conversión en el valor

(6) Finalmente, usar la fórmulatemperatura= valor*0,06229-311,43, calcula el valor de temperatura y el retorno

Consejos CC2430
Debes de estar desconcertado por la última fórmula, ¿por qué una función única? ¿Por qué tiene una pendiente de 0,06229 y una intersección de 211,43? Vale, aquí está la respuesta:
Este sensor de temperatura está ubicado dentro del chip CC2430, por lo que su descripción se encuentra sin duda en su manual. Claro que estoy aquíEspecificaciones eléctricasEl contenido relevante se encuentra en esta sección, y la captura de pantalla es la siguiente:
Esta tabla describe la temperatura (°C) del sensor de temperatura en relación con la tensión de salida (V).
Primera vista a la segunda caja roja:Coeficiente de temperatura。 ¿"Coeficiente"? ¿No se siente un poco? Luego mira su unidad: mV/°C, y de repente te darás cuenta de que la relación entre temperatura y voltaje es lineal~ Es decir:
donde V es el valor de la tensión de salida, T es el valor de temperatura y 2,45 es la pendiente. La intercepción b debe determinarse a continuación.
A primera vista, veremos en la primera caja roja que el voltaje a 0°C es de 743 mV, ¿así que b es igual a 743? De lo contrario, si sigues mirando hacia abajo, verás que su error absoluto llega hasta a 8°C. Luego, mirando hacia la derecha, veremos que ya proporciona el intercepto más adecuado, es decir: b=763, así que existe la siguiente fórmula:
Vale, ahora ya tenemos el sensor de temperaturaIntroduzca la temperatura TyTensión de salida VEl siguiente paso es encontrar al ADCTensión de entrada VyValor de salida N(es decir, el resultado de conversión de 14 bits), y finalmente encontrar la fórmula de conversión de N y T.
El resultado de conversión N es de 14 bits, y cuando N=11 1111 1111 1111 (binario), la tensión de salida debe ser el valor máximo (es decir, voltaje de referencia 1,25V). Por lo tanto, tenemos la siguiente relación proporcional:
(Nota: Dado que la salida de 14 bits es un complemento binario, el 14º bit es el bit de símbolo.) Así que, en términos absolutos, el valor efectivo es solo 13 bits, es decir, es 2 elevado a la potencia de 13)
Combinando las dos fórmulas, se puede derivar la relación entre T y N:
CAMBIO~

Por último, unas palabras sobre por qué se requieren 64 ciclos por muestra. Como los sensores están inevitablemente sujetos a interferencias o errores aleatorios al medir la temperatura, los datos obtenidos por los sensores a veces se exageran (por ejemplo, un cambio repentino de 10°C y luego un retorno instantáneo a la normalidad). Pero sabemos que el cambio de temperatura es un proceso integral, y es raro que ocurra un salto grande en un instante). Por lo tanto, usamos el método promedio para reducir dichos errores.

(4) Resultados experimentales

Primero, abre la herramienta de depuración del puerto serial, luego descarga el programa y arráncalo, y aparecerá la siguiente pantalla:

La temperatura dentro de la película es de unos 14,5°C. El autor siente la temperatura de la habitación del dormitorio con su cuerpo, que es un poco más de 10°C. El interior del chip necesita algo de calor, así que 14°C es básicamente normal~

Este es el final del experimento.

3. Conclusión

Este artículo describe la implementación del muestreo único ADC. En la siguiente sección, introduciremos un modo de transferencia de datosDMA(acceso directo a memoria), es decir, "acceso directo a memoria". Unidades periféricas como transceptores ADC/UART/RF y dispositivos de memoria pueden intercambiarse directamente bajo el control del "controlador DMA"Se requiere poca intervención de la CPU, lo que mejora considerablemente la eficiencia global del sistema.

¡Estad atentos!


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




Anterior:Zigbee Journey (5): Varios experimentos básicos importantes de CC2430 - comunicación serial
Próximo:Zigbee Journey (7): Varios experimentos básicos importantes de CC2430 - Transmisión DMA
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com