|
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 experimentoO 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: | ADCCON1 | Para controle geral do ADC, incluindo flag final de conversão, método de disparo do ADC, gerador de números aleatórios | | ADCCON2 | Configuraçã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) | | ADCCON3 | Configuraçã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] | | ADCCFG | AIN0~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 CC2430Você 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 experimentaisPrimeiro, 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ãoEste 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++);
|