[牛人杂谈] N76E003 ADC使用方法

[复制链接]
3631|20
 楼主| 643757107 发表于 2018-9-14 18:27 | 显示全部楼层 |阅读模式
主要特点:

1、12位ADC。

2、8通道单端输入模式。(一次只能测一个通道电压,值都存在ACCRH、ACCRL)

3、内部带隙电压(band-gap voltage)为1.22V,可作为内部参考电压

4、启动方式:软件启动、硬件触发方式启动

ADC模块结构图 790865b9b8cd0d2505.png
实例

不多说了,直接贴代码,实现的功能为使用内部参考电压测VCC电压值。

  1. void main(void)
  2. {
  3.     uint16_t BandGap_H, BandGap_L, AIN3_H, AIN3_L;
  4.     uint16_t BandGap_v;
  5.     uint32_t AIN3_v = 0;
  6.         uint16_t voltage = 0;
  7.        
  8.     while(1)
  9.     {
  10.         Enable_ADC_BandGap;               
  11.             clr_ADCF;
  12.             set_ADCS;                                // Each time ADC start trig signal
  13.             while(ADCF == 0);
  14.         clr_ADCF;
  15.             set_ADCS;                                // Each time ADC start trig signal
  16.             while(ADCF == 0);
  17.         clr_ADCF;
  18.             set_ADCS;                                // Each time ADC start trig signal
  19.             while(ADCF == 0);
  20.             BandGap_H = ADCRH;
  21.             BandGap_L = ADCRL;
  22.             BandGap_v = BandGap_H << 4 | BandGap_L;
  23.             //printf ("\n Value = 0x%bx",ADCRH);
  24.             //printf ("\n Value = 0x%bx",ADCRL);
  25.        
  26.             Enable_ADC_AIN3;
  27.             clr_ADCF;
  28.             set_ADCS;                                // Each         time ADC start trig signal
  29.             while(ADCF == 0);
  30.             AIN3_H = ADCRH;
  31.             AIN3_L = ADCRL;
  32.             AIN3_v = AIN3_H << 4 | AIN3_L;
  33.             //printf ("\n AIN3 Value = 0x%bx",ADCRH);
  34.             //printf ("\n AIN3 Value = 0x%bx",ADCRL);
  35.             voltage = (uint16_t)((uint32_t)AIN3_v * 1220 / BandGap_v );

  36.         Timer0_Delay1ms(1000);
  37.     }
  38. }
注意事项:

这里多次测内部产考电压的原因是:

连续(不延时)多次读取band-gap voltage的值 与 单次读取然后延时再次读取到的值不同,而且延时时间不同,读取到的值也不同(相当无语)

例如下面两段代码:

  1. Enable_ADC_BandGap;                        //Find in "Function_define.h" - "ADC INIT"
  2. while(1)
  3. {
  4.     clr_ADCF;
  5.     set_ADCS;                                        // Each time ADC start trig signal
  6.     while(ADCF == 0);
  7.     BandGap_H = ADCRH;
  8.     BandGap_L = ADCRL;
  9.     Timer0_Delay1ms(1000);
  10. }
  1. Enable_ADC_BandGap;                                                //Find in "Function_define.h" - "ADC INIT"
  2. while(1)
  3. {
  4.     clr_ADCF;
  5.     set_ADCS;                                                        // Each time ADC start trig signal
  6.     while(ADCF == 0);
  7.     BandGap_H = ADCRH;
  8.     BandGap_L = ADCRL;
  9.     //Timer0_Delay1ms(1000);
  10. }

加延时和不加延时读出来的值是不一样的,实测不加延时读出来的比较准确。所以实例中使用的小技巧是连续读3次内部参考电压后再测vcc,当然具体多少次自己定义。



 楼主| 643757107 发表于 2018-9-14 18:28 | 显示全部楼层
实验结果
vcc万用表测得的电压为3.3v,adc测得的电压为3.27v左右,误差30mv左右。
当然可能万用表不准,25元包邮的那种。
734774645 发表于 2018-9-14 19:27 | 显示全部楼层
一般不用参考,如果不是要标准电压呢,比如测的是其他量的变化导致的,那直接用VCC参考,反正怎么波动都是同步的,比例是一样的。
mintspring 发表于 2018-9-14 20:10 | 显示全部楼层
那个是你非要想知道具体电压采用的内部参考。
huangcunxiake 发表于 2018-9-15 18:49 | 显示全部楼层
ADC用好了,那简直太神奇了。
xinxianshi 发表于 2018-9-15 23:58 | 显示全部楼层
各种滤波用起来嗨皮。
antusheng 发表于 2018-9-16 16:37 | 显示全部楼层
用法好多啊。查询中断,能否DMA?
antusheng 发表于 2018-9-16 16:37 | 显示全部楼层
貌似003不能DMA,M0的可以
wanduzi 发表于 2018-9-18 23:59 | 显示全部楼层
学习,谢谢。
15228869197 发表于 2018-10-25 11:16 | 显示全部楼层
voltage = (uint16_t)((uint32_t)AIN3_v * 1220 / BandGap_v );
这个转换方式是怎么来的
yiy 发表于 2018-10-25 15:09 | 显示全部楼层
15228869197 发表于 2018-10-25 11:16
voltage = (uint16_t)((uint32_t)AIN3_v * 1220 / BandGap_v );
这个转换方式是怎么来的

这个是手册规定的吧
yiy 发表于 2018-10-25 15:09 | 显示全部楼层
我觉得那个强制类型转换的意思就是方便数据格式转换。比如小数点后的控制
hanzhen654 发表于 2018-10-25 20:15 | 显示全部楼层
跟32 的ADC 类似吧?用起来不知道差别大不大?
hanzhen654 发表于 2018-10-25 20:16 | 显示全部楼层
12位ADC 可以满足一般的场合了
15228869197 发表于 2018-10-29 16:36 | 显示全部楼层
BandGap_v = BandGap_H << 4 | BandGap_L;
BandGap_v 这个带隙电压值读出来为什么不是4095呢,我读出了相差有点大
寂静的火 发表于 2018-11-14 14:27 | 显示全部楼层
本帖最后由 寂静的火 于 2018-11-14 14:28 编辑

这神奇的操作,,还好看到了,,正准备用呢
huangcunxiake 发表于 2018-11-14 14:57 | 显示全部楼层
我去,带隙电压测量,前两次是要丢弃?终于看懂为何重复操作了。
jiekou001 发表于 2018-11-15 16:24 | 显示全部楼层
外部接口测一次就准吗
杨德金 发表于 2019-1-23 23:07 | 显示全部楼层
kongabc 发表于 2019-1-26 17:23 | 显示全部楼层
你好 请问一下ADC采样的值怎么可以看出来???或者怎么在串口软件的显示出来?谢谢 刚刚学不太懂
您需要登录后才可以回帖 登录 | 注册

本版积分规则

223

主题

3972

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部