打印
[活动专区]

【赛元95F】之五:ADC

[复制链接]
1324|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
      本次实验利用了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滤波电容,数据软件处理时采用必要的滤波算法。

使用特权

评论回复

相关帖子

沙发
598330983| | 2020-4-5 19:22 | 只看该作者
看起来很容易使用ADC模块。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

14989

帖子

17

粉丝