欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1653|回復(fù): 28
打印 上一主題 下一主題
收起左側(cè)

STC15W408AS 利用bandgap計(jì)算VCC電壓不準(zhǔn)確的問(wèn)題

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:705846 發(fā)表于 2025-12-28 16:49 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

STC15W408AS 利用bandgap計(jì)算VCC電壓。 我的VCC電壓是5V,但計(jì)算出來(lái)確實(shí)9.3V,請(qǐng)大家?guī)兔纯创a問(wèn)題。謝謝

//初始化ADC
void AdInit()
{       
        P1ASF = 0x00;
        ADC_RES = 0;        ADC_RESL = 0;                                        //清除ADC結(jié)果寄存器
        ADC_CONTR = 0x88;
        _nop_();_nop_();
        ADC_CONTR |= 0x08;
        delay_ms(20);                                                                                                //等待ADC穩(wěn)定
        EADC = 1;                                                                                                 //允許AD轉(zhuǎn)換中斷
}


unsigned int read_bandgap_voltage(){
        uchar idata *iptr;                                //定義RAM內(nèi)存區(qū)指針
        iptr = ID_ADDR_RAM;
        bandgap=*iptr++;
        bandgap<<=8;
        bandgap+=*iptr;                                                //從內(nèi)存區(qū)讀取BandGap電壓值(單位毫伏)
        return bandgap;
}


void adc_isr() interrupt 5{
                ADC_CONTR &= ~0x10;               
               adc_val=(ADC_RES<<2)|(ADC_RESL);
              VFt=(float)((long)(read_bandgap_voltage()*1024)/adc_val);  
           //VFt的電壓值與實(shí)際VCC電壓值相差甚遠(yuǎn),是什么問(wèn)題引起的。       
               
                                ADC_CONTR = 0x88;
                                _nop_();_nop_();_nop_();_nop_();        //等待四個(gè)機(jī)器周期
                                while(!(ADC_CONTR&ADC_FLAG));

}

VFt的值是9.3V,
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:327265 發(fā)表于 2025-12-29 12:39 | 只看該作者
添加一個(gè)基準(zhǔn)電壓比較再采集計(jì)算
回復(fù)

使用道具 舉報(bào)

板凳
ID:327265 發(fā)表于 2025-12-29 12:40 | 只看該作者
添加一個(gè)基準(zhǔn)電壓再采樣計(jì)算
回復(fù)

使用道具 舉報(bào)

地板
ID:705846 發(fā)表于 2025-12-29 19:24 | 只看該作者
經(jīng)過(guò)反復(fù)排查
void adc_isr() interrupt 5{
                ADC_CONTR &= ~0x10;               
                     uint vcc_voltage=(float)(5.0*bandgap/adc_val);

     串口打印出來(lái) bandgap是D7, adc_val是02, vcc_voltage結(jié)果是十進(jìn)制24, 為什么vcc_voltate不是十進(jìn)制537呢。

回復(fù)

使用道具 舉報(bào)

5#
ID:624769 發(fā)表于 2025-12-29 20:51 | 只看該作者
保存在 RAM 的 基準(zhǔn)點(diǎn)壓參考值,開(kāi)機(jī)后有可能被改寫(xiě),建議從 CODE中讀取。 或者,開(kāi)機(jī)后,優(yōu)先讀取 RAM中的參考值,再執(zhí)行其他代碼。
回復(fù)

使用道具 舉報(bào)

6#
ID:163139 發(fā)表于 2025-12-29 21:55 | 只看該作者
請(qǐng)教:STC15W408AS如何使用外部基準(zhǔn)電壓,接哪個(gè)引腳,還是P1口隨便接?
回復(fù)

使用道具 舉報(bào)

7#
ID:163139 發(fā)表于 2025-12-29 21:57 | 只看該作者
請(qǐng)教:stc15w408as如何使用外部基準(zhǔn)電壓?
回復(fù)

使用道具 舉報(bào)

8#
ID:1152330 發(fā)表于 2025-12-30 08:31 | 只看該作者
這里提出另外一個(gè)問(wèn)題:計(jì)算讀取的電壓時(shí),1024應(yīng)該為1023,STC手冊(cè)中給出的是1024,也是錯(cuò)誤的。請(qǐng)大家討論。
回復(fù)

使用道具 舉報(bào)

9#
ID:155507 發(fā)表于 2025-12-30 19:05 | 只看該作者
shuiquan3 發(fā)表于 2025-12-29 21:55
請(qǐng)教:STC15W408AS如何使用外部基準(zhǔn)電壓,接哪個(gè)引腳,還是P1口隨便接?

A/D 轉(zhuǎn)換模塊的參考電壓源
STC15 系列單片機(jī)的參考電壓源是輸入工作電壓 Vcc,所以一般不用外接參考電壓源。如 7805 的輸
出電壓是 5V,但實(shí)際電壓可能是 4.88V 到 4.96V,用戶(hù)需要精度比較高的話(huà),可在出廠(chǎng)時(shí)將實(shí)際測(cè)出的
工作電壓值記錄在單片機(jī)內(nèi)部的 EEPROM 里面,以供計(jì)算。
如果有些用戶(hù)的 Vcc 不固定,如電池供電,電池電壓在 5.3V--4.2V 之間漂移,則 Vcc 不固定,就需
要在 8 路 A/D 轉(zhuǎn)換的一個(gè)通道外接一個(gè)穩(wěn)定的參考電壓源,來(lái)計(jì)算出此時(shí)的工作電壓 Vcc,再計(jì)算出其
他幾路 A/D 轉(zhuǎn)換通道的電壓。如下圖所示,可在 ADC 轉(zhuǎn)換通道的第二通道外接一個(gè) 2.5V( 或 1V,或...)
的基準(zhǔn)參考電壓源,由此求出此時(shí)的工作電壓 Vcc,再計(jì)算出其它幾路 A/D 轉(zhuǎn)換通道的電壓( 理論依據(jù)
是短時(shí)間之內(nèi), Vcc 不變)。





回復(fù)

使用道具 舉報(bào)

10#
ID:1133081 發(fā)表于 2026-1-1 21:06 | 只看該作者
samxon 發(fā)表于 2025-12-29 19:24
經(jīng)過(guò)反復(fù)排查
void adc_isr() interrupt 5{
                ADC_CONTR &= ~0x10;               

//                當(dāng)前VCC_mV = 標(biāo)準(zhǔn)電壓mV * 標(biāo)準(zhǔn)電壓BandGap轉(zhuǎn)換值 / 當(dāng)前電壓BandGap轉(zhuǎn)換值
                VCC        = 5000       * (long)BGV5            / BGVx;
回復(fù)

使用道具 舉報(bào)

11#
ID:891686 發(fā)表于 2026-1-2 01:14 | 只看該作者
測(cè)量 VCC 的步驟:
① 給定一個(gè)比較精確的電源電壓 VCCA ,得到 BandGap (間隙基準(zhǔn)源)的 ADC 讀數(shù) BGVA。據(jù)此可計(jì)算出 BandGap 的基準(zhǔn)電壓 VBG 。
② 當(dāng)電源電壓為 VCCX 時(shí),得到另一個(gè) BandGap 的 ADC 讀數(shù)為 BGVX。則 VCCX = BGVX * VBG / BGVA 。

10 位 ADC  的值范圍為:0x000 ~ 0x3FF (十進(jìn)制:0~1023)。
假設(shè) VCCA = 5.00V,間隙基準(zhǔn)源的基準(zhǔn)電壓為 VBG = 1.25V,則 BGVA 的值為:1.25V / 5.00V * 1023 = 255.75。
四舍五入得到 256。即此時(shí)的 ADC 讀數(shù)應(yīng)為 BGVA = 0x100 (十進(jìn)制:256)。

假設(shè)在待測(cè)電源電壓下 BandGap 的 ADC 讀數(shù)為 BGVX = 0x266 (十進(jìn)制:614),
則 VCCX = BGVX * VBG / BGVA = 614 * 1.25 / 256 = 2.998V

【說(shuō)明】
① 注意到測(cè)量 VBG 時(shí),ADC 的量化作用導(dǎo)致了測(cè)量誤差:5.00V * 256 / 1023 = 1.251222V 。為提高測(cè)量精度,可用不同的 VCCA 進(jìn)行測(cè)量,然后對(duì)計(jì)算出的 VBG 值求平均作為 VBG 的 “精確” 值。

② 注意到 10位 ADC 的讀數(shù)需要三個(gè) Nibble(半字節(jié)),比較方便的類(lèi)型為雙字節(jié)的無(wú)符號(hào)整數(shù)(可以定義為 UInt16)。
以上述假設(shè)的數(shù)據(jù)為例:
UInt16 BGVA = 0x0100、UInt16 BGVX = 0x0266、float VBG = 1.25;
float VCCX = (float) BGVX * VBG / (float) BGVA 。
假設(shè)要用 UInt16 來(lái)表示 VCCX ,可以先將 VCCX 乘以一個(gè)適當(dāng)?shù)某?shù) (float) C,以保留足夠的輸出精度:
UInt16 Result = (UInt16) (VCCX * C) 。
若最大 VCCA = 5.5V 時(shí),輸出為 0xFFFF,則 C 可取為 65535 / 5.5 = 11915.4545454545 。
回復(fù)

使用道具 舉報(bào)

12#
ID:705846 發(fā)表于 2026-1-2 17:37 | 只看該作者
Jack315 發(fā)表于 2026-1-2 01:14
測(cè)量 VCC 的步驟:
① 給定一個(gè)比較精確的電源電壓 VCCA ,得到 BandGap (間隙基準(zhǔn)源)的 ADC 讀數(shù) BGVA ...

VCC供電是5V, 以下代碼還是無(wú)法獲取到真實(shí)電壓值。請(qǐng)大家?guī)兔纯词鞘裁磫?wèn)題導(dǎo)致的。


void AdInit()
{       
        P1ASF = 0x00;
        ADC_RES = 0;        ADC_RESL = 0;
        CLK_DIV = 0x20;                                                                        
        ADC_CONTR = 0x88;
        _nop_();_nop_();
        ADC_CONTR |= 0x08;
        delay_ms(20);
        EADC = 1;
}

unsigned int read_bandgap_voltage(){
        return (*(unsigned char idata *)ID_ADDR_RAM <<8) |*(unsigned char idata *)(ID_ADDR_RAM + 1);
}

void adc_isr() interrupt 5{

        uint adc_val=(ADC_RES*256+ADC_RESL);
        uint vcc_voltage=5.0*((float)read_bandgap_voltage()/(float)adc_val);

        P1ASF=0x00;
        ADC_CONTR = 0x88|0x00;
        _nop_();_nop_();_nop_();_nop_();        //等待四個(gè)機(jī)器周期
        while(!(ADC_CONTR&ADC_FLAG));
        ADC_CONTR &=~ADC_FLAG;
}
回復(fù)

使用道具 舉報(bào)

13#
ID:891686 發(fā)表于 2026-1-3 11:04 | 只看該作者
中斷函數(shù) adc_isr() 中:
adc_val 值是多少?
read_bandgap_voltage() 函數(shù)的返回值是多少?
最后得到的 vcc_voltage 是多少?

能不能上傳一個(gè) STC15W408AS 的數(shù)據(jù)手冊(cè),或給個(gè)鏈接。
想具體看看 BandGap 和 ADC 相關(guān)部分的硬件結(jié)構(gòu)和編程信息。

回復(fù)

使用道具 舉報(bào)

14#
ID:1133081 發(fā)表于 2026-1-3 11:14 | 只看該作者
samxon 發(fā)表于 2026-1-2 17:37
VCC供電是5V, 以下代碼還是無(wú)法獲取到真實(shí)電壓值。請(qǐng)大家?guī)兔纯词鞘裁磫?wèn)題導(dǎo)致的。

測(cè)量ADC的第9通道推算VCC電壓計(jì)算INV.rar (19.65 KB, 下載次數(shù): 0)



回復(fù)

使用道具 舉報(bào)

15#
ID:705846 發(fā)表于 2026-1-4 09:43 | 只看該作者
Jack315 發(fā)表于 2026-1-3 11:04
中斷函數(shù) adc_isr() 中:
adc_val 值是多少?
read_bandgap_voltage() 函數(shù)的返回值是多少?

串口打印出來(lái), adc_val值是0x02, read_bandgap_voltage()值是0x04D7, 反正最后得到的就不是VCC的真實(shí)電壓。謝謝。
回復(fù)

使用道具 舉報(bào)

16#
ID:705846 發(fā)表于 2026-1-4 12:59 | 只看該作者
這個(gè)讀取BGV 的地址為什么不是0xef ,而是0x0000呢

我定義的地址是#define ID_ADDR_RAM 0xef                                //BandGap地址

#define IAP_ADDRESS 0x0000                                //測(cè)試地址
回復(fù)

使用道具 舉報(bào)

17#
ID:1133081 發(fā)表于 2026-1-4 16:37 | 只看該作者
發(fā)表于 2026-1-4 12:59
這個(gè)讀取BGV 的地址為什么不是0xef ,而是0x0000呢

我定義的地址是#define ID_ADDR_RAM 0xef                                //BandG ...

STC15W408AS的EEPROM共有10個(gè)扇區(qū),各扇區(qū)首地址分別為0x0000、0x0200、0x0400......。BGV就2個(gè)字節(jié)的數(shù)據(jù),只要沒(méi)搞錯(cuò)你愛(ài)存哪里都可以。BGV不是憑空來(lái)的,必須是此芯片在某特定電源電壓下測(cè)得的。這與STC8系列有所不同。STC8系列出廠(chǎng)時(shí)已將內(nèi)部1.19V參考信號(hào)源電壓值保存在指定地址:BGV = (int idata *)0xef;,前者保存的是ADC轉(zhuǎn)換值,后者保存的是電壓值,易混淆。后期處理不當(dāng)會(huì)出錯(cuò)。
回復(fù)

使用道具 舉報(bào)

18#
ID:891686 發(fā)表于 2026-1-5 00:10 | 只看該作者
samxon 發(fā)表于 2026-1-4 09:43
串口打印出來(lái), adc_val值是0x02, read_bandgap_voltage()值是0x04D7, 反正最后得到的就不是VCC的真實(shí)電 ...

10-位 ADC 的值范圍為 0x0000 ~ 0x03FF。0x04D7 不是一個(gè)有效的 ADC 數(shù)據(jù)。
說(shuō)明:
① 數(shù)據(jù)本身錯(cuò)誤,或者
② read_bandgap_voltage() 中的代碼有問(wèn)題。
回復(fù)

使用道具 舉報(bào)

19#
ID:705846 發(fā)表于 2026-1-5 11:12 | 只看該作者
WL0123 發(fā)表于 2026-1-4 16:37
STC15W408AS的EEPROM共有10個(gè)扇區(qū),各扇區(qū)首地址分別為0x0000、0x0200、0x0400......。BGV就2個(gè)字節(jié)的數(shù) ...

STC15W408AS 讀取0xef  的值為0x04D7, 明顯是 1239mv,這個(gè)應(yīng)該怎樣處理。謝謝。


#define ID_ADDR_RAM 0xef                                //BandGap地址
unsigned int read_bandgap_voltage(){
        return (*(unsigned char idata *)ID_ADDR_RAM <<8) |*(unsigned char idata *)(ID_ADDR_RAM + 1);
}
回復(fù)

使用道具 舉報(bào)

20#
ID:1133081 發(fā)表于 2026-1-5 13:32 | 只看該作者
samxon 發(fā)表于 2026-1-5 11:12
STC15W408AS 讀取0xef  的值為0x04D7, 明顯是 1239mv,這個(gè)應(yīng)該怎樣處理。謝謝。

STC15W408AS 讀取0xef  的值為0x04D7,你憑什么說(shuō) 明顯是 1239mv。你根據(jù)什么理由或資料證明地址0xef 里的數(shù)據(jù)是內(nèi)部參考電壓值?STC15W用戶(hù)手冊(cè)哪里有此說(shuō)明?官方示例程序也沒(méi)有類(lèi)似應(yīng)用。不可能憑空找一個(gè)數(shù)據(jù)就能得到正確結(jié)果。
回復(fù)

使用道具 舉報(bào)

21#
ID:883242 發(fā)表于 2026-1-5 21:08 來(lái)自觸屏版 | 只看該作者
samxon 發(fā)表于 2025-12-29 19:24
經(jīng)過(guò)反復(fù)排查
void adc_isr() interrupt 5{
                ADC_CONTR &= ~0x10;               

如果read_bandgap_voltage()讀到的0x4d7是Vbg的mV數(shù),那么這句:
(long)(read_bandgap_voltage()*1024)/adc_val);
就是對(duì)的,現(xiàn)在的問(wèn)題是adc_val應(yīng)該在255左右,檢查下為什么這個(gè)值錯(cuò)的離譜吧!
回復(fù)

使用道具 舉報(bào)

22#
ID:891686 發(fā)表于 2026-1-5 22:09 | 只看該作者
samxon 發(fā)表于 2026-1-5 11:12
STC15W408AS 讀取0xef  的值為0x04D7, 明顯是 1239mv,這個(gè)應(yīng)該怎樣處理。謝謝。

假設(shè) 0x04D7 (十進(jìn)制:1239) 是間隙基準(zhǔn)源的電壓值 (1239mV),則讀取這個(gè)電壓值的代碼可以改成:
  1. float read_bandgap_voltage()
  2. {
  3.                 unsigned int bg_voltage;

  4.                 bg_voltage = *(unsigned char idata *)ID_ADDR_RAM << 8;
  5.                 bg_voltage |= *(unsigned char idata *)(ID_ADDR_RAM + 1);

  6.                 return (float) bg_voltage / 1000.0;
  7. }
復(fù)制代碼
這段代碼應(yīng)該就能得到間隙基準(zhǔn)源的電壓值為 1.239V ,與典型值 1.25V 相比,這個(gè)值的相對(duì)誤差為 0.88%,是個(gè)合理的值。

“adc_val 值是 0x02” :這個(gè)數(shù)據(jù)應(yīng)該是雙字節(jié),所以這個(gè)數(shù)據(jù)是有問(wèn)題的。假設(shè)完整的數(shù)據(jù)是 adc_val = 0x0102 (十進(jìn)制:258),則電源電壓的值為:1.239V * 1023 / 258 = 4.9128 V 。
即 adc_val = 0x0102 是在 Vcc = 4.9128V 時(shí),測(cè)量間隙基準(zhǔn)源電壓所得到到 ADC 讀數(shù)。

參考 11# 的說(shuō)明。


回復(fù)

使用道具 舉報(bào)

23#
ID:705846 發(fā)表于 2026-1-6 09:13 | 只看該作者
WL0123 發(fā)表于 2026-1-5 13:32
STC15W408AS 讀取0xef  的值為0x04D7,你憑什么說(shuō) 明顯是 1239mv。你根據(jù)什么理由或資料證明地址0xef 里 ...


手冊(cè)上的讀取地址




回復(fù)

使用道具 舉報(bào)

24#
ID:1133081 發(fā)表于 2026-1-6 16:33 | 只看該作者
samxon 發(fā)表于 2026-1-6 09:13
手冊(cè)上的讀取地址


回復(fù)

使用道具 舉報(bào)

25#
ID:491577 發(fā)表于 2026-1-23 11:21 | 只看該作者
問(wèn)題出在:uint adc_val=(ADC_RES*256+ADC_RESL);數(shù)據(jù)溢出。
要改為:uint adc_val=((uint)ADC_RES*256+ADC_RESL);
回復(fù)

使用道具 舉報(bào)

26#
ID:467496 發(fā)表于 2026-1-24 16:01 | 只看該作者
P1ASF = 0x00;這句有問(wèn)題,需要ADC的端口要轉(zhuǎn)成模擬狀態(tài)的
回復(fù)

使用道具 舉報(bào)

27#
ID:705846 發(fā)表于 2026-2-3 09:37 | 只看該作者
電壓波動(dòng)的很厲害,是不是切換ADC通道引起的問(wèn)題

#define IAP_ADDRESS 0xef                                //測(cè)試地址

void main()
{
        uchar i;
        P1M0 = 0x00;P1M1 = 0x80;         //P1.7高阻用作ADC輸入
        P3M0 = 0x00;P3M1 = 0x00;
        P5M0 = 0x00;P5M1 = 0x00;       
        InitUart();                      //初始化串口
        InitADC();                       //初始化ADC

        BGV5=IapReadByte(IAP_ADDRESS)<<8|IapReadByte(IAP_ADDRESS+1);//程序開(kāi)始時(shí)讀取EEPROM中保存的BandGap數(shù)據(jù)               
        /*if(BGV5==0xffff)                 //如果EEPROM中沒(méi)有有效數(shù)據(jù)
        {
                BGV5=0x0100;                  //內(nèi)部BandGap參考電壓在標(biāo)準(zhǔn)5V VCC的ADC轉(zhuǎn)換值
                IapEraseSector(IAP_ADDRESS);  //擦除EEPROM
                IapProgramByte(IAP_ADDRESS, BGV5>>8);//寫(xiě)高8位
                IapProgramByte(IAP_ADDRESS+1, BGV5);//寫(xiě)低8位
        }*/
       
        while (1)
        {
                P1ASF = 0x00;                 //不設(shè)置P1口為模擬口,開(kāi)通ADC內(nèi)部第9通道
                Delay_ms(1);
                BGVx=GetADCResult(0);         //讀ADC的內(nèi)部第9通道
//                當(dāng)前VCC_mV = 標(biāo)準(zhǔn)電壓mV * 標(biāo)準(zhǔn)電壓BandGap轉(zhuǎn)換值 / 當(dāng)前電壓BandGap轉(zhuǎn)換值
                VCC = 5000*(long)BGV5/BGVx;   //計(jì)算當(dāng)前VCC電壓
                dis_buf[0]=VCC/1000%10+'0';
                dis_buf[1]=VCC/100%10+'0';
                dis_buf[2]=VCC/10%10+'0';
                dis_buf[3]=VCC%10+'0';
                dis_buf[4]=' ';
                P1ASF = 0x80;                 //設(shè)置P1.7為模擬口,開(kāi)通ADC第8通道
                Delay_ms(1);
                VINx=GetADCResult(7);         //讀ADC的第8通道
                VIN=VCC*(long)VINx/1023;      //計(jì)算第8通道當(dāng)前輸入電壓
                dis_buf[5]=VIN/1000%10+'0';
                dis_buf[6]=VIN/100%10+'0';
                dis_buf[7]=VIN/10%10+'0';
                dis_buf[8]=VIN%10+'0';
                dis_buf[9]='\n';
                for(i=0;i<10;i++)
                        SendData(dis_buf);      //串口發(fā)送當(dāng)前VCC電壓和當(dāng)前輸入電壓
                Delay_ms(1000);
        }
}




回復(fù)

使用道具 舉報(bào)

28#
ID:1133081 發(fā)表于 2026-2-3 15:09 | 只看該作者
回復(fù)

使用道具 舉報(bào)

29#
ID:705846 發(fā)表于 2026-2-3 16:16 | 只看該作者

串口發(fā)送BGV5的值為0x04D9, 換算為電壓為1242mv,與芯片讀取的電壓一致。看起來(lái)應(yīng)該沒(méi)有問(wèn)題,

但芯片5V vcc供電,但實(shí)際串口發(fā)送的是4238mv, ADC采集vcc供電的電壓也是4238mv, 請(qǐng)?jiān)賻兔忉屢幌隆?br />
uint idata BGV5 _at_ 0xef;

void main()
{
        uchar i;
        P1M0 = 0x00;P1M1 = 0x80;         //P1.7高阻用作ADC輸入
        P3M0 = 0x00;P3M1 = 0x00;
        P5M0 = 0x00;P5M1 = 0x00;        
        InitUart();                      //初始化串口
        InitADC();                       //初始化ADC

        //BGV5=IapReadByte(IAP_ADDRESS)<<8|IapReadByte(IAP_ADDRESS+1);//程序開(kāi)始時(shí)讀取EEPROM中保存的BandGap數(shù)據(jù)               
        //BGV5=0x04D9;
        /*if(BGV5==0xffff)                 //如果EEPROM中沒(méi)有有效數(shù)據(jù)
        {
                BGV5=0x0100;                  //內(nèi)部BandGap參考電壓在標(biāo)準(zhǔn)5V VCC的ADC轉(zhuǎn)換值
                IapEraseSector(IAP_ADDRESS);  //擦除EEPROM
                IapProgramByte(IAP_ADDRESS, BGV5>>8);//寫(xiě)高8位
                IapProgramByte(IAP_ADDRESS+1, BGV5);//寫(xiě)低8位
        }*/
        
        while (1)
        {
                P1ASF = 0x00;                 //不設(shè)置P1口為模擬口,開(kāi)通ADC內(nèi)部第9通道
                Delay_ms(1);
                BGVx=GetADCResult(0);         //讀ADC的內(nèi)部第9通道
//                當(dāng)前VCC_mV = 標(biāo)準(zhǔn)電壓mV * 標(biāo)準(zhǔn)電壓BandGap轉(zhuǎn)換值 / 當(dāng)前電壓BandGap轉(zhuǎn)換值
                VCC = 5000*(long)BGV5/BGVx;   //計(jì)算當(dāng)前VCC電壓
                dis_buf[0]=VCC/1000%10+'0';
                dis_buf[1]=VCC/100%10+'0';
                dis_buf[2]=VCC/10%10+'0';
                dis_buf[3]=VCC%10+'0';
                dis_buf[4]=' ';
                P1ASF = 0x80;                 //設(shè)置P1.7為模擬口,開(kāi)通ADC第8通道
                Delay_ms(1);
                VINx=GetADCResult(7);         //讀ADC的第8通道
                VIN=VCC*(long)VINx/1023;      //計(jì)算第8通道當(dāng)前輸入電壓
                dis_buf[5]=VIN/1000%10+'0';
                dis_buf[6]=VIN/100%10+'0';
                dis_buf[7]=VIN/10%10+'0';
                dis_buf[8]=VIN%10+'0';
                dis_buf[9]='\n';
                for(i=0;i<10;i++)
                        SendData(dis_buf[i ]);      //串口發(fā)送當(dāng)前VCC電壓和當(dāng)前輸入電壓
//        SendData((BGV5>>8)&0xff);
//        SendData(BGV5&0xff);
                Delay_ms(1000);
        }
}

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表