chenyuejian的笔记 https://bbs.21ic.com/?871710 [收藏] [复制] [RSS]

日志

PIC18F4550内部ADC

已有 1172 次阅读2013-2-27 10:28 |系统分类:单片机

主要截取PDF中
而40/44引脚器件的模数转换器则具有13路输入。A/D模块能将一个模拟输入信号转换成相应的10位数字信号。
执行A/D转换时应该遵循以下步骤:
1. 配置A/D模块:
•  配置模拟引脚、参考电压和数字 I/O(通过
ADCON1寄存器)
•  选择A/D输入通道 (通过ADCON0寄存器)
•  选择A/D采集时间 (通过ADCON2寄存器)
•  选择A/D转换时钟 (通过ADCON2寄存器)
•  使能A/D模块 (通过ADCON0寄存器)
2. 需要时,配置A/D中断:
•  清零ADIF位
•  将ADIE位置1
•  将GIE位置1
3. 如果需要,等待所需的采集时间。
4. 启动转换:
•  将GO/DONE位置1(通过ADCON0寄存器)
5. 等待A/D转换完成,通过以下两种方法之一判断
转换是否完成:
•  查询GO/DONE位是否被清零
•  等待A/D中断
6. 读取A/D结果寄存器(ADRESH:ADRESL),需
要时将ADIF位清零。
7. 如需再次进行A/D转换,返回步骤1或步骤2。
将每位的A/D转换时间定义为TAD,在下一次采
集开始前至少需要等待3个TAD。

控制C程序:
开启RA1,模拟入口
#include<adc.h>

void Init_adc(void)
{
    TRISA1 = 1;// input
    //        PORTAbits.AN0=1;
    ADCON1=0x0d;//AIN0,AIN1 was anolog
    ADCON0 |= 0x04;//set 1 channel    
    ADCON2=0x90;// 右对齐 AD 4Tad  Fosc/2 转换时间,采样频率需要弄清楚
    ADCON0bits.ADON=1; // enable ADc
    //PIR1bits.ADIF=0; //enable intrrupt
    ADRES=0x0000;
}
int Get_onetime_ad(void)
{
    unsigned char H=0,L=0;
    ADCON0bits.GO=1;// start convert
    while(ADCON0bits.GO);
    //PIR1bits.ADIF=0;
    H=ADRESH; 
          L=ADRESL;
    return abs((H<<8)+L); //标度变化 0-5V
}
void main()
{
        int temp=0;
        float tmp=0;
        char *buff;
        int state;       
        while(1)
        {                               
                        Init_adc();
                        __delay_ms(10);
                        temp=Get_onetime_ad();
                        tmp=(float)temp;
                        tmp=(tmp*5)/1024;
                        //int数据保存到float中,后做除法
                        buff=ftoa(tmp,&state);
                        Display_char(1,2,"V:      ");
                        Display_char(13,2,buff);
        }
}
需要补充的是:关于Tad,和转换频率,详见PDF中的分析!(待项目深入后再做研究)

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)