N76E003 ADC使用方法

主要特点:

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

 

 

  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是N76E003芯片的ADC代码示例: ```c #include <stdio.h> #include "N76E003.h" // ADC输入通道 #define ADC_CH 3 void adc_init(void) { // 设置ADC时钟 clr_ADCF; set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCEN; } unsigned int adc_read(void) { // 选择输入通道 ADCCON1 &= 0xF8; ADCCON1 |= ADC_CH; // 启动ADC转换 clr_ADCF; set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 set_ADCS; // ADC时钟 = 系统时钟 / 8 while(!ADCF); return ADCRH << 8 | ADCRL; } int main() { adc_init(); while(1) { printf("ADC value: %d\n", adc_read()); } return 0; } ``` 需要注意的是,N76E003芯片的ADC精度为10位,最大输入电压为VDD。ADC时钟的频率需要根据具体情况进行调整,以保证ADC转换精度和速度的平衡。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值