CC2430|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 = https://www.it610.com/article/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 = https://www.it610.com/article/(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_value127份中占了多少份(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频率小
}
【CC2430|CC2430 ADC单次采样】可以看出,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口给接上,作模拟输入之用!

    推荐阅读