MCP3421使用详解
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使用详解相关推荐
- 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)
首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...
- JVM年轻代,老年代,永久代详解
秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...
- docker常用命令详解
docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...
- 通俗易懂word2vec详解词嵌入-深度学习
https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...
- 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法
深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 ...
- CUDA之nvidia-smi命令详解---gpu
nvidia-smi是用来查看GPU使用情况的.我常用这个命令判断哪几块GPU空闲,但是最近的GPU使用状态让我很困惑,于是把nvidia-smi命令显示的GPU使用表中各个内容的具体含义解释一下. ...
- Bert代码详解(一)重点详细
这是bert的pytorch版本(与tensorflow一样的,这个更简单些,这个看懂了,tf也能看懂),地址:https://github.com/huggingface/pytorch-pretr ...
- CRF(条件随机场)与Viterbi(维特比)算法原理详解
摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...
- pytorch nn.LSTM()参数详解
输入数据格式: input(seq_len, batch, input_size) h0(num_layers * num_directions, batch, hidden_size) c0(num ...
最新文章
- pandas新字段(数据列)生成、使用np.where或者apply lambda函数结合if else生成新的字段,详解及实战
- 使用easyBCD在Win10安装Ubuntu16.04LS安装双系统
- 实测:xml与json速度约差4倍
- java jsp filename filepath 图片上传_SpringMVC实现文件上传与下载
- ppt批量缩略图_PPT如何在文件夹下显示缩略图的方法
- 【CodeForces - 558C】Amr and Chemistry(位运算,bfs,计数,思维,tricks)
- 一些很有意思的JS现象
- 汇顶科技【软件工程师】面经
- 深度了解视频直播CDN技术
- GNU宣言——Ubuntu*操作系统将ubuntu精神带到了软件世界
- Mellanox网卡不能分配VF解决方法
- golang实现子网掩码和网络位长度相互转换
- Grammarly:最优秀的日常英文写作辅助工具——论文英文校验
- Python 制作藏头诗生成器(超详细)
- 二维码推广方法20种
- 软件测试 | 测试开发 | Sikuli 基于图形识别的自动化测试技术
- 英语语法:词法之动词不定式
- java imgui,发布使用 IMGui 基于 msys2 平台编写的软件
- 应用ceph块存储(ceph-13.2.10)
- mysql 优化查询方法,优化MYSQL查询的详细方法
热门文章
- VUE安装及HelloVUE
- Tmux 学习摘要3--使用脚本定制 tmux 环境
- 2017云栖大会开源峰会预告
- JAVA对象转json字符串性能优化
- 冯诺伊曼提出的计算机工作原理又称为,冯.诺依曼计算机的基本工作原理是什么??...
- php小程序上传视频到七牛,小程序上传视频到七牛云
- 智慧政务 | 云计算赋能传统政务升级
- rocketmq设置端口号_nginx代理rocketmq端口
- Mac + 重装系统 + 恢复出厂设置 + 清理电脑
- 台湾厂商未来三个月全面上调主板价格