|
ADC部分
- #include "SYSCFG.h"
- #include "delay.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- uint res=0; //
- //ADC初始化
- void ADC_INITIAL (void)
- {
- ANSEL = 0B00000100; //1->关闭上下拉及数字输入
- //使能AN2为模拟输入
- ADCON1 = 0B01100000;
- //bit7 DIVS ADC分频时钟源 0->sysclk 1->LIRC
- //bit[6:4] ADC转换时钟 110->sysclk/64
-
- ADCON0 = 0B11001001;
- //Bit7: ADFM=1,结果右对齐 0左对齐
- //Bit[6:5]: VCFG参考电压
- // 00-参考电压VDD
- // 01-参考电压内部2V
- // 10-参考电压内部3V
- // 11-参考电压Vref
- //Bit[4:2]: CHS=010-选择AN2通道
- //Bit1: GO/DONE,AD转换状态位1启动转换 0转换完成
- //Bit0: ADC使能 1开 0关
-
- delay_us(200); //打开ADC模块后,需等待ADC稳定时间Tst(~15us);当选择内部参考电压时需等待内部参考电压的稳定时间Tvrint(~450us)
- delay_us(200);
- delay_us(50);
- }
- //读取通道ADC值
- uint GET_ADC_DATA (uchar AN_CH)
- {
- uchar ADCON0_buff; //ADCN0参数缓冲
- uint ADC_value = 0; //ADC值
- uint ADC_DATA=0; //ADC数据
-
- ADCON0_buff = ADCON0 & 0B11100011;//清空通道值 bit[4:2]000
- AN_CH <<=2; //2通道为010 左移2位为 01000
- ADCON0_buff |= AN_CH; //Bit[4:2]:CHS=010,选择AN2通道
- ADCON0 = ADCON0_buff; //重新加载通道值
- delay_us(2);
- //TACQ延时2us,外部串联电阻小于21kΩ
- //TACQ延时4us,外部串联电阻43kΩ
- //TACQ时间:必做,通道切换到GO/DONE置1的时间,保证内部 ADC 输入电容充满。
- //TACQ > 0.09*(R+1)us;R为外部串联电阻(kΩ),串联电阻越小越好,最大不要超过50kΩ
-
- GO_DONE = 1; //启动ADC
- //采样保持时间Tsysclk/N (N=2 for 2T,4 for 4T)
- NOP();
- NOP();
- while( GO_DONE==1 ); //等待ADC转换完成
- //从GO_DONE = 1 ---> GO_DONE = 0,转换过程需要13.5TAD ~14.5TAD
- //TAD(us)与转换时钟Fosc/ADCS[2:0]有关
-
- ADC_DATA = ADRESH; //ADC结果高8位
- ADC_DATA <<=8; //左移8位,准备或上ADC结果低8位
- ADC_DATA |= ADRESL; //或上ADC结果低8位 10Bit ADC整合
- ADC_value = ADC_DATA;
-
- return ADC_value; //返回ADC值
- }
- //ADC转换
- void ADC_convert(uchar chn)
- {
- uchar j=0;
- uint k=0; //定义变量
- for(j=0;j<30;j++) //循环测30次
- {
- k=k+GET_ADC_DATA (chn); //累加
- }
- res=(k*10UL)/1024; //转换成显示电压
- //参考电压是3V 100倍就是300 上面测了30次,这里只要10倍
- }
复制代码 |
|