|
主要特点: 1、12位ADC。 2、8通道单端输入模式。(一次只能测一个通道电压,值都存在ACCRH、ACCRL) 3、内部带隙电压(band-gap voltage)为1.22V,可作为内部参考电压 4、启动方式:软件启动、硬件触发方式启动 ADC模块结构图
实例不多说了,直接贴代码,实现的功能为使用内部参考电压测VCC电压值。 - void main(void)
- {
- uint16_t BandGap_H, BandGap_L, AIN3_H, AIN3_L;
- uint16_t BandGap_v;
- uint32_t AIN3_v = 0;
- uint16_t voltage = 0;
-
- while(1)
- {
- Enable_ADC_BandGap;
- clr_ADCF;
- set_ADCS; // Each time ADC start trig signal
- while(ADCF == 0);
- clr_ADCF;
- set_ADCS; // Each time ADC start trig signal
- while(ADCF == 0);
- clr_ADCF;
- set_ADCS; // Each time ADC start trig signal
- while(ADCF == 0);
- BandGap_H = ADCRH;
- BandGap_L = ADCRL;
- BandGap_v = BandGap_H << 4 | BandGap_L;
- //printf ("\n Value = 0x%bx",ADCRH);
- //printf ("\n Value = 0x%bx",ADCRL);
-
- Enable_ADC_AIN3;
- clr_ADCF;
- set_ADCS; // Each time ADC start trig signal
- while(ADCF == 0);
- AIN3_H = ADCRH;
- AIN3_L = ADCRL;
- AIN3_v = AIN3_H << 4 | AIN3_L;
- //printf ("\n AIN3 Value = 0x%bx",ADCRH);
- //printf ("\n AIN3 Value = 0x%bx",ADCRL);
- voltage = (uint16_t)((uint32_t)AIN3_v * 1220 / BandGap_v );
-
- Timer0_Delay1ms(1000);
- }
- }
注意事项:这里多次测内部产考电压的原因是: 连续(不延时)多次读取band-gap voltage的值 与 单次读取然后延时再次读取到的值不同,而且延时时间不同,读取到的值也不同(相当无语) 例如下面两段代码: - Enable_ADC_BandGap; //Find in "Function_define.h" - "ADC INIT"
- while(1)
- {
- clr_ADCF;
- set_ADCS; // Each time ADC start trig signal
- while(ADCF == 0);
- BandGap_H = ADCRH;
- BandGap_L = ADCRL;
- Timer0_Delay1ms(1000);
- }
- Enable_ADC_BandGap; //Find in "Function_define.h" - "ADC INIT"
- while(1)
- {
- clr_ADCF;
- set_ADCS; // Each time ADC start trig signal
- while(ADCF == 0);
- BandGap_H = ADCRH;
- BandGap_L = ADCRL;
- //Timer0_Delay1ms(1000);
- }
加延时和不加延时读出来的值是不一样的,实测不加延时读出来的比较准确。所以实例中使用的小技巧是连续读3次内部参考电压后再测vcc,当然具体多少次自己定义。
|