Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 10718|Resposta: 0

Zigbee Journey (6): Vários experimentos básicos importantes do CC2430 - ADC amostragem única

[Copiar link]
Publicado em 30/10/2014 23:20:31 | | | |
1. Conectando os níveis superior e inferior

Em redes de sensores sem fio, é importante converter os valores analógicos dos sensores em quantidades digitais para facilitar a transmissão e o processamento. O ADC (Conversor Analógico-Digital) é usado para completar essa conversão.

Na seção anterior, introduzimos a comunicação por porta serial entre o CC2430 e um PC. O CC2430 possui um sensor de temperatura embutido dentro, e esta seção implementará um experimento simples de monitoramento de temperatura no chip baseado na seção anterior: use o ADC para converter o valor de tensão do sensor de temperatura no chip em uma quantidade digital, use a fórmula para calcular o valor da temperatura e então transmita o valor de temperatura para o PC através da porta serial e o exiba.

2. Amostragem simples com ADC(1) Introdução ao experimento

O ADC é usado para converter o valor de temperatura do sensor de temperatura do CC2430 no chip, e o valor de temperatura é enviado para o PC através da porta serial e exibido.

(2) Fluxograma de programas

(3) Código-fonte experimental e análise/*
    Descrição experimental: O experimento de aquisição de temperatura no chip envia os dados para o PC através da porta serial 0
*/

#include

#define liderou1 P1_0
#define P1_1 liderado2
#define liderou 3 P1_2
#define P1_3 Led4

/*32M晶振初始化
-------------------------------------------------------*/
vazioxtal_init(vazio)
{
  SONO &= ~0x04;            //都上电
  enquanto(! (SONO &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;         Escolha um oscilador de cristal de 32MHz
  SONO |=0x04;
}

/*LED灯初始化
-------------------------------------------------------*/
vazioled_init(vazio)
{
  P1SEL =0x00;         P1 é a porta normal de E/S
  P1DIR |=0x0F;         Saída P1.0 P1.1 P1.2 P1.3
  
  liderado1 =1;
  liderado2 =1;
  Liderado3 =1;
  liderado4 =1;
}

/*UART0初始化
-------------------------------------------------------*/
vazio  Uart0Init(sem assinatura CharStopBits,sem assinatura CharParidade)
{
   P0SEL |=  0x0C;                  //初始化UART0端口
   PERCFG&= ~0x01;                  //选择UART0为可选位置一
   U0CSR =0xC0;                    Coloque no modo UART e ative o aceitador
   U0GCR =11;
   U0BAUD =216;                    //设置UART0波特率为115200bps
   U0UCR |= StopBits| Paridade;        //设置停止位与奇偶校验
}

/*UART0发送字符
-------------------------------------------------------*/
vazio  Uart0Send(sem assinatura Chardados)
{
  enquanto(U0CSR&0x01);   //等待UART空闲时发送数据
  U0DBUF = data;
}

/*UART0发送字符串
-------------------------------------------------------*/
vazioUart0SendString(sem assinatura Char*s)
{
  enquanto(*s !=0)
    Uart0Send(*s++);
}

/*UART0接收数据
-------------------------------------------------------*/
sem assinatura CharUart0Receive(vazio)
{
  sem assinatura Chardados;
  enquanto(! (U0CSR&0x04));//查询是否收到数据,否则继续等待
  data=U0DBUF;
  retornodados;
}

/*延时函数
-------------------------------------------------------*/
vazioAtraso(sem assinatura intn)
{
  sem assinatura inteu;
  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++);
}

/*得到实际温度值
-------------------------------------------------------*/
FlutuadorgetTemperature(vazio)
{
  sem assinatura int  valor;

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

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

/*主函数
-------------------------------------------------------*/
vaziomain(vazio)
{
  Chareu;
  FlutuadorTemperatura média;
  sem assinatura Charsaída[]="";
        
  xtal_init();
  led_init();
  
  liderado1 =0;

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

  Uart0SendString("Olá CC2430 - SensorTemperatura!");

  enquanto(1)
  {
    liderado1 =0;
    avgTemp =0;
    para(i =0; eu <64; i++)
    {
      avgTemp += getTemperature();
      avgTemp = avgTemp/2;            //每采样1次,取1次平均值
    }
   
    saída[0] = (sem assinatura Char(mgTemp)/10 + 48;         //十位
    saída[1] = (sem assinatura Char(mgTemp)%10 + 48;         //个位
    saída[2] ='.';                                       //小数点
    saída[3] = (sem assinatura Char(mgTemp*10)%10+48;         //十分位
    saída[4] = (sem assinatura Char(mgTemp*100)%10+48;        //百分位
    saída[5] ='';                                      //字符串结束符
   
    Uart0SendString (saída);
    Uart0SendString("°C");
    liderado1 =1;                          //LED熄灭,表示转换结束,
   
    Atraso(20000);
    Atraso(20000);
    Atraso(20000);
    Atraso(20000);
    Atraso(20000);
    Atraso(20000);
    Atraso(20000);
    Atraso(20000);
    Atraso(20000);
    Atraso(20000);
  }
}

Para o conteúdo do código da comunicação por porta serial, por favor, consulte a seção anterior, que não será explicada aqui~

Os ADCs geralmente envolvem 6 SFRs:

ADCCON1Para controle geral do ADC, incluindo flag final de conversão, método de disparo do ADC, gerador de números aleatórios
ADCCON2Configuração para conversão contínua de ADC (este experimento não envolve conversão contínua de ADC e, portanto, não utiliza esse SFR)
ADCCON3Configuração para uma única conversão de ADC, incluindo seleção de tensão de referência, resolução e fonte de conversão
ADCH[7:0]O alto nível do resultado de conversão ADC, ou seja, ADC [13:6]
ADCL[7:2]O baixo nível do resultado de conversão ADC, ou seja, ADC [5:0]
ADCCFGAIN0~AIN7 com P0.0~P0.7 como entrada do ADC (esse SFR não é usado porque o sensor de temperatura no chip é selecionado como fonte de conversão neste teste e não envolve AIN0~AIN7)

(Nota: Por favor, consulte o manual chinês CC2430 para os detalhes acima do SFR)

Agora, vamos focar nissogetTempuraturefunção, que é a chave para obter o valor de temperatura:

(1) Primeiro, configure o ADC para uma única amostragem: defina ADCCON3=0x3E, selecione 1,25V como tensão do sistema, selecione resolução de 14 bits e selecione o sensor de temperatura do CC2430 no chip como fonte de conversão do ADC

(2) Então defina ADCCON1 |= 0x30 para definir o método de disparo do ADC como manual (ou seja, quando o ADCCON.6=1, inicie a transição do ADC)

(3) Então seja ADCCON1 |= 0x40 para iniciar a conversão simples do ADC

(4) Use a instrução enquanto (!( ADCCON1 & 0x80)) Aguarde o fim da transição do ADC

(5) O resultado da conversão é armazenado no ADCH[7:0] (8 bits de altura), ADCH [7:2] (6 bits abaixo) e passado:

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

Salve o resultado da conversão no valor

(6) Finalmente, use a fórmulatemperatura= valor*0,06229-311,43, calcula o valor da temperatura e retorno

Dicas CC2430
Você deve estar intrigado com a última fórmula, por que uma função única? Por que ele tem uma inclinação de 0,06229 e uma interceptação de 211,43? OK, aqui está a resposta:
Esse sensor de temperatura está localizado dentro do chip CC2430, então sua descrição certamente pode ser encontrada no manual. Com certeza, estou aquiEspecificações elétricasO conteúdo relevante está disponível nesta seção, e a captura de tela é a seguinte:
Esta tabela descreve a temperatura (°C) do sensor de temperatura em relação à tensão de saída (V).
Primeira olhada na segunda caixa vermelha:Coeficiente de temperatura。 "Coeficiente"? Não parece um pouco? Então olhe para sua unidade: mV/°C, e você vai perceber de repente que a relação entre temperatura e voltagem é linear~ Ou seja:
onde V é o valor da tensão de saída, T é o valor de temperatura e 2,45 é a inclinação. A interceptação b deve ser determinada abaixo.
À primeira vista, vamos ver na primeira caixa vermelha que a tensão em 0°C é 743mV, então b é igual a 743? Caso contrário, se você continuar olhando para baixo, verá que o erro absoluto chega a até 8°C! Então, olhando para a direita, veremos que ele já fornece o intercepto mais adequado, ou seja: b=763, então existe a seguinte fórmula:
OK, agora já temos o sensor de temperaturaIntroduza a temperatura TeTensão de saída VO próximo passo é encontrar o ADCTensão de entrada VeValor de saída N(ou seja, o resultado de conversão de 14 bits), e finalmente encontrar a fórmula de conversão de N e T.
O resultado de conversão N é 14 bits, e quando N=11 1111 1111 1111 (binário), a tensão de saída deve ser o valor máximo (ou seja, tensão de referência 1,25V). Portanto, temos a seguinte relação proporcional:
(Nota: Como a saída de 14 bits é um complemento binário, o 14º bit é o bit de símbolo.) Então, em termos absolutos, o valor efetivo é apenas 13 bits, ou seja, é 2 elevado à potência de 13)
Combinando as duas fórmulas, a relação entre T e N pode ser derivada:
CÂMBIO~

Por fim, algumas palavras sobre por que são necessários 64 ciclos por amostra. Como os sensores são inevitavelmente sujeitos a interferências ou erros aleatórios ao medir a temperatura, os dados obtidos pelos sensores às vezes são exagerados (por exemplo, uma mudança repentina de 10°C e depois um retorno instantâneo ao normal). Mas sabemos que a mudança de temperatura é um processo integral, e é raro que um salto grande ocorra de uma vez só). Portanto, usamos o método médio para reduzir tais erros.

(4) Resultados experimentais

Primeiro, abra a ferramenta de depuração de portas seriais, depois baixe o programa e inicie-o, e a seguinte tela aparecerá:

A temperatura dentro do filme é de cerca de 14,5°C. O autor sente a temperatura do quarto do dormitório com seu corpo, que é um pouco acima de 10°C. O interior do chip precisa de calor, então 14°C é basicamente normal~

Este é o fim do experimento.

3. Conclusão

Este artigo descreve a implementação da amostragem única com ADC. Na próxima seção, apresentaremos um modo de transferência de dadosDMA(acesso direto à memória), ou seja, "acesso direto à memória". Unidades periféricas como transceptores ADC/UART/RF e dispositivos de memória podem ser trocadas diretamente sob o controle do "controlador DMA"Pouca intervenção da CPU é necessária, o que melhora muito a eficiência geral do sistema.

Fiquem ligados!


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




Anterior:Jornada Zigbee (5): Vários experimentos básicos importantes do CC2430 - comunicação serial
Próximo:Zigbee Journey (7): Vários experimentos básicos importantes do CC2430 - transmissão DMA
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com