本次实验利用了SC95F8617内部的12位高精度1M 高速ADC,在17路ADC中第15通道通过一只2K微调电阻采集外部电压,然后将采集的数据通过串口模块发送至PC端,利用SSCOM V5.13.1串口调试助手显示。
一、实验资源
1、SC95F8617 demo板;
2、SC-LINK;
3、Keil C51 V9.60;
4、串口模块;
5、SSCOM V5.13.1串口调试助手
6、2K可调电阻;
二、相关资源简介
SC95F8617内部集成有17路12位高精度1M 高速ADC,内部1路连接至1/4VDD,另外16路与外部IO复用。可通过“Code Option”对VDD、内部2.048V、内部1.024V三种参考电压进行选择。通过ADCCON寄存器配置可以对采集通道进行选择;ADCCFG2[4:2]可设置ADC采样时间进行设置;采集结果的高8位存放于ADCVH、低4位存放于ADCVL的高4位,这相当于是“左对齐”吧。
三、程序实现
ADC单通道采集相对还是比较简单的,程序同样参考了官方DEMO。串口函数做了小的修改,使用了“printf()”库函数,重写了“putchar()”重定义函数。
ADC配置、中断等:
void ADC_Config(void)
{
ADCCON = 0X8f; //开启ADC,ADCIS[4:0]=11111:ADC输入为1/4VDD 可用于测量电源电压
//ADCCFG2 = 0x40; //LOWSP[2:0]=100 采样时间为3个系统时钟 约100ns@fSYS=32MHz
ADCCFG1 = 0X80; //设置AIN15(P43) 作为采样口
EADC = 1; //开启ADC中断
EA = 1;
}
unsigned int Get_ADC_Value(void)
{
ADCCON |= 0X40; //ADCS=1 触发ADC转换
while(!ADC_Convert_Flag);
ADC_Convert_Flag = 0;
ADC_Value = (ADCVH<<4)+(ADCVL>>4);
return ADC_Value;
}
void ADC_INT(void) interrupt 6
{
ADCCON &= ~(0X20); //清中断标志位
ADC_Convert_Flag = 1;
}
putchar()函数重定义:
char putchar(char ch)
{
SBUF = ch;
while(!TI);
TI = 0;
return ch;
}
主函数:
void main(void)
{
Uart0_Config();
ADC_Config();
printf("\nSC95F8617 ADC_TEST");
while(1)
{
printf("\nADC_Convert_Value = %d",Get_ADC_Value());
delayms(1000);
}
}
Option选择Vref为“VDD”
四、实验结果
五、总结
本实验是ADC最简单、最基础的实验,只是实现了最基本的模块功能。实际应用中对于ADC参考电压可以选择内部2.048V或1.024V,并在ADC采样输入端对地增加10n滤波电容,数据软件处理时采用必要的滤波算法。
|