本次实验利用了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滤波电容,数据软件处理时采用必要的滤波算法。
|