本帖最后由 1028844836 于 2019-8-13 18:00 编辑
18.1.4 带隙电压(Band-gap) 输入应用
N76E003的ADC可以选择内部Band-gap电压作为输入脚,能用来反推ADC的参考电压,得到更精准的
ADC结果。
常温下,所有N76E003的Band-gap电压值会校准在1.17V ~ 1.27 V内。如果想要知道每颗N76E003的
Band-gap实际电压值,可以通过读取UID地址后的2个bytes值来确认。UID 后的2个bytes储存Band-gap
的实际值,总共12个有效bit。第一个byte是高8位,第二个byte的低4位为12 bit的低4位。
读取和计算步骤
用读取UID的方式,以IAP 读取Band-gap的值为例
2. 合并高8位和低4位
3. 使用下列公式换算成实际的电压值:
计算公式:
计算范例:
读取UID地址后的2个字节,第一个字节值为0x64,第二个字节值为0x0E,合并为0x64E = 1614,换算电压值结果为:
例程如下:
#define set_IAPEN BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CHPCON|=SET_BIT0 ;EA=BIT_TMP #define set_IAPGO BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;IAPTRG|=SET_BIT0 ;EA=BIT_TMP #define clr_IAPEN BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CHPCON&=~SET_BIT0;EA=BIT_TMP void READ_BANDGAP() { UINT8 BandgapHigh,BandgapLow; Set_IAPEN; // Enable IAPEN IAPAL = 0x0C; IAPAH = 0x00; IAPCN = 0x04; set_IAPGO; // Trig set IAPGO BandgapHigh = IAPFD; IAPAL = 0x0d; IAPAH = 0x00; IAPCN = 0x04; set_IAPGO; // Trig set IAPGO BandgapLow = IAPFD; BandgapLow = BandgapLow&0x0F; Clr_IAPEN; // Disable IAPEN Bandgap_Value = (BandgapHigh<<4)+BandgapLow; Bandgap_Voltage = 3072/(0x1000/Bandgap_Value);
}
用读取到的Band-gap值通过ADC计算VDD值:
根据ADC转换出的带隙电压值,与满量程ADC的比例关系,乘以读取到的实际带隙电压值,可以算出VDD。
对于N76E003,为了得到更准确的内部带隙电压(band-gap)输入ADC转换值,建议在读取时,放弃模块使能后的头三笔资料。而后,只要不关闭ADC模块,ADC转换结果都是如规格所列。提醒:程序中如果关闭了ADC模块,请记得下次打开时,需要再次丢弃3笔。
double Bandgap_Voltage,VDD_Voltage; void ADC_Bypass (void) // The first three times convert should be bypass { unsigned char ozc; for (ozc=0;ozc<0x03;ozc++) { clr_ADCF; set_ADCS; while(ADCF == 0); } } void main (void) { double bgvalue; READ_BANDGAP(); Enable_ADC_BandGap; ADC_Bypass(); clr_ADCF; set_ADCS; while(ADCF == 0); bgvalue = (ADCRH<<4) + ADCRL; VDD_Voltage = (0xFFF/bgvalue)*Bandgap_Voltage; printf ("\n Bandgap voltage = %e", Bandgap_Voltage); printf ("\n VDD voltage = %e", VDD_Voltage); while(1); }
以上内容为中文版 规格书191页内容
为什么这个打印的VDD 和实际相差巨大 。 而且这份文档中的代码到底能不能直接用。
|