1. 程式人生 > >TI CC2530 學習筆記-13-NewBit-CC2530-ADC-內部溫度感測器

TI CC2530 學習筆記-13-NewBit-CC2530-ADC-內部溫度感測器

TI CC2530 學習筆記-目錄 功能:使用CC2530的ADC對內部溫度感測器進行取樣,並計算取樣結果所對應的真實值,溫度值通過串列埠傳送,同時翻轉LED燈,CC2530的溫度感測器並不精準,請勿在精度要求在5度以內的場合使用。外界溫度變化不會立刻體現的取樣結果上,如果使用開啟的電烙鐵靠近CC2530,取樣結果會快速發生變化,請儘量不要用手直接接觸CC2530來驗證內部溫度感測器。靜電可能會導致晶片損壞。每1000毫秒對溫度進行一次更新。

  1. 配置溫度感測器等
 halMcuWaitUs(10000);  //等待時間穩定,約10ms
  CLKCONCMD &= ~0x47;   //選擇外部32MHZ時鐘, 不分頻
                        //TICKSPD不改變,保持為0x01,即定時器標記頻率為16MHz
  while( (CLKCONSTA & 0x47) != 0x00 ); //切換時鐘源後再次等待穩定
  P0DIR |= 0x40;    //配置IO為輸出
  /* 初始化串列埠 */
  P0SEL |= 0x0C; //將P02,P03設為外設功能
  PERCFG &= ~0x01;   //串列埠0佔用P02 P03
  U0CSR = 0X80;    //USART模式設為UART模式
  U0UCR = 0x00;    //禁用流控,禁用奇偶檢驗,1位停止位
  U0CSR |= 0x40;    //允許接收
  U0GCR   |= 8;     //9600
  U0BAUD  =  59;
  IEN0 |= 0x04;     //開串列埠0接收中斷
  
  /* 初始化定時器3 */
  T3CTL = 0xE2;   //128分頻(0.125Mhz),模模式
  T3CCTL0 = 0x04; //比較模式
  T3CC0 = 125;    //溢位值
  T3CTL |= 0x08;  //開啟溢位中斷
  T3CCTL0 |= 0x40;//開T3通道0中斷
  T3IE = 1;        //定時器3中斷使能
  T3CTL |= 0x10;  //啟動定時器
  IEN0 |= 0X80;   //開總中斷
  
  /* 溫度感測器初始化 */
  TR0 |= 0x01;//連線溫度感測器到SOC_ADC
  ATEST |= 0x01;  //使能溫度感測器
  LED_R_IO = LED_R_ACTIVE;
  
  /* 取校準用的值*/
  adc = ADCL;
  adc = ADCH;       //清除ADCCON1.EOC標誌  
  ADCCON3 = 0x3E;   //內部參考電壓,12位有效精度,對溫度感測器進行取樣
  while (!(ADCCON1 & 0x80));//等待轉換完成
  gVoltageAtTemp25 = ADCL;//儲存第一次採集的資料,用於後面的校正
  gVoltageAtTemp25 |= (uint16)ADCH << 8;
  gVoltageAtTemp25 >>= 4;//去除低4位
  1. 在while迴圈裡檢測溫度
  while(1)
  {
    /* 檢查是否需要列印 */
    if (gSample == 1)
    {
      gSample = 0;      
      adc = ADCL;
      adc = ADCH;       //清除ADCCON1.EOC標誌
      ADCCON3 = 0x3E;   //內部參考電壓,12位有效精度,對溫度感測器進行取樣
      while (!(ADCCON1 & 0x80));//等待轉換完成
      adcResult = ADCL;
      adcResult |= (uint16)ADCH << 8;
      adcResult >>= 4;//去除低4位
      tResult = 25 + ((float)adcResult - gVoltageAtTemp25) / 4.5;//溫度校正
      tString[0] = (uint16)tResult / 10 + '0';
      tString[1] = (uint16)tResult % 10 + '0';
      tString[2] = 'C';
      tString[3] = '\n';
      halUart0SendString(tString,4);  
      LED_R_TOG();
    }
  }