PFS122是應(yīng)廣推出的一顆,可以多次燒錄的2K程序空間的帶數(shù)字12位AD轉(zhuǎn)換的單片機(jī)。目前以高性價比重新獲得用戶的喜愛,其價格優(yōu)勢明顯,比九齊的062E的價格,可能還更具有優(yōu)勢。
PFS122的AD轉(zhuǎn)換相對于PMS132等來說,顯得比較劣勢,主要是因?yàn)?a target="_blank">IC不能接外部參考電壓,也不提供內(nèi)部的2V,3V, 4V等參考電壓。這樣在處理VDD處于變化的應(yīng)用環(huán)境,比如鋰電池應(yīng)用,就顯得沒有那么方便。
在處理VDD方面,也就是獲取鋰電池電壓的時候,還有個別工程師的設(shè)計是使用兩個電阻分壓,再利用一個IO口去采集分壓點(diǎn)來處理。這樣處理用是能用,但是顯得很不經(jīng)濟(jì),也浪費(fèi)IO口,甚至還浪費(fèi)靜態(tài)功耗。PFS122內(nèi)部提供的參考電壓1.2V,就是專門用來獲取VDD電壓的。也就是說1.2V相對來說是穩(wěn)定的,那么不同的VDD電壓,采集到穩(wěn)定1.2V時,所得到的AD轉(zhuǎn)換結(jié)果是不一樣的,但是遵循比例:VDD/1.2V=4096/Nbg.
由上面的比例可以得到VDD =4096*1.2V/Nbg=4096*12000mV/Nbg
=4915200mV/Nbg=((4b0000)hex)mV/Nbg,(1)
Nbg:是使用VDD做AD轉(zhuǎn)換的參考電壓,采用內(nèi)部特殊通道1.2的標(biāo)準(zhǔn)電壓所得的數(shù)值。
在獲取IO的電壓時,我們可以同樣利用比列來計算,計算的基礎(chǔ)是
;Vbg/VDD=Nbg/4096------------------(2)
;Vin/VDD=Nin/Nvdd=Nin/4096------- (3)
兩個比列相除,可以消掉VDD和4096,得到Vin=(Nin/Nbg)*Vbg
;VIN=(Nin/Nbg)*Vbg=(Nin/Nbg)*1200=Nin*1200/Nbg=0x4b0*Nin/Nbg(4)
因此,只要有Nin和 Nbg的AD轉(zhuǎn)換數(shù)值,就可以得到IO口的實(shí)際輸入電壓是多少。由公式(1)和公式(4),可以看出要得到VDD和Vin的實(shí)際電壓,需要用到運(yùn)算方式,三字節(jié)除以2字節(jié),兩字節(jié)乘以兩字節(jié)的運(yùn)算。對于習(xí)慣了MINI-C開發(fā)的用戶來說,這些運(yùn)算處理方式可以在“程序助手”中的/進(jìn)階實(shí)例/數(shù)據(jù)運(yùn)算中獲取。
EWORDdiv_src3;//被除數(shù)(商)
WORDdiv_val2, div_res2;//除數(shù),余數(shù)
voidEWord_Div_Word (void)
{//div_src3[E] / div_val2[W]=div_src3[E] * div_val2[W] + div_res2[W]
BYTEdiv_cnt, div_tmp;
div_cnt=8;
div_res2=0;
do
{
div_src3<<=????????1;
div_res2<<<=????1;
div_tmp<<<=????1;
div_cnt++;
A=(div_res2 - div_val2) >> 8;
if (div_tmp.0 || ! CF)
{
div_res2$1=A;
div_res2$0-=div_val2$0;
div_src3.0=1;
}
} while (! div_cnt.5);
}
//--------------------------------------------------------------------------------//
//程序說明:
//一個16位變量(范圍0~65535)與一個定值(500,范圍0~65535)相乘
//兩個乘數(shù)可以為定值,也可為變量
//同為定值時可直接用“*”運(yùn)算符
//注意事項(xiàng):
//1.案例為PMS154C,其他芯片可直接使用
//********************************************************************************//
#include"extern.h"
DWORDmul_t4;
WORDmul_x2;
WORDmul_y2;
voidWord_Mul_Word (void)
{//mul_t4[D]=mul_x2[W] * mul_y2[W]
mul_t4$3=0;
mul_t4$2=0;
BYTEcnt;
cnt=16;
do
{
mul_x2>>=1;
if (CF)
{
mul_t4+=(mul_y2 << 16);
}
mul_t4>>>=1;
} while (--cnt);
}
但是對于一些不熟悉MINI-C的工程師朋友來說,用匯編弄起來就可能有點(diǎn)難度了。那也沒有關(guān)系,你打賞我吧,我花了一些時間,整理了一些匯編的參考程序, 哈哈(~0~)。
匯編寫起來比較累人,參考一下,16進(jìn)制轉(zhuǎn)10進(jìn)制的匯編吧。
;-------HEX to BCD subroutine-------------------------
; Name:hex2bcd
; Input:temp0(H), temp1(L)
; Output:temp3(H), temp4(M),temp5(L)
; Stack level:2
; Function:16-bit-hex to 5-bit-dec
; Temp reg:temp2(counter register),temp6,fpp0_index
; Argument:
;--------------------------------------------
hex2bcd:
clear hb@fpp0_index
mov a, 0x10
mov temp2, a
clear temp3
clear temp4
clear temp5
set0 flag_c
shift:
slc temp1
slc temp0
slc temp5
slc temp4
slc temp3
dzsn temp2
goto adjdec
ret
adjdec:
mov a, la@temp5
mov lb@fpp0_index, a
call adjbcd
mov a, la@temp4
mov lb@fpp0_index, a
call adjbcd
mov a, la@temp3
mov lb@fpp0_index, a
call adjbcd
goto shift
adjbcd:
;---------------------------------
; mov a, 0x22
;idxm fpp0_index, a
;---------------------------------
idxm a, fpp0_index
add a, 0x03
mov temp6, a
t0sn temp6.3
idxm fpp0_index, a
idxm a, fpp0_index
add a, 0x30
mov temp6, a
t0sn temp6.7
idxm fpp0_index, a
ret 0x00
;-------------the end of hex2bcd---------------------
;-----------------------------------------------
;
;-------unsigned (eword)eint Div unsigned int-------------------
; Name:ueint_div_uint
; Input: temp2(D1H),temp3(D1M);temp4(D1L),temp5(D2H),temp6(D2L)
; Output: temp11(QH)temp12(QL),temp13(),
; temp7(remainer H),temp8(remainer L)
; Stack level:1
; Temp reg:temp0(bit count),temp1(bit0:flow flag),temp8(h),temp9(l)
; Function:unsigned eint div unsignedd int;D1/D2,
; Argument:
;--------------------------------------------
ueint_div_uint:
mov a, 0x18
mov temp0, a
clear temp9
clear temp7
clear temp8
ediv_loop:
sl temp4
slc temp3
slc temp2
slc temp8
slc temp7
slc temp9
t0sn temp9.0
goto evalid_bit
mov a, temp8
sub a, temp6
mov a, temp7
subc a, temp5
t0sn flag_c
goto einvalid_bit
evalid_bit:
mov a, temp6
sub temp8, a
mov a, temp5
subc temp7, a
set1 flag_c
goto eshift_result
einvalid_bit:
set0 flag_c
eshift_result:
slc temp13
slc temp12
slc temp11
dzsn temp0
goto ediv_loop
ret
;-----------------------------------------------
審核編輯:湯梓紅
-
單片機(jī)
+關(guān)注
關(guān)注
6037文章
44558瀏覽量
635351 -
AD
+關(guān)注
關(guān)注
27文章
868瀏覽量
150334 -
VDD
+關(guān)注
關(guān)注
1文章
312瀏覽量
33226
原文標(biāo)題:PFS122 檢測VDD及IO口的AD電壓方法
文章出處:【微信號:應(yīng)廣單片機(jī),微信公眾號:應(yīng)廣單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論