pfs122是应广推出的一颗,可以多次烧录的2k程序空间的带数字12位ad转换的单片机。目前以高性价比重新获得用户的喜爱,其价格优势明显,比九齐的062e的价格,可能还更具有优势。
pfs122的ad转换相对于pms132等来说,显得比较劣势,主要是因为ic不能接外部参考电压,也不提供内部的2v,3v,  4v等参考电压。这样在处理vdd处于变化的应用环境,比如锂电池应用,就显得没有那么方便。
在处理vdd方面,也就是获取锂电池电压的时候,还有个别工程师的设计是使用两个电阻分压,再利用一个io口去采集分压点来处理。这样处理用是能用,但是显得很不经济,也浪费io口,甚至还浪费静态功耗。pfs122内部提供的参考电压1.2v,就是专门用来获取vdd电压的。也就是说1.2v相对来说是稳定的,那么不同的vdd电压,采集到稳定1.2v时,所得到的ad转换结果是不一样的,但是遵循比例:vdd/1.2v=4096/nbg.
由上面的比例可以得到vdd = 40961.2v/nbg= 409612000mv/nbg
=4915200mv/nbg=((4b0000)hex)mv/nbg,(1)
nbg: 是使用vdd做ad转换的参考电压,采用内部特殊通道1.2的标准电压所得的数值。
在获取io的电压时,我们可以同样利用比列来计算,计算的基础是
;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转换数值,就可以得到io口的实际输入电压是多少。由公式(1)和公式(4),可以看出要得到vdd和vin的实际电压,需要用到运算方式,三字节除以2字节,两字节乘以两字节的运算。对于习惯了mini-c开发的用户来说,这些运算处理方式可以在“程序助手”中的/进阶实例/数据运算中获取。
eword    div_src3;//被除数(商)
word    div_val2, div_res2;//除数,余数
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        < 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)相乘
//    两个乘数可以为定值,也可为变量
//    同为定值时可直接用“*”运算符
//注意事项:
//    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 <>>=    1;} while (--cnt);}
但是对于一些不熟悉mini-c的工程师朋友来说,用汇编弄起来就可能有点难度了。那也没有关系,你打赏我吧,我花了一些时间,整理了一些汇编的参考程序, 哈哈( 0 )。
汇编写起来比较累人,参考一下,16进制转10进制的汇编吧。
;-------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_indexmov    a, 0x10mov    temp2, aclear  temp3clear  temp4clear  temp5set0   flag_cshift:
slc    temp1slc    temp0slc    temp5slc    temp4slc    temp3dzsn   temp2goto   adjdecretadjdec:
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  shiftadjbcd:
;---------------------------------
;        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  temp9clear  temp7clear  temp8ediv_loop:
sl  temp4slc  temp3slc  temp2slc  temp8slc  temp7slc  temp9t0sn temp9.0goto evalid_bitmov  a, temp8sub  a, temp6 mov  a, temp7subc  a, temp5t0sn flag_cgoto einvalid_bitevalid_bit:
mov  a, temp6    sub  temp8, a    mov  a, temp5    subc  temp7, a            set1 flag_c    goto eshift_resulteinvalid_bit:
set0 flag_ceshift_result:
slc  temp13slc  temp12slc  temp11dzsn temp0goto ediv_loopret;-----------------------------------------------
			
			
       	 	
    	联想四轮驱动智能体系,推动5G智能汽车高速发展
         	 	
    	如何选购手机数据线指南
         	 	
    	DS1390/DS1391 RTC与带SPI的摩托罗拉DSP接口
         	 	
    	TI推出正交调制器TRF370317,具有4GHz RF输出
         	 	
    	展会资讯-消费电子产业发展晴雨表-2023CEEASIA展,助您开启“爆圈”之旅
         	 	
    	PFS122检测VDD及IO口的AD电压方法
         	 	
    	CoolSiC MOSFET 电机驱动评估板
         	 	
    	余承东表态华为Mate10如果搭载6GB运存,速度快过友商12GB,麒麟970+EMUI6.0就是这么横
         	 	
    	聚酷智能利用IoT开发平台来打造多款智能化产品
         	 	
    	人工智能将在新零售行业中发挥作用
         
       	 	
    	AI高速扫描机器人实现投产,是否与直线马达有关
         	 	
    	iPhone 缺席苹果秋季新品发布会,SE却是关键词之一
         	 	
    	步进电机品牌排行榜前十名
         	 	
    	安森美半导体推出高能效LED照明应用参考设计
         	 	
    	这些新“上线”的智能医疗设备,真的实用吗?
         	 	
    	传iPhone 16系列镜头将改版 大立光有望独家供应长焦产品
         	 	
    	薄膜表面检测设备可检测出表面上的各种瑕疵污点
         	 	
    	语音助理小冰在微博预热,将和小米的小爱同学共同解锁一项技能
         	 	
    	发电厂热力管道智能监测系统案例解析
         	 	
    	鼠标音频开关的制作