AFE4400集成模拟前端是集成了红光及红外LED发射和接收、光电转换以及AD转换的一个模块,该模块可以用来获得人体脉搏波信号以及血样饱和度数据。红光、红外、红光对应的环境光、红外对应的环境光、红光与红光环境光的差值以及红外与其对应环境光的差值,共计六个数据经过AD转换之后的32位数据存储在6个寄存器中。以红光为例,寄存器共计32位,其中前八位为无效位,根据数据手册,其第9位和第10位为可以忽略的位,同样可以视作无效位,第11位为数据的符号位,而真正的数据位为从第12位到第32位的21位存储。
从后往前数,共计22位数是我们所需要的数据,而这个数是以补码的形式进行记录的,我们的目的是通过定义函数,获得真正的数据。从存储上来讲,就是将的到的AD转换的值变换为32位数据的正确表示值。
函数实现:
long Transform(long input) //定义函数返回值为long(32位数据需要)
{
long output;
long preoutput, preinput, temp;
preinput = input&0x00200000; //数据的第22位是否为1,判断正负
if (preinput == 0) //preinput为0,说明输入为正数
{
output = input; //输入数据的后21位即为输出值
output &= 0x001FFFFF; //经过与运算之后,清除前10位数据存储
}
else //输入数据为负数
{
temp = input & 0x001FFFFF; //获得后21位补码
output = ~temp + 1; //补码取反再加1得到原码数据
}
return output; //返回输出值,数据类型为long
}
总结:
在写函数时,应当注意到,补码变换为原码的方法为取反加1,同时,经过与运算之后,已经获得正确的补码数据,只需进行向原码变换的操作就可以实现。而不需要考虑在首位加1得到负数,这样的思路是错误的。