这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » PIC18F4550内部ADC

共1条 1/1 1 跳转至

PIC18F4550内部ADC

工程师
2014-09-29 20:09:56     打赏
主要截取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中的分析!(待项目深入后再做研究)

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]