微电子0803—温长珍—开放实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西安邮电学院
开放性实验报告
----基于F330的差分电容检测系统
班级:微电子0803
姓名:温长珍
一.前言
电容传感器广泛的应用于多种检测系统中,用以测量诸如液位、压力、位移、加速度等物理量,但目前大部分电容测量方法集成化水平低、精度低,因而对电容特别是对微小电容的精确测量始终是一个很重要的课题。
在某些场合,传感电容的变化量往往仅有几个皮法大小,这就对电容测量电路提出了更高的要求。
目前用于解决测量微小电容的方法主要有电荷转移法和交流法,这两种电路的基本测量原理是通过激励信号连续对电容充放电,形成与被测电容成比例的电流或电压信号,从而测量出被测电容值。
它们的共同缺点是脉动噪声大,需使用滤波器及考虑相位补偿,电路结构相对复杂,成本也较高。
本次试验将利用AD7745 C-digital芯片设计微小电容检测电路,将电容信号转换成数字信号上传到F330单片机,然后输出示波器上。
从而实现对微小电容或微小电容差的检测。
二.设计目标
利用电容电压转换芯片和单片机实现数字式电容电压转换电路的功能,实现对微小电容或微小电容差的检测。
三.设计内容
利用AD7745 C-digital芯片设计微小电容检测电路,其中AD7745与单片机C8051F330进行连接,F330做主机,AD7745做从机,AD7745与F330之间通过I2C总线协议进行连接,将AD7745的输出信号送至F330,并利用单片机内部自带的数模转换功能将数字信号转换为模拟电压信号进行最后的输出,从而实现对微小电容或微小电容差的检
测。
系统主要包括电源模块、电容转换模块、信号放大模块。
其中电源模块主要是将15V的直流电压转换为3.3V来给F330和AD7745供电,电容转换模块是将电容信号转换成相应的数字信号,F330从AD7745中读出此数字信号之后经过相应的处理再输出。
而信号放大模块是将F330的输出信号加以放大,从而能够更好的在示波器上显示出来。
主要芯片介绍(只介绍本次试验使用到的部分)
1、F330
1.1存储系统
C8051F330/1 器件是完全集成的混合信号片上系统型 MCU。
CIP-51 有标准 8051 的程序和数据地址配置。
它包括 256 字节的数据 RAM,其中高 128字节为双映射。
用间接寻址访问通用 RAM 的高128 字节,用直接寻址访问 128 字节的 SFR地址空间。
数据 RAM 的低 128 字节可用直接或间接寻址方式访问。
前 32 个字节为 4 个通用寄存器区,接下来的 16 字节既可以按字节寻址也可以按位寻址。
程序存储器包含 8KB 的FLASH。
该存储器以 512 字节为一个扇区,可以在系统编程,且不需特别的编程电压。
1.2指令系统
CIP-51 采用流水线结构,与标准的 8051 结构相比指令执行速度有很大的提高。
在一个标准的 8051 中,除 MUL和 DIV以外所有指令都需要 12 或 24 个系统时钟周期,最大系统时钟频率为 12-24MHz。
而对于 CIP-51 内核,70%的指令的执行时间为 1
或2个系统时钟周期,只有 4 条指令的执行时间大于 4 个系统时钟周期。
CIP-51 工作在最大系统时钟频率 25MHz 时,它的峰值速度达到 25MIPS。
1.3片内调试电路
C8051F330/1器件具有片内Silicon Labs 2线(C2)接口调试电路,支持使用安装在最终应用系统中的产品器件进行非侵入式、全速的在系统调试。
Silicon Labs的调试系统支持观察和修改存储器和寄存器,支持断点和单步执行。
不需要额外的目标RAM、程序存储器、定时器或通信通道。
在调试时所有的模拟和数字外设都正常工作。
当MCU单步执行或遇到断点而停止运行时,所有的外设(ADC和SMBus除外)都停止运行,以保持与指令执行同步。
1.4 I/O接口
C8051F330有17个I/O引脚(两个8位口和一个1位口)。
C8051F330/1端口的工作情况与标准8051相似,但有一些改进。
每个端口引脚都可以被配置为模拟输入或数字I/O。
被选择作为数字I/O的引脚还可以被配置为推挽或漏极开路输出。
在标准8051中固定的“弱上拉”可以被总体禁止,这为低功耗应用提供了进一步节电的能力。
数字交叉开关允许将内部数字系统资源映射到端口I/O引脚。
可通过设置交叉开关控制寄存器将片内的计数器/定时器、串行总线、硬件中断、比较器输出以及微控制器内部的其它数字信号配置为出现在端口I/O引脚。
这一特性允许用
户根据自己的特定应用选择通用端口I/O和所需数字资源的组合。
1.5 串行端口
C8051F330/1系列MCU内部有一个SMBus/I2C接口、一个具有增强型波特率配置的全双工UART和一个增强型SPI接口。
每种串行总线都完全用硬件实现,都能向CIP-51产生中断,因此需要很少的CPU干预。
1.6 10位电流输出DAC
C8051F330内部有一个10位电流方式数/模转换器(IDA0)。
IDA0的最大输出电流可以有三种不同的设置:0.5mA、1mA和2mA。
IDA0具有灵活的输出更新机制,允许无缝满度变化,支持无抖动波形更新。
IDA0有三种更新方式:写IDA0H、定时器溢出或外部引脚边沿。
①芯片信息
②相关寄存器配置
2、AD7745
2.1 工作原理
AD7745的核心是一个高精度的转换器,由1个二阶调制器和1 个三阶数字滤波器构成。
AD7745可以配置成一个电容数字转换器(CDC),也可以配置成一个经典的模数转换器(ADC)。
除了
转换器外,AD7745集成了一个多路复用器、一个激励源和电容数模转换器(CAP-DAC)作为电容的输入、一个温度传感器、一个时钟发生器、一个控制校正逻辑、I2C接口。
AD7745的功能框图如图1 所示。
下面对图中的主要部分进行功能说明。
(1)∑-△调制器
∑-△调制器是AD7745的核心,它是将模拟信号转换成数字信号的器件,其工作原理是:被测的电容Cx被连接在CDC激励输出(EXCA或者EXCB)与∑-△调制器输入(VIN(+))之间,在1 个转换周期,一个方波激励信号(从EXCA 或者EXCB 输出)被加到CX,∑-△调制器连续采样经过CX 的电荷。
数字滤波器处理∑-△调制器的输出,数据经过数字滤波器输出,经过校正,由I2C 串行接口将数据读出。
(2)电容数模转换器(CAPDAC)
电容数模转换器(CAPDAC)可以被理解成一个负电容直接内部连接到CIN 引脚。
在AD77415中有2个CAPDAC,一个连接到CIN1(+),另一个连接到CIN1(一),如图2所示。
输入电容CX,CY(差分模式下)与输出数据(DATA)之间的关系如下:
电容数模转换器可以用来编程被测电容的输入范围,通过设置CAPDAC(+)和CAPDAC(一)的值,可以改变被测电容的范围,比如在单端模式下,将CAP-DAC设置成温度传感器±4 pF,被测电容的变化范围成了0~8 pF。
(3)I2C 串行接口
AC7745支持I2C 兼容2线串行接口,I2C 总线上的2 根线是SCL(时钟)和SDA(数据),所有的地址、控制和数据信息都通过这2根线进行传输。
2.2 引脚功能
AD7745的引脚分布如图3 所示可知。
各引脚功能描述如下:
SCL:I2C 串行时钟输入;
RDY:逻辑输出。
当该引脚信号的下降沿到来时,表示在已经使能的通道转换已经完成,同时新的数据已经到达该通道;EXCA,EXCB:CDC 激励输出。
被测电容接在EXC 引脚和CIN 引脚之间;
REFIN(+),REFIN(-):差分参考电压输入;
CIN1(-):在差分模式下,CDC 的负电容输入;在单端模式下,该引脚内部断开;
CIN1(+):在差分模式下,CDC 的正电容输入;在单端模式下,CDC 的电容输入;
NC:空管脚;
VIN(+),VIN(-):ADC 的差分电压输入。
此引脚同时连接外部温度探测二极管;
GND:接地端;
VDD:电源端;2.7~5.25 V 单电源供电;
SDA:双向I2C 串行数据线。
2.3 AD7745的工作模式
(1)差分模式
当被测电容传感器是差分式电容传感器,其连接方法如图2所示,差分电容探测器的正电容输入连接到CIN1(+),负电容输入连接到CIN1(-)。
通过I2C接口将AD7745中的电容设置寄存器(Cap Setup register)中的CAPDIF位设置成1。
(2)单端模式
当被测电容传感器是是单端电容传感器,其连接方法如图4所示。
可以通过设定CAPDAC(+)的值调整被测的电容传感器的输出范围。
四.软件设计
4.1、I2C协议规则
4.1.1、I2C工作原理:
I2C总线是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。
在主机和从机之间、从机与从机之间进行双向数据传输,串行的8位双向数据传输位速率在标准模式下可达100kb/s,快速模式下可达400kb/s,高速模式下可达3.4Mb/s。
每个连接到总线上的器件都是并联在总线上的,即可以作为发送器也可以作为接收器,并且它们都有唯一的地址。
I2C总线在传送数据过程中共有三种类型信号:
<1> 开始信号:SCL为高电平时,SDL由高电平向低电平跳变,
开始传送数据;
<2> 结束信号:SCL为高电平时,SDL由低电平向高电平跳变,
结束传送数据;
<3> 应答信号:接收数据的从机在接收到8bit数据后,向发送
数据的主机发出特定的低电平脉冲,表示已收到数据;主机向从机发出一个信号后,等待从控制器发出一个确认信号,主机接到确认信号后根据实际情况判断是否继续传递信号。
4.1.2、AD7745应用I2C总线的读写过程:
AD7745/6有一个固定地址,二进制数为1001000X,最低位为方向位,因此主机读操作时发送地址0x91,写操作时发送地址0x90。
<1> 读操作过程:
主机发送起始标志——>主机发送地址0x90——>从机回复确认标志——>主机发送寄存器地址值——>从机回复确认标志——>主机发起始标志——>主机发送地址0x91——>从机回复确认标志——>从机回复数据首字节——>主机发送确认标志……从机回复最末字节——>主机不确认——>主机发送停止位
<2> 写操作过程:
主机发送起始标志——>主机发送地址0x90——>从机回复确认标志——>主机发送寄存器地址值——>从机回复确认标志——>主机发送数据首字节——>从机回复确认标志……主机发送最末数据字节——>从机发送确认标志——>主机发送停止位。
主机连续读或写从机寄存器时,从机寄存器地址自动加1。
4.2、流程图
主程序流程图:
中断处理程序流程图:
F330初始化 振荡器初始化:OSCICN=0xc3 关闭看门狗:PCA0MD &= 0xBF 开总中断:EA = 1
端口初始化:XB0=0x04,XB1=0x40,P0SKIP = 0x0F 定时器1初始化:产生总线时钟
定时器3初始化:总线时钟超时检测
SMbus 初始化:SMB0CF = 0xDD ,EIE1 |= 0x01 内部DA 初始化:IDA0CN |= 0xF2
ad7745初始化
CAP SET-UP 0x07:0xA0 EXC SET-UP 0x09:0x0B
CONFIGURATION 0x0A:0x01
把10位的数据写入IDA0
读ad7745的状态寄存器
读CAP DATA REGISTER 中
24位数据
电容转换是否完成,即读RDY 位是否为0
RDY = 1
RDY = 0
RDY = 1
启动中断处理程序
判断状态向量SMB0CN & 0xF0
主接收器模式 0x80
主发送器模式 0xC0
起始条件已发送0xE0
ACK 是否为1 停止传输 再发送起始条件
否
是
发送寄存器地
址
从机地址是否发送了
发送从机地址
否
是
停止传输 释放总线
寄存器地址是否发送
发送数据
是
否
写
读
发送起始条件更改LSB=1
判断是读ad7745状态还是写状态
清除中断标志位
SI=0
4.3、AD7745关键寄存器的配置 1、 CAP DATA REGISISTER:
这是一个24位的只读寄存器,它由三个8位的寄存器组成,这三个寄存器用来存储和不断的更新测得的电容信息 寄存器 地址指针 位7~位0 Cap Data H 0x01 0x00(高8位) Cap Data M 0x02 0x00(中8位) Cap Data L 0x03
0x00(低8位)
2、CAP SET-UP REGISTER (电容频道设置): 地址指针 0x07
主接收器模式
0x80
判断是读RDY 位,还是读转换
数据 保存RDY 位
读RDY 位
读转换数据
保存读出的数据
ACK=0 发终止条件 释放总线
清除中断标志位
SI=0
说明:
位7:CAPEN = 1使电容渠道单一的转换,连续的转换,和(或)校准 位6:CIN2 = 1开关的内部信号到第二个电容式输入的AD7746 位5:DIFF = 1设置差分模式为选定的电容输入
位4 ~ 1:无效位,全部置0
位0:CAPCHOP = 0表示特定的电容频道性能
CAPCHOP = 1加倍电容频道转化时间并且提高电容信道噪音 性能为最长的转换时间
3、EXC SET-UP REGISTER (电容频道激励设置): 地址指针 0x09
位 位7 位6 位5 位4 位3 位2 位1 位0 助记符 CAPEN CIN2 CAPDIFF
- - - - CAPCHOP
默认值 0 0 0 0 0 0 0 0 本次实验值
1
1
位 位7 位6 位5 位4
位3 位2
位1
位0
助记符
CLKCTRRL
EXCON
EXCB
EXCB EXCA
EXCA
EXCLVL1 EXCLVL0
说明:
位7:CLKCTRRL = 0 选择AD7745
CLKCTRRL = 1 选择AD7746
位6:EXCON = 0 只有在电容频道转换时激励信号呈现在输出端 EXCON = 1 在电容和电压/温度转换时激励信号都呈现在
输出端
位5:EXCB = 1使EXCB 针为激励输出 位4:EXCB = 1使EXCB 针为反激励输出 位3:EXCA = 1使EXCA 针为激励输出 位2:EXCA = 1使EXCA 针为反激励输出 位1~位0:激励电压水平(都置1是灵敏度最高)
4、CONFIGURATION REGISTER (转换器更新速率和经营方式设置):地址指针 0x0A 说明:
位7~位6:和本次实验无关
位5~位3:这三个位是用来设置电容频道数字滤波器和转换时间/
更新速率的,三个位全置1时转换时间最长、更新速率最
默认值 0 0 0 0 0 0 1 1 本次实验值 0 0 0 0 0 0 1 1 位 位7 位6 位5 位4 位3 位2 位1 位0 助记符 VTF1 VTF0 CAPF2 CAPF1 CAPF0 MD2 MD1 MD0 默认值 1 0 1 0 0 0 1 1 本次实验值
1
长,但数字滤波器的带宽最小,使得噪声最低
位2~位0:这三个位用来设置转换器的运作模式的
5、CAP DAC A REGISTER(电容的DAC 设置):地址指针0x0B
位
位7
位6
位5
位4
位3
位2
位1
位0
标识符 DACAENA DACA 默认值
0 0x00 本次实
验值
1
0x80
说明:
位7:DACAENA = 1连接电容的DACA 到正的电容输入端 位6~位1:DACA 的值,0x0、0 = 0 pf ,0x7F = 满量程
6、CAP DAC B REGISTER(电容的DAC 设置):地址指针 0x0C
位
位7
位6
位5
位4
位3
位2
位1
位0
标识符 DACAENB DACA
MD2 MD1 MD0 模式 0 0 0 空闲 0 0 1 连续 0 1 0 单一 0 1 1 挂起 1
1
校准
默认值0 0x00
本次实
1 0x80
验值
说明:
位7:DACAENB = 1连接电容的DACB到负的电容输入端
位6~位1:DACB的值,0x00代表0 pf,0x7F代表满量程
4.4、F330相关寄存器的配置
1、时钟设置
TR0=0; //关闭定时器0
TMOD=0x20; //设置定时器1的工作方式
CKCON=0x01; //定时器使用系统4分频
TL1=0xef; //给定时器1
TH1=0xef; // 装初值
TR1=1; //允许定时器1
2、IDA0设置
IDA0CN=0xf2; //IDA0使能,写IDA0H触发DAC输出更新,2.0mA满度输出电流。
3、交叉开关设置
P0MDIN=0xff; //P0.n引脚不被配置为模拟输入
P0MDOUT=0xCD;
P0SKIP=0x0f; //交叉开关跳过P0.0~0.3
XBR0=0x04; //SMBUS连到端口引脚
SMB0CF=0xcd; // 配置SUM配置寄存器,使能
XBR1=0xc0; // 交叉开关使能
4、中断
EIE1=0x81; //允许SMBUS中断
EIP1=0x01; //设SMBUS中断优先级为高
IE=0x80; //开总中断
SI = 0; // SM_BUSY中断标志位清0
4.5、程序
data unsigned char a0,a1,a2;
data float c;
unsigned char data i,j,k,l;
#include <c8051F330.h>
#include <math.h>
bit SMB_BUSY;
bit flag;
bit SEND_START;
bit add_shujv;
bit w_r; //主接收模式,主发送模式标志
bit flag1; //等待标志位
bit flag2;
//************************系统初始化*********************************/
// 忙碌标志位
void system_initial (void)
{
k=0;
PCA0MD &= ~0x40; //关闭看们狗
//**********************设置定时器1,功能:用来提供总线的时钟源
将总线的频率设置为208kHz******************************
TR0=0; //关闭定时器0
TMOD=0x20; //设置定时器1的工作方式
// CKCON=0x01; //定时器使用系统4分频
TL1=0xef; //给定时器1……
TH1=0xef; // 装初值
TR1=1; //允许定时器1
//************************IDA0设置*******************
IDA0CN=0xf2; //IDA0使能,写IDA0H触发DAC输出更新,2.0mA满度输出电流。
//***************交叉开关和SUMBUS设置****************
P0MDIN=0xff;
P0MDOUT=0xCD;
P0SKIP=0x0f; //交叉开关跳过P0.0~0.3
XBR0=0x04; //SMBUS连到端口引脚
SMB0CF=0xcd; // 配置SUM配置寄存器,使能
XBR1=0xc0; // 交叉开关使能
//**********************中断使能*********************
EIE1=0x81; //允许定时器3和SMBUS中断
EIP1=0x01; //设定定时器3中断为低优先级,SMBUS中断为高
IE=0x80; //开总中断
SI = 0; // SM_BUSY中断标志位清0
}
//***********************初始化Ad7745**************************** void ad_chushi(void)
{
w_r=0;
SEND_START=0;
i=0; //全局变量置初值0,
add_shujv=0;
flag=0;
STA=1; //产生起始条件
while(!flag); //等待配置ad7745寄存器
}
//***********************读数据************************************** void read(void)
{
flag1=0;
flag2=0;
j=0;
STA=1; // 产生起始条件
while(!flag1);
}
//*******数据转换************
datachange (a0,a1,a2)
{
IDA0H=a0;
IDA0L=a1;
}
//*********************主程序*************************
void main()
{
system_initial();
ad_chushi();
while(1)
{
read();
datachange(a0,a1,a2);
}
}
//*************************中断程序*****************************
void SMBus_ISR (void) interrupt 7
{
k=SMB0CN;
l=k&0xE0;
if(!flag2)
switch (l)
{
case 0xE0:
{
SEND_START=1;
SI = 0;
STA = 0;
STO=0;
SMB_BUSY=1; //发送了起始条件
if(!w_r)
{ SMB0DAT = 0x90;
if(i>5)
w_r=1;
} // 发送从机地址和写
else
{ SMB0DA T=0x91;STO=0;w_r=0;flag2=1;}
break;
}
case 0xC0:
{ if (ACK)
// 地址或者数字字节已经发出
{
if (SEND_START) //// 已经发送过起始条件和从机地址?
{
if(!w_r)
{
while(i<5) //将从机寄存器地址装入
{
if(!add_shujv)
switch(i)
{ case 0:{ add_shujv=1;SMB0DA T=0x07;break;}
case 1:{ add_shujv=1;SMB0DA T=0x09;break;}
case 2:{ add_shujv=1;SMB0DA T=0x0A;break;}
case 3:{ add_shujv=1;SMB0DA T=0x0B;break;}
case 4:{ add_shujv=1;SMB0DA T=0x0C;break;}
}
else
switch(i)
{
case 0:{ SMB0DAT=0xA0;add_shujv=0;i++;break;}
case 1:{ SMB0DAT=0x0B;add_shujv=0;i++;break;}
case 2:{ SMB0DAT=0x01;add_shujv=0;i++;break;}
case 3:{ SMB0DAT=0x80;add_shujv=0;i++;break;}
case 4:{ SMB0DAT=0x80;add_shujv=0;i++;break;}
}
SI=0;break;
}
if(i==5) { STO=1;SI=0;flag=1;i++;} //产生结束条件
}
else
{
SMB0DAT=0x01;
SI=0;
w_r=1;
SEND_START=0;
}
}
else
{ STA=1;STO=0;SI=0;}
}
else
{ STA=1;STO=0;SI=0; }
break;
}
case 0x80:
{
if(j==0)
{ a0=SMB0DAT;ACK=1;SI=0;j++; }
else
if(j==1)
{ a1=SMB0DAT;ACK=1;SI=0; j++;}
else
if(j==2)
{ a2=SMB0DAT;ACK=0;SI=0;STA=0;STO=1;flag1=1; }
break;
}
}
else
{ SI=0;flag2=0;}
}
五.实验测试结果
5.1 单电容的测试(0~8P)
单端模式:CAPDIFF=0 CAPDACA(+) = 8p CAPDACB(-) = 0p
1、测试结果
电容 2.0 2.2 3.0 4.7 5.0 6.2 7.0 8.2 9.0 10
电压0.693 0.698 0.370 0.788 0.810 1.10 1.32 1.53 1.76 2.05
2、数据分析
为了画出输出电压V关于电容差▽C的曲线将以上数据用MATLAB 软件进行分析,结果如图5—1:
图5—1
图5—1中的曲线近似于图5—2中的直线:
图5—2
经过近似计算输出电压V和电容C的函数关系为:
Y=-1/3+(7/30)*X
5.2 差分电容的测试(C1,C2均为0到4P之间)
(CAPDIFF=1 CAPDACA(+) = 0p CAPDACB(-) = 0p)
1、反复测量取平均值,舍去明显不合理的数据,得到以下数据列表:
-3.4 -2.9 -2.8 -2.7 -2.6 -2.5 -2.4 -2.3 -2.1 -2
电容
差
0.208 0.330 0.278 0.340 0.322 0.370 0.329 0.4 0.414 0.504 输出电
流
-1.8 -1.6 -1.5 -1.3 -1.2 -1 -0.8 -0.6 -0.5 -0.4
电容
差
0.579 0.592 0.642 0.632 0.701 0.71 0.728 0.828 0.858 0.952 输出电
流
-0.3 -0.2 0 0.2 0.5 0.6 0.7 0.8 1 1.2
电容
差
0.918 0.972 0.985 0.992 1.11 1.14 1.12 1.24 1.23 1.27
输出电
流
1.3 1.5 1.6 1.8 1.92
2.1 2.3 2.4 2.5
电容
差
1.34 1.35 1.39 1.44 1.34 1.47 1.47 1.59 1.65 1.6
输出电
流
2.6 2.7 2.9
3.1 3.4
电容
差
1.67 1.66 1.61 1.79 1.72
输出电
流
2、数据分析
为了画出输出电压V关于电容差▽C的曲线将以上数据用MATLAB软件进行分析,绘制出的输出电压V关于电容差▽C的曲线图如下5—3:
图5—3
从以上曲线图可以看出输出电压与差分电容的大小呈现线性关系。
在图上作出以下近似直线。
图5—4
经过计算可以得到输出电压V关于电容差▽C的函数关系为:
V=-0.24*▽C+0.99
六、误差分析
(1)电容不太标准,
(2)AD7745是一个24位分辨率的模数转换器,而F330内部的DA是一个10位分辨率的数模转换器,在进行数据转换时存在一定的误差
(3)手工焊接的电路板,可能有些地方焊接得不好,接触不良七、实验心得(遇到的问题及解决方案)
这次开放性试验让我对单片机有了一个更深刻的认识,熟悉了I2C总线规则,从读单片机资料开始到画流程图、编写程序、调试程序,一步步走来虽然遇到了很多挑战但也确实收获颇多。
开始的时候我们设想,把从AD7745中读出的24位的数据经过等比例取舍成10位的数,然后再输出,因为这样精度更高。
但是调试中发现,如果对24位的数据进行乘除法计算会非常耗时。
所以只取读出来24位数据的高10位。