CC2430 ADC单次采样

    这个实验利用电位器作为模拟输入,ADC进行单次采样,将得到的值和对应的ADC转换数值显示在ADC上,同时让红灯和绿灯闪烁,采样值越大闪烁频率越大。

    主函数如下:

void main(void){
   INT8 adc_value;
   UINT8 potVoltage = 0;
   BOOL updateLCD = TRUE;

   initLcd();
   initAdc();
   
   while(1){
      ADC_ENABLE_CHANNEL(ADC_AIN7);//选择AIN7输入使能
      //ADCCON3=10000111,3.3v参考电压,8位分辨率(实际为7位,有一位无用),信道为7道
      ADC_SINGLE_CONVERSION(ADC_REF_AVDD | ADC_8_BIT | ADC_AIN7);
      ADC_SAMPLE_SINGLE();//启动转换,先使ADCCON1.STSEL[1:0]=11,再令ADCCON1.ST=1启动抓换
      while(!ADC_SAMPLE_READY());//转换完成ADC_SAMPLE_READY()=ADCCON1.EOC=0,往下执行,否则等待
      adc_value = ADCH;//转换完成后,将得到的8位数据给 adc_value

      if (potVoltage != scaleValue(adc_value)){
         //potVoltage changed since last sample
         potVoltage = scaleValue(adc_value);
         updateLCD = TRUE;
      }

      if (updateLCD){
         updateVoltageLCD(potVoltage, adc_value);//显示电压
         updateLCD = FALSE;
      }
      updateCounter(adc_value);//改变led状态
      halWait(10);
   }
}

    初始化ADC:

    void initAdc(void)
{
   SET_MAIN_CLOCK_SOURCE(CRYSTAL);//使用外部32M晶振
  
   //init LEDs
   //p1_0做GPIO口
   LED1 = LED_OFF; IO_DIR_PORT_PIN(1, 0, IO_OUT); P1SEL &= ~0x01; //INIT_GLED();
   //p1_3做GPIO口
   LED3 = LED_OFF; IO_DIR_PORT_PIN(1, 3, IO_OUT); P1SEL &= ~0x08; //INIT_YLED();
   //p0_7作输入模式,用于单次采样的输入
   IO_DIR_PORT_PIN(0, 7, IO_IN);  // INIT_POT();
}
//P0_7作输入,P1_0,P1_3作输出

 

scaleValue函数:

#define VDD 33
// return 10 times sampled voltage
INT8 scaleValue(INT8 adc_value)
{
   //0x0000 = 0V and 0x0F = 3.3V
   float v;

   adc_value = (adc_value > 0 ? adc_value : 0);
   v = ((float)adc_value / (float)0x7F);//3.3v一共被分成(2^7-1=127)分,看占了多少份
   v *= VDD;//若VDD=3.3V,则正常输出,但VDD=33,故十倍输出
   return (INT8)v;//v本是float型,强制转换成int8型
}

lcd显示函数:

void updateVoltageLCD(INT8 potVoltage, INT8 adc_value)
{
   char s[16];
   // potVoltage is 10 times correct voltage
   // print dc value on LCD adc_value      127份中占了多少份(ADC转换数值)
   //此处可以看出为什么要把采样值10倍,为了输出小数点后一位
   sprintf(s, (char*)"%d.%d Volt (%d)",  ((INT16)(potVoltage / 10)), ((INT16)(potVoltage % 10)), adc_value);
   lcdUpdate((char*)" Voltage is:", s);
}

 led闪烁函数:

void updateCounter(INT8 delay)
{
   static UINT8 counter = 0;
   UINT16 i = 0;

   i = ((delay > 0) ? 0x7F - delay : 0x7F);//adc_value越大,delay越大,i越小,那么等待间隔就越小
   halWait( i );

   counter++;

   SET_LED_MASK( (BYTE)counter );//counter每加1次,led3灯状态就变一次,
                                                                 //counter每加100次,led1灯状态就变一次,所以led1会led3频率小
}

可以看出,led1与led3频率不一样
#define SET_LED_MASK( n )                            \
    do {                                             \
        if ((n) & 0x01) LED1 = LED_ON; else LED1 = LED_OFF; \
        if ((n) & 0x04) LED3 = LED_ON; else LED3 = LED_OFF; \
    } while (0)

在这个试验中注意要把P0_7口给接上,作模拟输入之用!

你可能感兴趣的:(CC2430,ADC)