主要特点:

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,当然具体多少次自己定义。

实验结果

vcc万用表测得的电压为3.3v,adc测得的电压为3.27v左右,误差30mv左右。

最后说一句,假如vcc不固定的,想用内部参考电压,但要求精度高的方案,慎用这款mcu

 

也许有错误,望大家指正,不胜感激!

 

版权声明:本文为博主原创文章,转载请注明出处。 

链接:https://blog.csdn.net/Huangxuesi/article/details/81124450
<https://blog.csdn.net/Huangxuesi/article/details/81124450>

 

 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信