目录

MCP3424配置

工作模式连续转换模式

单次转换模式

代码进行配置


英文规格书下载链接如下MCP3424英文规格书:

https://ww1.microchip.com/downloads/en/DeviceDoc/22088c.pdf

中文规格书下载参考MCP3421规格书(单通道)

2009版

https://bbs.elecfans.com/jishu_2245219_1_1.html

2006版

MCP3421中文资料 (带I2C-电子电路图,电子技术资料网站

以下2种封装  左:TSSOP(管脚细,间距密0.65mm) 和右:SOIC(管脚粗,间距大1.27mm)

18位分辨率

4通道差分输入操作

差异输入操作

板载电压参考,15 ppm /°C漂移

板载PGA,增益为1,2,4,8

可编程数据速率选项

3.75 SPS(18位)

15 SPS(16位)

60 SPS(14位)

240 SPS(12位)

INL 10 ppm FSR max

低电流消耗,3V时135μA

一次性或连续转换选项

支持具有用户可配置地址的I2C™串行接口

扩展温度范围:-40°C至+ 125°C

最近由于项目需要使用到了MCP3424,这款芯片,概述如下:
        MCP3422、 MCP3423 和 MCP3424 器件( MCP3422/3/4)为 Microchip MCP342X 系列的低噪声和高精度 18 位  A/D( delta-sigma analog-to-digital)转换器。

这些器件可将模拟输入信号转换成分辨率高达18 位的数字代码。

片内 2.048V 基准电压使输入电压范围为 ±2.048V 差分输入 (满量程范围 = 4.096V/PGA)。

用户通过 2 线 I2C 串行接口对控制配置位进行设定,从而使这些器件按3.75、 15、 60或240采样/秒( samplesper second, SPS)的速率进行转换。

在每个转换周期内,器件自动对失调和增益误差进行校正。器件可以在不同的温度和电源电压波动下,在不同转换周期内提供精确的转换结果。

用户可在 A/D 转换之前选择 PGA 增益为 x1、 x2、 x4 或x8 对信号进行放大。这允许 MCP3422/3/4 器件在高分辨率下仍可转换很小的输入信号。

MCP3422/3/4 器件提供两种转换模式:( a)单次转换模式和 ( b)连续转换模式。

单次转换模式时,器件在完成一次转换后自动进入低电流待机模式,直至接收到新的转换命令。这样可显著降低空闲周期内的电流消耗。

连续转换模式时,器件以设定的转换速率进行连续转换,并用最新的转换数据来更新输出缓冲器中的数据。

器件采用 2.7V 至 5.5V 单电源供电,并使用兼容标准( 100 kHz)、快速 ( 400 kHz)或高速 ( 3.4 MHz)模式的两线 I2C 串行接口。MCP3423和MCP3424的I2C地址位可使用两个外部I2C地址选择引脚 ( Adr0 和 Adr1)进行设置。通过将这两个地址选择引脚连接到 VDD、 VSS 或浮空,用户可以将器件的地址配置成 8 个可选地址中的一个。 MCP3422的 I2C 地址位在工厂生产时进行编程设置。

概述挺多,不过总结起来就是,这款芯片拥有四个通道可以进行18位的模拟信号采集,使用两线 I2C 进行数据通信。

首先这款芯片的使用,要使用I2C进行数据通信,这里采用软件I2C的方式,进行数据通信。使用的代码是用了正点原子的I2C代码,这里就不多赘述了,直接看要如何配置和读取数据。

MCP3424配置

在进行MCP3424配置之前,需要对其可配置的内容进行了解,首先MCP3424的配置包括:工作模式(连续转换模式,单次转换模式)、通道选择、采样速率、PGA增益。而且这款芯片有个配置寄存器需要知道的,定义如下:

工作模式
连续转换模式

如果 O/C 位设置成逻辑 “高”,器件将进行连续转换。一旦完成转换, RDY 位触发成 0,同时将结果放置在输出数据寄存器中。器件马上开始另外一次转换,并用最新的数据覆盖掉输出数据寄存器中原来的数据。当转换结束时,器件清除数据就绪标志位 ( RDY 位 = 0)。如果主器件读取了最新转换结果,则器件设置数据就绪标志位 ( RDY 位 = 1) 。
• 写配置寄存器时:
- 在连续模式下设置RDY位不会产生任何效果。
• 读转换数据时:
- RDY 位 = 0,意味着最新转换结果就绪。
- RDY 位 = 1,意味着自上次转换后,转换结果并没有被更新。新的转换正在进行中,当新的转换结果就绪时, RDY 位将被清除。

单次转换模式

若选择单次转换模式,器件仅进行一次转换,并更新输出数据寄存器,清除数据就绪标志位 ( RDY = 0),然后进入低功耗待机模式。当器件接收到新的写命令且RDY = 1 时,则开始新的单次转换。
• 写配置寄存器时:
- 在单次转换模式下, RDY 位需要设置,然后才能开始一次新的转换。
• 读转换数据时:
- RDY 位 = 0 意味着最新转换结果就绪。
- RDY 位 = 1 意味着自上次转换后, 转换结果并没有被更新。新的转换正在进行中,当新的转换结果就绪时, RDY 位将被清除。

代码进行配置

前面已经对MCP3424的配置内容有了了解,后面就开始使用代码进行配置。

对所有配置进行宏定义,从而增加配置时的代码可读性。

#define CMD_READ     0xD1
#define CMD_WRITE 0xD0//MCP3424
// fields in configuration register
//  RDY C1 C0 nO/C    S1 S0 G1 G0
#define MCP342X_GAIN_X1    0x00 // PGA gain X1
#define MCP342X_GAIN_X2    0x01 // PGA gain X2
#define MCP342X_GAIN_X4    0x02 // PGA gain X4
#define MCP342X_GAIN_X8    0x03 // PGA gain X8#define MCP342X_12_BIT     0x00 // 12-bit  240 SPS    5ms
#define MCP342X_14_BIT     0x04 // 14-bit   60 SPS   17ms
#define MCP342X_16_BIT     0x08 // 16-bit   15 SPS   67ms
#define MCP342X_18_BIT     0x0C // 18-bit 3.75 SPS  267ms#define MCP342X_CONTINUOUS 0x10 // 1 = continuous, 0 = one-shot
#define MCP342X_ONESHOT         0x00 // 1 = continuous, 0 = one-shot#define MCP342X_CHANNEL_1  0x00 // select MUX channel 1
#define MCP342X_CHANNEL_2  0x20 // select MUX channel 2
#define MCP342X_CHANNEL_3  0x40 // select MUX channel 3
#define MCP342X_CHANNEL_4  0x60 // select MUX channel 4#define MCP342X_START      0x80 // write: start a conversion
#define MCP342X_BUSY       0x80 // read: output not ready#define MCP342X_CHAL_1_CONFIG   MCP342X_CHANNEL_1|MCP342X_CONTINUOUS|MCP342X_16_BIT|MCP342X_GAIN_X1
#define MCP342X_CHAL_2_CONFIG   MCP342X_CHANNEL_2|MCP342X_CONTINUOUS|MCP342X_16_BIT|MCP342X_GAIN_X1
#define MCP342X_CHAL_3_CONFIG   MCP342X_CHANNEL_3|MCP342X_CONTINUOUS|MCP342X_16_BIT|MCP342X_GAIN_X1
#define MCP342X_CHAL_4_CONFIG   MCP342X_CHANNEL_4|MCP342X_CONTINUOUS|MCP342X_16_BIT|MCP342X_GAIN_X1#define LSB_12BIT        1000   //uV
#define LSB_13BIT        250
#define LSB_16BIT        65.5
#define LSB_18BIT        15.625

使用I2C对MCP3424进行配置的时候,流程如下:

起始信号->发送写控制码->等待ACK->发送配置信息->等待ACK->停止信号。

具体代码如下

/**************************************************************************** @fn          IIC_MCP3424_CHANGE_CHL*     * @brief       对MCP3424进行配置,一共四个通道,每次只配置一个通道*     * @data        2018年06月05日*     * @param       u8 channel,通道号(1-4)*              *              * @return      void****************************************************************************/
void IIC_MCP3424_CHANGE_CHL(u8 channel)
{switch (channel){case 1:IIC_Start();            IIC_Send_Byte(CMD_WRITE);//告知MCP3424将要进行写操作IIC_Wait_Ack();IIC_Send_Byte(MCP342X_CHAL_1_CONFIG);//配置CP3424IIC_Wait_Ack();IIC_Stop();break;case 2:IIC_Start();IIC_Send_Byte(CMD_WRITE);IIC_Wait_Ack();IIC_Send_Byte(MCP342X_CHAL_2_CONFIG);IIC_Wait_Ack();IIC_Stop();break;case 3:IIC_Start();IIC_Send_Byte(CMD_WRITE);IIC_Wait_Ack();IIC_Send_Byte(MCP342X_CHAL_3_CONFIG);IIC_Wait_Ack();IIC_Stop();break;case 4:IIC_Start();IIC_Send_Byte(CMD_WRITE);IIC_Wait_Ack();IIC_Send_Byte(MCP342X_CHAL_4_CONFIG);IIC_Wait_Ack();IIC_Stop();break;default:break;}
}

这样,MCP32424就配置完成了,然后在这里,我是先配置一个通道的参数,然后读取这个通道的数值,然后再配置下一个通道。

MCP3424数据读取
前面配置讲完了,后面进行数据读取的说明。

进行MCP3424的数据读取时,需要注意的是,不同的采样精度,读取的数据长度不同,18位精度的读取回来的数据长度为4,前3个数值都是采样到的数据(高位在前),第4个是MCP3424的配置信息。主要是18位精度有区别,其他的12位,14位,16位读取的长度都为3,前2个数值都是采样到的数据(高位在前),第3个是MCP3424的配置信息。

数据的读取流程如下:

起始信号->发送读控制码->等待ACK->读取第1个数据->等待ACK->读取第2个数据->等待ACK->读取第3个数据->(等待ACK->读取第4个数据->)等待NACK->停止信号。

下面贴出18位和16位的数据读取代码:

/**************************************************************************** @fn          IIC_MCP3424_READ_16bit*     * @brief       读取MCP3424当前通道的数据*     * @data        2018年06月05日*     * @param       uint32_t *adcDate :当前通道的测量出来的数值*              *              * @return      uint8_t:当前通道的配置信息****************************************************************************/
uint8_t IIC_MCP3424_READ_16bit(int16_t *adcDate)
{uint8_t readBuff[2] = {0};uint8_t configMCP3424 = 0;IIC_Start();IIC_Send_Byte(CMD_READ);//告知MCP3424进行数据读取IIC_Wait_Ack();readBuff[0] = IIC_Read_Byte(ACK);//第一字节为数据高位readBuff[1] = IIC_Read_Byte(ACK);//第二字节为数据低位configMCP3424 = IIC_Read_Byte(NACK);//第三字节为MCP3424的配置IIC_Stop();if((configMCP3424 & 0x80) == MCP342X_BUSY) {*adcDate = 0x7AAA; //此时MCP3424返回的数值为无效数值}else{*adcDate = (int32_t)readBuff[0] << 8;//整合数据*adcDate = (int32_t)readBuff[1] | *adcDate;}return configMCP3424;
}
/**************************************************************************** @fn          IIC_MCP3424_READ_18bit*     * @brief       读取MCP3424当前通道的数据*     * @data        2018年06月05日*     * @param       uint32_t *adcDate :当前通道的测量出来的数值*              *              * @return      uint8_t:当前通道的配置信息****************************************************************************/
uint8_t IIC_MCP3424_READ_18bit(int32_t *adcDate)
{uint8_t readBuff[3] = {0};uint8_t configMCP3424 = 0;IIC_Start();IIC_Send_Byte(CMD_READ);//告知MCP3424进行数据读取IIC_Wait_Ack();readBuff[0] = IIC_Read_Byte(ACK);//第一字节为数据高位(数据长度为18bit)readBuff[1] = IIC_Read_Byte(ACK);//第二字节为数据中位readBuff[2] = IIC_Read_Byte(ACK);//第三字节为数据低位configMCP3424 = IIC_Read_Byte(NACK);//第四字节为MCP3424的配置IIC_Stop();if((configMCP3424 & 0x80) == MCP342X_BUSY) {*adcDate = 0xAAAAAAAA; //此时MCP3424返回的数值为无效数值}else{//*adcDate = ((int32_t)readBuff[0] & 0x80) << 24 | *adcDate;//整合数据*adcDate = ((int32_t)readBuff[0] & 0x01) << 16 | *adcDate;//整合数据*adcDate = (int32_t)readBuff[1] << 8 | *adcDate;*adcDate = (int32_t)readBuff[2] | *adcDate;if(readBuff[0] & 0x80){*adcDate = 0x0001FFFF - *adcDate;*adcDate = 0 - *adcDate;}}return configMCP3424;
}

至此MCP3424的数据读取就完成。
————————————————
版权声明:本文为CSDN博主「挫爆了的大M」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a5480991/article/details/81089554

18bit ADC 转换 MCP3424的使用说明相关推荐

  1. AVR系列之ADC转换

    八月的最后一天 待到现在才开始写总结 显得有点慢了 嘿 这完全是因为早上上了两节课后 便去图书管找几本书 又待到了吃午饭时间 然后一直拖到现在 汗 可真多理由呢 找打 汗 还是说多废话了 就整理一下关 ...

  2. zigbee cc2530 adc转换

    cc2530的通用datasheet上没怎么讲到adc的一些特性, http://download.csdn.net/detail/songqqnew/5132088 而是下面这个文档有较多讲解 ww ...

  3. STM32 ADC转换实验

    摘自:STM32 ADC转换实验 作者:追兮兮 发布时间: 2020-10-29 09:42:24 网址:https://blog.csdn.net/weixin_44234294/article/d ...

  4. rsa 模数 指数转换 c语言_模数转换,你必须知道的8个经典ADC转换电路方案

    模数转换器即A/D转换器,或简称ADC,通常是指一个将模拟信号转变为数字信号的电子元件.通常的模数转换器是将一个输入电压信号转换为一个输出的数字信号.由于数字信号本身不具有实际意义,仅仅表示一个相对大 ...

  5. 分享一个stm8s003单片机的ADC转换,附加一个冒泡算法(用于减少误差)

    1.先上脚位图,不要问我为什么是stm8f103,stm8f103和stm8s003只有内存的不同. 2.上代码,选用PC4(AIN2)为ADC转换引脚,只提供函数,自己选择调用,不追求精度的话可以不 ...

  6. NTC热敏电阻温度采集与adc转换

    前言: ntc热敏电阻的R值是10k,B值是3950 使用的是STM32F103RCT6的ADC 文章目录 1.电路理论 2. NTC热敏电阻阻值与温度之间的转换 3.NTC热敏电阻温度采集与adc转 ...

  7. 模数转换,你必须知道的8个经典ADC转换电路方案

    模数转换器即A/D转换器,或简称ADC,通常是指一个将模拟信号转变为数字信号的电子元件.通常的模数转换器是将一个输入电压信号转换为一个输出的数字信号.由于数字信号本身不具有实际意义,仅仅表示一个相对大 ...

  8. ADC 转换:神舟IV实验

    STM32手册中写的很详细:单次转换/连续转换,规则通道/注入通道,扫描模式.很多设置,但是比TIM简单多了感觉.... 双ADC模式还没有看 正点原子的例程网址,给出 http://openedv. ...

  9. 关于ADC转换设计中的基本问题(82问)

    1.如何选择高速模数转换之前的信号调理器件;如何解决多路模数转换的同步问题? ADC之前的信号调理,最根本的原则就是信号调理引起的噪声和误差要在ADC的1个LSB之内.根据这个原则,可以选择指标合适的 ...

最新文章

  1. mysql 存guid类型_从C#在MySQL中存储GUID
  2. 未备案域名临时跳过备案提示_做好了网页,有域名和服务器,还要怎么搭建网站?...
  3. JConsole连接远程linux服务器配置
  4. Java面试问题汇总(Redis)
  5. 求助!C++ 实践之引入外部头文件失败
  6. 1000个JQuery插件(转载)
  7. 手机自动签到简易应用
  8. 读书笔记-穿越计算机的迷雾
  9. 微信小程序 图片处理的几个样式
  10. vcf格式文件转化为Excel(csv)格式文件(R语言的write.csv,write.table功能,Excel表的文件导入功能)...
  11. 设计模式的艺术 行为型模式之观察者模式
  12. safe mode bypass and rooting
  13. 怎么用python读取excel图_如何用Python读取Excel中图片?
  14. 个人如何做一个能赚钱的网站?
  15. [爬虫] 上海大学自动抢课工具
  16. 体验IPTV,我们离三网合一还有多远...?
  17. 微信小程序JavaScript判断值是否为空工具类方法
  18. 深度学习在智能交通的应用--综述
  19. android屏幕解锁图案,安卓手机图案屏幕锁解锁方法!!
  20. 【疾病检测】基于matlab机器视觉黑色素瘤皮肤癌检测【含Matlab源码 1689期】

热门文章

  1. Spread for WinForms 电子表格控件基础视频教程-王继飞-专题视频课程
  2. 含有分布式电源的三相不平衡配电网潮流计算【IEEE33节点】(Matlab代码实现)
  3. c语言和python哪个有用_python和c语言哪个实用?
  4. 国家科技创新重大项目获批,人工智能专项,云创大数据参与
  5. 最新资讯:浩辰CAD机械2013软件将于6月强势推出
  6. selenium篇之半自动发帖机
  7. 什么是灵活的软件授权模式,如何选择软件加密狗?
  8. LinuxC/C++编程基础(24) 使用thrift/rpc开发简单实例(续2)
  9. 5G的到来,真正受益的应该是数据中心
  10. 使用360云备份数据库