【CC2530授課筆記】⑩ ADC 數模轉換,訊號採集,光敏電阻

物聯網張老師發表於2020-11-05

摘要

本篇文章介紹了模擬訊號與數字訊號的區別,以及模擬訊號轉換成數字訊號的方法,通過CC2530程式設計,採集光敏電阻的訊號,通過光強控制LED的亮滅。

在這裡插入圖片描述


在這裡插入圖片描述


在這裡插入圖片描述

在這裡插入圖片描述


在這裡插入圖片描述


在這裡插入圖片描述

在這裡插入圖片描述


在這裡插入圖片描述


在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

下面的連線演示了Sigma-Delta 型ADC的工作原理,有興趣的同學可以看一下:

https://www.analog.com/en/design-center/interactive-design-tools/sigma-delta-adc-tutorial.html#


在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述

完整的原始碼

#include <ioCC2530.h>
#include <stdio.h>

//定義控制燈的埠
#define LED1 P1_0 //定義LED1為P1_0口控制
#define LED2 P1_5 //定義LED2為P1_5口控制
#define LED3 P1_3 //定義LED3為P1_3口控制
#define LED4 P1_4 //定義LED4為P1_4口控制

#define SW1 P1_2        //定義SW1為P1_2埠
#define SW2 P0_1        //定義SW2為P0_1埠

/****************************
//延時
*****************************/
char pause = 0;
void Delay_mS(unsigned int n)
{
 	unsigned int tt,i = 0;
        for(i = 0; i < n; i ++)
   		for(tt = 0; tt<1040; tt++);
   		
        while(pause);
}

void Delay_uS(unsigned int n)
{
  unsigned int i = 0;
  for(;i < n; i++);
}

/****************************
//初始化函式
*****************************/
void Initial(void)
{
      P1DIR = 0xFB;//將P12設為輸入,其他設為輸出 (0xFB = 11111011)
      LED1 = 0;//關閉LED1
      LED2 = 0;//關閉LED2
      LED3 = 1;//關閉LED3
      LED4 = 0;//關閉LED4
      
      P0SEL = 0x0C; //大開P0.2,P0.3的外設功能
      
      CLKCONCMD &= 0x80;
      U0BAUD = 216; //設定波特率115200
      U0GCR = 11;
      
      U0CSR = 0xC0; //選擇UART功能,並使能接收功能
      
      URX0IE = 1; //使能UART0 接收中斷
      EA =1;             // 使能總中斷
}

//重定向Printf函式
__near_func int putchar(int c)
{
    UTX0IF = 0;
    U0DBUF = (char)c;
    while(UTX0IF == 0);
    return(c);
}

void ADC_Init()
{
  APCFG |= 0x01;
  P0SEL |= 0x01;
  P0DIR &= ~0x01;
}

short Get_Adc_Value()
{
  short value = 0;
  ADCIF = 0;
  ADCCON3 = 0xB0; //參考電壓3.3V,512位抽取率
  while(!ADCIF);
  value = ADCH;
  value = value << 8;
  value += ADCL;
  value /=  4;
  return value;
}

void Uart_Send_Str(char * p)
{
  while(*p != 0)
  {
    U0DBUF = *p;
    p++;
    while(UTX0IF == 0);
    UTX0IF = 0;
  }
}

/***************************
//主函式
***************************/
void main(void)
{      
      Initial();  //呼叫初始化函式
      ADC_Init();
      short adc_value = 0;
      while(1)
      {
        adc_value = Get_Adc_Value();
        printf("\r\nThe Adc Value is: %d\r\n", adc_value);
        Delay_mS(1000);
      }
}

相關文章