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 = 40961.2V/Nbg= 409612000mV/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=Nin1200/Nbg=0x4b0Nin/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)算中獲取。
EWORD div_src3;//被除數(shù)(商)
WORD div_val2, div_res2;//除數(shù),余數(shù)
void EWord_Div_Word (void)
{ // div_src3[E] / div_val2[W] = div_src3[E] * div_val2[W] + div_res2[W]
BYTE div_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位變量(范圍065535)與一個定值(500,范圍065535)相乘
// 兩個乘數(shù)可以為定值,也可為變量
// 同為定值時可直接用“*”運(yùn)算符
//注意事項(xiàng):
// 1.案例為PMS154C,其他芯片可直接使用
//********************************************************************************//
#include "extern.h"
DWORD mul_t4;
WORD mul_x2;
WORD mul_y2;
void Word_Mul_Word (void)
{ // mul_t4[D] = mul_x2[W] * mul_y2[W]
mul_t4$3 = 0;
mul_t4$2 = 0;
BYTE cnt;
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
;-----------------------------------------------
評論
查看更多