0 摘要

因某项目需要,需要采集微弱的电压信号,且对电压精度要求较高,于是选中MCP3421这款18 bit 高精度IIC AD转换芯片。本文将结合MCP3421的手册,对该芯片的使用进行详细解释,并配合Proteus,完成基于MCP3421的仿真。

关键词:MCP3421, Proteus,MSP430,PT100,TCK,TCJ,TCE,AT89C51/AT89C52

1 所使用的工具

主控单元:MSP460F249

显示模块:LCD1602

采集芯片:MCP3421

程序开发软件: IAR7.10.1 for MSP430

仿真软件:Proteus 8.6

2 安装包链接

Proteus 8.6

链接:https://pan.baidu.com/s/1yAxgS7nuEd7MziVn-tSMuw

提取码:civu

IAR

链接:https://pan.baidu.com/s/1Uk6u6o8rXh5oXdv2yHBvHg

提取码:fs2q

3 MCP3421介绍

MCP3421采用IIC串行通讯协议,具有单通道、高精度(最高18bits)、差分输入 A/D转换器;片上精密基准参考电压为2.048V。采用单电源供电(2.7V-5.5V)。其主要特点如下:

  • 封装:SOT-23-6
  • 差分输入
  • 具备自校正功能
  • 片内参考电压
    • 精度:2.048V±0.05%
    • 温漂:15ppm/℃
  • 可编程增益放大器
    • PGA = 1V/V 2V/V 4V/V 8V/V
  • 可编程速率位
    • 3.75 SPS 18位 -131072~131071,最高位D17为符号位
    • 15 SPS 16位
    • 60 SPS 14位
    • 240 SPS 12位
  • 可编程转换模式
    • 单次转换模式
    • 连续转换模式
  • IIC接口
  • 单电源供电 2.7V~5.5V

典型应用场合:

  • 便携式仪表
  • 电子秤和电量计
  • 使用RTD、热敏电阻和热电偶的温度测量
  • 测量压力、张力和应变的电桥

MCP3421的框图如图3-1所示

图3-1 MCP3421内部框图

4 MCP3421寄存器介绍

R/W-1

R/W-0

R/W-0

R/W-1

R/W-0

R/W-0

R/W-0

R/W-0

RDY(低电平有效)

C1

C0

O/C

S1

S0

G1

G0

1*

0*

0*

1*

0*

0*

0*

0*

Bit7

Bit0

*代表上电复位时的默认配置

所以,MCP3421上电后,如果未输入新的配置信息时,系统的默认状态为:

连续转换模式;SPS为240 SPS,12bit;PGA为 1V/V

Bit7:

RDY:就绪标志位

此位为数据就绪标志。在读模式,此位表示输出寄存器是否被最新的转换数据更新。在单次转换模式 下,向此位写入 1 将启动一次新的转换。

使用读命令读取 RDY 位:

1 = 输出寄存器未更新

0 = 输出寄存器被最新转换结果更新

使用写命令写 RDY 位:

连续转换模式:无影响

单次转换模式:

1 = 开始一次新的转换

0 = 无影响

Bit6-5:

C1-C0:MCP3421中无效

Bit4:

O/C:转换模式位

1 = 连续转换模式 (默认) 。器件进行连续数据转换。

0 = 单次转换模式。器件进行单次转换并进入低功耗待机模式,直至收到新的读或写命令

Bit3-2:

S1-S0:采样率选择位

00 = 240 sps ( 12 位) (默认)

01 = 60 sps (14 位)

10 = 15 sps (16 位)

11 = 3.75 sps (18 位)

Bit1-0:

G1-G0: PGA 增益选择位

00 = x1 (默认)

01 = x2

10 = x4

11 = x8

5 MCP3421配置方式

MCP3421寄存器的配置根据其写命令来执行。写操作对应的时序图如图5-1所示。

图5-1 MCP3421写操作时序图

由图5-1可以看出,MCP3421写操作共包含以下几个部分:

第一步:主器件发出启动位 IIC_Start();

第二步:向MCP3421写入第一个字节。包括器件地址和读写标志位 常规为0xd0。计算方法如下:

地址位格式如下:1 1 0 1 A2 A1 A0

其中A2、A1、和A0出厂就已经定义号好了,默认为A2=A1=A0 = 0,如果需要挂接多个MCP3421,需要联系厂家进行自定义。

最后一位为读写标志位,1为Read模式,0为Write模式。

所以实际写入MCP3421的第一个字节为 1101 0000 = 0xD0

第三步:主机等待MCP3421发出应答信号IIC_Wait_Ack()

第四步:向MCP3421 写入第二个字节(配置字节)。进行寄存器的配置

不同配置方式的组合如下:

单次转换共有以下几种组合:

若选择单次转换模式,器件仅进行一次转换,并更新输出数据寄存器,清除数据就绪标志位(RDY 位 = 0)然后进入低功耗待机模式。当器件接收到新的写命令,并RDY = 1 时,则开始新的单次转换。

所以,使用MCP3421推荐系统工作在单次转换模式下,按需触发采集,可以降低系统功耗。

转换模式

转换速率

增益

RDY

C1

C0

O/C

S1

S0

G1

G0

单次转换

240 SPS 12BIT

1V/V

1

0

0

0

0

0

0

0

0X80

2V/V

1

0

0

0

0

0

0

1

0X81

4V/V

1

0

0

0

0

0

1

0

0x82

8V/V

1

0

0

0

0

0

1

1

0x83

60 SPS 14BIT

1V/V

1

0

0

0

0

1

0

0

0x84

2V/V

1

0

0

0

0

1

0

1

0x85

4V/V

1

0

0

0

0

1

1

0

0x86

8V/V

1

0

0

0

0

1

1

1

0x87

15 SPS 16BIT

1V/V

1

0

0

0

1

0

0

0

0x88

2V/V

1

0

0

0

1

0

0

1

0x89

4V/V

1

0

0

0

1

0

1

0

0x8a

8V/V

1

0

0

0

1

0

1

1

0x8b

3.75 SPS 18BIT

1V/V

1

0

0

0

1

1

0

0

0x8c

2V/V

1

0

0

0

1

1

0

1

0x8d

4V/V

1

0

0

0

1

1

1

0

0x8e

8V/V

1

0

0

0

1

1

1

1

0x8f

注意:由于在单次转换模式下,通过置位RDY位可以启动新的转换,所以在读取数据前,需要重新写入该寄存器。否则无法开启下次转换。

连续转换共有以下几种组合:

转换模式

转换速率

增益

RDY

C1

C0

O/C

S1

S0

G1

G0

连续转换

240 SPS 12BIT

1V/V

0/1

0

0

1

0

0

0

0

0X10/0x90

2V/V

0/1

0

0

1

0

0

0

1

0X11/0x91

4V/V

0/1

0

0

1

0

0

1

0

0x12/0x92

8V/V

0/1

0

0

1

0

0

1

1

0x13/0x93

60 SPS 14BIT

1V/V

0/1

0

0

1

0

1

0

0

0x14/0x94

2V/V

0/1

0

0

1

0

1

0

1

0x15/0x95

4V/V

0/1

0

0

1

0

1

1

0

0x16/0x96

8V/V

0/1

0

0

1

0

1

1

1

0x17/0x97

15 SPS 16BIT

1V/V

0/1

0

0

1

1

0

0

0

0x18/0x98

2V/V

0/1

0

0

1

1

0

0

1

0x19/0x99

4V/V

0/1

0

0

1

1

0

1

0

0x1a/0x9a

8V/V

0/1

0

0

1

1

0

1

1

0x1b/0x9b

3.75 SPS 18BIT

1V/V

0/1

0

0

1

1

1

0

0

0x1c/0x9c

2V/V

0/1

0

0

1

1

1

0

1

0x1d/0x9d

4V/V

0/1

0

0

1

1

1

1

0

0x1e/0x9e

8V/V

0/1

0

0

1

1

1

1

1

0x1f/0x9f

注意:当连续模式下RDY模式位为1和为0均可以。

第五步:主机等待MCP3421发出应答信号IIC_Wait_Ack()

第六步:主机发送停止信号IIC_Stop()

参考配置代码如下:

void Write_MCP3421(unsigned char WR_Data)

{

IIC_Start();

IIC_SendByte(MCP3421_ADDREDD);   // 1101 a2 a1 a0 0  发送给第一个字节数据 MCP3421地址字节+R/W命令

// 1101 0000 0xd0

IIC_Wait_Ack();

IIC_SendByte(WR_Data); //RDY O/C C1 C0 S1 S0 G1 G0

IIC_Wait_Ack();

IIC_Stop();

}

6 MCP3421数据读取

MCP3421数据读取按照图6-1、6-2所示的读操作时序图进行。其中6-1为18bit模式读操作时序图,6-2为12-16bit模式读操作时序图。在此仅对18bit模式读操作时序图进行分析,12-16bit的分析方法类似。

图 6-1 18bits MCP3421读操作时序图

由图6-1可以看出,MCP3421读操作共包含以下几个部分:

第一步:主机发送启动信号,IIC_Start();

第二步:向MCP3421写入第一个字节。包括器件地址和读写标志位 常规为0xd1。计算方法如下:

地址位格式如下:1 1 0 1 A2 A1 A0

其中A2、A1、和A0出厂就已经定义号好了,默认为A2=A1=A0 = 0,如果需要挂接多个MCP3421,需要联系厂家进行自定义。

最后一位为读写标志位,1为Read模式,0为Write模式。

所以实际写入MCP3421的第一个字节为 1101 0001 = 0xD1

第三步:主机等待MCP3421发出应答信号IIC_Wait_Ack()

第四步:读取第二个数据字节,根据时序图可以看出,其格式如下:

D17

D17

D17

D17

D17

D17

D17

D16

所以,其前6位为重复数据,可以认为是无效位,D17是符号位,D17=1,采集到的Vin+ - Vin-小于0,D17=0,采集到的Vin+ - Vin-大于0,所以可以根据D17判断输入的数据正负

第五步:主机发送应答信号 IIC_Ack();

第六步:读取第三个数据字节,读取中间字节,其格式如下:

D15

D14

D13

D12

D11

D10

D9

D8

第七步:主机发送应答信号 IIC_Ack();

第八步:读取第四个数据字节,读取数据位低八位,其格式如下

D7

D6

D5

D4

D3

D2

D1

D0

第九步:主机发送应答信号 IIC_Ack();

第十步:读取第五个字节,读取寄存器配置数据,其格式如下:

RDY

C1

C0

O/C

S1

S0

G1

G0

第五个字节数据可忽略,不进行读取。

第十一步:主机发送非应答信号,IIC_Nack()

最后一步:主机发送停止信号,IIC_Stop()

参考读取代码如下:

IIC_Start();

IIC_SendByte(0xd1);                   //0xd1=0b11010001, 最后一位1表示单片机接收数据

IIC_Wait_Ack();                       //MCP3421发出应答ACK信号

//读取第二个字节数据 Upper Data Byte

elech=(long int)IIC_ReadByte();       //NULL NULL NULL NULL NULL NULL D17 D16

IIC_Ack();                            //主器件发出应答信号

//读取第三个字节数据 Lower Data Byte

elecm=(long int)IIC_ReadByte();       //D15 D14 D13 D12 D11 D10 D9 D8

IIC_Ack();                            ////主器件发出应答信号

elecl=(long int)IIC_ReadByte();       //D7 D6 D5 D4 D3 D2 D1 D0

IIC_Ack();

config = (long int)(IIC_ReadByte());  //RDY C1 C0 O/C S1 S0 G1 G0

IIC_NAck();// 停止接收

IIC_Stop();

图 6-2 12-16bits MCP3421读操作时序图

7 MCP3421数据转化

在分析数据转换前,需要了解MCP3421数据存储格式,然后才能将采集得到的数据进行正确转换。

数字输出代码与输入电压和 PGA 设置成正比。输出数据为二进制补码格式。在这种编码方式下, MSB 位可以作为符号位。当 MSB 为逻辑 0,表示为正值;当 MSB为逻辑 1,表示为负值。

输出代码与实际输入电压之间的关系如下:

输出代码 = (指定采样速率下的最大代码+1)*PGA * (Vin+ - Vin-)/LSB

其中不同采样速率对应的最大代码如下:

LSB对应的表达式如下:

LSB = 2*VREF/2^SPS=2*2.048V / 2^SPS

所以基于以上表述可以得到输出电压的计算表达式如下:

当MSB=0(输入正电压)

输入电压=(输出代码)* LSB /PGA

当MSB=1(输入负电压)

输入电压=(输出代码的二进制补码) * LSB /PGA

以18bit采样 PGA =1V/V为例数据转化参考代码如下:

//开始进行数据转化

AD_B_Result=(elech<<16)|(elecm<<8)|(elecl); //将三个数据进行整合,整合成一个24位的数据

LSB = (float)(2.0 * 2.048) / 262144;

PGA = 8;

if(AD_B_Result&0x020000) //符号位D17为1,代表测得的为负数

{

AD_B_Result=AD_B_Result&0x01ffff;          //由于数据elech的前6个字节没有用,所以将其清零

AD_F_Result = -(float)(LSB * (AD_B_Result))/PGA;

}

else

{

AD_B_Result=AD_B_Result&0x03ffff;          //由于数据elech的前6个字节没有用,所以将其清零

AD_F_Result = (float)(LSB * AD_B_Result)/PGA;

}

AD_F_Result便为最终的输出电压,单位为V。

8 MCP3421使用仿真验证

8.1 基于MSP430F249的MCP3421使用仿真结果

图8-1 基于MSP430F249 PT100温度采集系统

PT100经过惠更斯电桥计算得到mV级电压接入MCP3421,然后MCP3421和MSP430F249通过IIC连接,采集结果通过LCD1602进行显示。

仿真结果如图8-2所示,其中电压为惠更斯电桥的输出电压,温度通过matlab拟合电压和温度之间的关系求得。

图8-2 仿真结果

proteus中IIC Debug显示的数据如图8-3所示

图8-3 IIC Debug数据

第一行: S D0 A 8C A P

启动,发送D0(设备地址+R/W),设备应答成功,发送8C(配置寄存器),设备应答成功,停止。

第二行:S D1 A 00 A 14 A A4 A 8C N P

启动,发送D1(设备地址+R/W),设备应答成功,读取第一个字节00,应答成功,读取第二个字节14,应答成功,读取第三个字节A4,应答成功,读取第四个字节8C(配置信息),发送非应答信号,停止

8.2 基于AT89C52的MCP3421使用仿真结果

图8-3 基于AT89C52 热电偶温度采集系统

使用三个MCP3421,通过一个IIC连接至AT89C52,通过矩阵键盘实现对三个热电偶温度的测试。三个MCP3421的地址分别为:

U6: 1101 000x

读模式:0xd1

写模式:0xd0

U7: 1101 001x

读模式:0xd3

写模式:0xd2

U8: 1101 100x

读模式:0xd9

写模式:0xd8

图8-4 K型热电偶测量结果

图8-5 IIC debug数据

图8-6 E型热电偶测量结果

图8-7 IIC debug数据

图8-8 J型热电偶测量仿真结果

图8-9 IIC Debug仿真结果

制作不易,如有错误或者不好理解的地方请及时留言

如需仿真源文件,请联系EMAIL:whl1457139188@163.com

并添加QQ:975107705

请注明MCP3421详解以及需要的仿真文件(需付费购买)

 

MCP3421使用详解的更多相关文章

  1. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  2. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  3. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  4. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  5. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  6. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  7. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

  8. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  9. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

随机推荐

  1. JavaScript和php数组的定义

    JavaScript: var arr=[值1,值2,值3];                     //隐式创建 var arr=new Array(值1,值2,值3);      //直接实例化 ...

  2. 2019-2020-1 20199329《Linux内核原理与分析》第六周作业

    <Linux内核原理与分析>第六周作业 一.本周内容概述: 学习系统调用的相关理论知识,并使用库函数API和C代码中嵌入汇编代码两种方式使用getpid()系统调用 学习系统调用syste ...

  3. java中使用Semaphore构建阻塞对象池

    java中使用Semaphore构建阻塞对象池 Semaphore是java 5中引入的概念,叫做计数信号量.主要用来控制同时访问某个特定资源的访问数量或者执行某个操作的数量. Semaphore中定 ...

  4. springmvc返回不带引号的字符串

    springmvc返回不带引号的字符串项目使用springboot开发的,大部分出参为json,使用的fastJson,现在有的接口需要返回一个success字符串,发现返回结果为“success”, ...

  5. 负载均衡服务之HAProxy访问控制ACL

    前文我们聊到了haproxy的错误页的配置,自定义日志的配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12797913.html:今天我们主要来看看hap ...

  6. cookie ,session 和localStorage的区别详解

    2019独角兽企业重金招聘Python工程师标准>>> cookie ,session 和localStorage的区别详解 博客分类: js 当你在浏览网站的时候,WEB 服务器会 ...

  7. pytest文档38-allure.setp添加测试用例步骤

    前言 一般流程性的测试用例,写成自动化用例时,步骤较多写起来会比较长.在测试用例里面添加详细的步骤有助于更好的阅读,也方便报错后快速的定位到问题. 举个常见的测试场景用例:从登陆开始,到浏览商品添加购 ...

  8. 树形dp compare E - Cell Phone Network POJ - 3659 B - Strategic game POJ - 1463

    B - Strategic game POJ - 1463   题目大意:给你一棵树,让你放最少的东西来覆盖所有的边   这个题目之前写过,就是一个简单的树形dp的板题,因为这个每一个节点都需要挺好处 ...

  9. 【Linux基础总结】Linux系统管理

    Linux系统管理 Linux磁盘管理命令.内存查看命令讲解 系统信息 查看系统 $ uname 查看系统版本号 $ uname -r 查看cpu信息 $ cat /proc/cpuinfo 查看内存 ...

  10. SAP ME31K SUBOBJECT_NOT_FOUND

    SUBOBJECT_NOT_FOUND 在使用BAPI:BAPI_CONTRACT_CREATE创建协议时报错, 错误位置在此处,子对象没找到 GOOGLE到相关解决方案 事务代码:SLG0 新增对象 ...