이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 10718|회답: 0

Zigbee Journey (6): 여러 중요한 CC2430 기본 실험 - ADC 단일 샘플링

[링크 복사]
게시됨 2014. 10. 30. 오후 11:20:31 | | | |
1. 상하층 연결

무선 센서 네트워크에서는 센서의 아날로그 값을 디지털 양으로 변환하여 전송과 처리가 용이하게 하는 것이 중요합니다. 이 변환을 완료하는 데 ADC(아날로그-디지털 변환기)가 사용됩니다.

이전 섹션에서는 CC2430과 PC 간의 직렬 포트 통신을 소개했습니다. CC2430에는 온도 센서가 내장되어 있으며, 이 섹션에서는 이전 섹션을 기반으로 온칩 온도 모니터링에 관한 간단한 실험을 구현할 것입니다: ADC를 사용해 온칩 온도 센서의 전압 값을 디지털 값으로 변환하고, 공식으로 온도 값을 계산한 후, 시리얼 포트를 통해 PC에 온도 값을 전송해 표시합니다.

2. ADC 단일 샘플링(1) 실험 소개

ADC는 CC2430 온칩 온도 센서의 온도 값을 변환하는 데 사용되며, 온도 값은 직렬 포트를 통해 PC로 전송되어 표시됩니다.

(2) 프로그램 플로우차트

(3) 실험적 소스 코드 및 분석/*
    실험 설명: 칩 내 온도 획득 실험은 직렬 포트 0을 통해 데이터를 PC로 전송합니다
*/

#include

#define 이끄는 1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3

/*32M晶振初始化
-------------------------------------------------------*/
공허xtal_init(공허)
{
  잠 &= ~0x04;            //都上电
  반면(! (잠 그리고0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;         32MHz 크리스털 발진기를 선택하세요
  잠 |=0x04;
}

/*LED灯初始化
-------------------------------------------------------*/
공허led_init(공허)
{
  P1SEL =0x00;         P1은 일반 I/O 포트입니다
  P1DIR |=0x0F;         P1.0 P1.1 P1.2 P1.3 출력
  
  LED1 =1;
  led2 =1;
  led3 =1;
  LED4 =1;
}

/*UART0初始化
-------------------------------------------------------*/
공허  Uart0Init(서명 없음 차어스톱비트,서명 없음 차어패리티)
{
   P0SEL |=  0x0C;                  //初始化UART0端口
   PERCFG&= ~0x01;                  //选择UART0为可选位置一
   U0CSR =0xC0;                    UART 모드로 설정하고 수용기를 활성화합니다
   U0GCR =11;
   U0보드 =216;                    //设置UART0波特率为115200bps
   U0UCR |= StopBits| 패리티;        //设置停止位与奇偶校验
}

/*UART0发送字符
-------------------------------------------------------*/
공허  Uart0Send(서명 없음 차어데이터)
{
  반면(U0CSR&0x01);   //等待UART空闲时发送数据
  U0DBUF = data;
}

/*UART0发送字符串
-------------------------------------------------------*/
공허Uart0SendString(서명 없음 차어*s)
{
  반면(*s !=0)
    Uart0Send(*s++);
}

/*UART0接收数据
-------------------------------------------------------*/
서명 없음 차어Uart0Receive(공허)
{
  서명 없음 차어데이터;
  반면(! (U0CSR&0x04));//查询是否收到数据,否则继续等待
  data=U0DBUF;
  귀환데이터;
}

/*延时函数
-------------------------------------------------------*/
공허지연(서명 없음 지능n)
{
  서명 없음 지능나는;
  에 대해(i=0; i<n; i++);
  에 대해(i=0; i<n; i++);
  에 대해(i=0; i<n; i++);
  에 대해(i=0; i<n; i++);
  에 대해(i=0; i<n; i++);
}

/*得到实际温度值
-------------------------------------------------------*/
플로트getTemperature(공허)
{
  서명 없음 지능  가치;

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

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

/*主函数
-------------------------------------------------------*/
공허주요(공허)
{
  차어나는;
  플로트avgTemp;
  서명 없음 차어output[]="";
        
  xtal_init();
  led_init();
  
  LED1 =0;

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

  Uart0SendString("안녕하세요, CC2430 - 온도센서!");

  반면(1)
  {
    LED1 =0;
    avgTemp =0;
    에 대해(i =0; 나는 <64; i++)
    {
      avgTemp += getTemperature();
      avgTemp = avgTemp/2;            //每采样1次,取1次平均值
    }
   
    출력[0] = (서명 없음 차어(avgTemp)/10 + 48;         //十位
    출력[1] = (서명 없음 차어(avgTemp)%10 + 48;         //个位
    출력[2] ='.';                                       //小数点
    출력[3] = (서명 없음 차어(avgTemp*10)%10+48;         //十分位
    출력[4] = (서명 없음 차어(avgTemp*100)%10+48;        //百分位
    출력[5] ='';                                      //字符串结束符
   
    Uart0SendString(output);
    Uart0SendString("°C");
    LED1 =1;                          //LED熄灭,表示转换结束,
   
    지연(20000);
    지연(20000);
    지연(20000);
    지연(20000);
    지연(20000);
    지연(20000);
    지연(20000);
    지연(20000);
    지연(20000);
    지연(20000);
  }
}

직렬 포트 통신의 코드 내용은 이전 섹션을 참고하시기 바랍니다. 여기서 설명하지 않겠습니다~

ADC는 일반적으로 6명의 SFR을 포함합니다:

ADCCON1ADC의 일반 제어를 위해 변환 종료 플래그, ADC 트리거 메서드, 난수 생성기 등이 포함됩니다
ADCCON2연속 ADC 변환을 위한 구성 (이 실험은 연속 ADC 변환을 포함하지 않으므로 이 SFR을 사용하지 않습니다)
ADCCON3단일 ADC 변환을 위한 구성, 참조 전압, 해상도, 변환 소스 선택 포함
ADCH[7:0]ADC 변환 결과의 높은 수준, 즉 ADC [13:6]
ADCL[7:2]ADC 변환 결과의 낮은 수준, 즉 ADC [5:0]
ADCCFGAIN0~AIN7, P0.0~P0.7을 ADC 입력으로 사용함 (이 SFR은 이 테스트에서 온칩 온도 센서가 변환 소스로 선택되어 AIN0~AIN7을 포함하지 않으므로 사용되지 않습니다)

(참고: 위의 SFR 세부 사항은 CC2430 중국어 매뉴얼을 참고하시기 바랍니다)

다음으로, 이 부분에 집중해 봅시다getTempurature함수는 온도 값을 얻는 핵심입니다:

(1) 먼저, ADC를 단일 샘플링용으로 설정하세요: ADCCON3=0x3E로 설정하고, 시스템 전압으로 1.25V를 선택하며, 14비트 해상도를 선택하고, ADC 변환 소스로 CC2430 온칩 온도 센서를 선택하세요

(2) ADCCON1 |= 0x30를 설정하여 ADC 트리거 메서드를 수동으로 설정합니다(즉, ADCCON.6=1 시 ADC 전환 시작

(3) 그다음 ADCCON1 |= 0x40로 하여 ADC 단일 변환을 시작하게 한다

(4) 이 명세서를 사용하는 동안(!( ADCCON1 &0x80)) ADC 전환이 끝날 때까지 기다립니다

(5) 변환 결과는 ADCH[7:0](8비트 높이), ADCH [7:2](6비트 낮음)에 저장되며, 다음과 같이 전달됩니다:

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

변환 결과를 값에 저장하세요

(6) 마지막으로 공식을 사용하세요온도= 값*0.06229-311.43, 온도 값을 계산하고 반환합니다

CC2430 팁
마지막 공식이 궁금하겠죠, 왜 일회성 기능인가요? 왜 기울기가 0.06229이고 절정이 211.43인가요? 좋아요, 답변은 이렇습니다:
이 온도 센서는 CC2430 칩 내부에 위치해 있어, 설명서에서 확인할 수 있습니다. 역시 여기 있어전기 사양관련 내용은 이 섹션에서 찾을 수 있으며, 스크린샷은 다음과 같습니다:
이 표는 출력 전압(V)과 온도 센서의 온도(°C)를 설명합니다.
첫 번째로 두 번째 빨간 상자를 보세요:온도 계수。 "계수"? 조금 이상하지 않나요? 그 다음 단위인 mV/°C를 보면 온도와 전압의 관계가 선형임을 갑자기 알 수 있습니다~ 즉:
여기서 V는 출력 전압 값, T는 온도 값, 2.45는 기울기입니다. 인터셉트 b는 아래에서 결정되어야 한다.
처음 보면 첫 번째 빨간 상자에서 0°C의 전압이 743mV이므로, b는 743과 같다는 뜻인가요? 그렇지 않으면 계속 아래를 보면 절대 오차가 최대 8°C에 달합니다! 오른쪽을 보면 이미 가장 적합한 절개를 제공한다는 것을 알 수 있습니다. 즉: b=763이므로 다음 공식이 있습니다:
좋아, 이제 온도 센서가 확보됐어온도 T그리고출력 전압 V다음 단계는 ADC를 찾는 것입니다입력 전압 V그리고출력 값 N(즉, 14비트의 변환 결과), 마지막으로 N과 T의 변환 공식을 구합니다.
변환 결과 N은 14비트이며, N=11 1111 111 1111(이진수)일 때 출력 전압은 최대 값(즉, 기준 전압 1.25V)이어야 합니다. 따라서 다음과 같은 비례 관계를 가집니다:
(참고: 14비트 출력이 이진 보완이므로, 14번째 비트는 심볼 비트입니다.) 따라서 절대적으로 유효 가치는 13비트에 불과하며, 2의 13의 제곱입니다)
두 공식을 결합하면 T와 N의 관계를 도출할 수 있습니다:
오버~

마지막으로, 샘플당 64사이클이 필요한 이유에 대해 몇 마디 하겠습니다. 센서는 온도를 측정할 때 간섭이나 무작위 오차에 노출되기 때문에, 센서가 얻는 데이터는 때때로 과장되기도 합니다(예: 10°C의 갑작스러운 변화 후 즉시 정상으로 돌아오는 경우). 하지만 온도 변화가 필수적인 과정이며, 순간적으로 큰 급변이 일어나는 경우는 드물다는 것을 알고 있습니다. 따라서 이러한 오류를 줄이기 위해 평균법을 사용합니다.

(4) 실험 결과

먼저 시리얼 포트 디버깅 도구를 열고 프로그램을 다운로드하여 실행하면 다음 화면이 나타납니다:

필름 내부 온도는 약 14.5°C입니다. 저자는 자신의 몸으로 기숙사 내 실온을 느낀다. 약 10°C 조금 넘는 온도이다. 칩 내부에 열이 필요해서 14°C가 기본적으로 정상입니다~

이것이 실험의 끝입니다.

3. 결론

이 글에서는 ADC 단일 샘플링의 구현에 대해 설명합니다. 다음 섹션에서는 데이터 전송 모드를 소개할 것입니다DMA(직접 메모리 접근), 즉 "직접 메모리 접근"입니다. ADC/UART/RF 트랜시버와 메모리 장치와 같은 주변 장치는 "DMA 컨트롤러"의 제어 하에 직접 교환할 수 있습니다CPU 개입은 거의 필요 없습니다, 이는 시스템의 전반적인 효율성을 크게 향상시킵니다.

계속 지켜봐 주세요!


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




이전의:지그비 여정 (5): 여러 중요한 CC2430 기본 실험 - 직렬 통신
다음:지그비 여정 (7): 여러 중요한 CC2430 기본 실험 - DMA 전송
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com