发新帖本帖赏金 30.00元(功能说明)我要提问
返回列表
打印
[资料干货]

国产AD芯片 MS1243应用

[复制链接]
2324|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 woai32lala 于 2022-5-23 12:27 编辑

国产芯片AD芯片 MS1243应用
#申请原创# @21小跑堂
     前几天做项目用到了一款国产多路ADC采集芯片瑞盟Ms1243,期间遇到不少坑,来跟大家分享一下。
     MS1242/MS1243 是一款高精度、宽动态范围、Σ-Δ模 数转换芯片,其工作电压为 2.7V 至 5.25V,可以达到 24bit 无失码转换,且其有效精度可达 21bit。
     所谓的无失码就是就是不丢码,比如 8位的ADC,加入从0000 0000 到1111 1111 在实际测试中,每一个码都可以测到就称之为无失码, 若在0000 0001 往上走 到0000 0003的时候 没有出现过0000 0002 就说明丢码了。
    该芯片有8个模拟输入通道,如果作为单通道输入,可以是8路ADC采集,如果作为差分,一路固定参考源,另外7路差分ADC,我才用的是AIN0 - AIN6是变换通道输入。AIN7接地作为公共参考端。以下是该芯片的内部结构图和原理图。
    说到原理图,这就遇到了第一个坑,因为我懒,直接从某商城上下的它的原理图,如下图所示,注意!!这个图是错误的。
  
大家看到了吧,他的引脚顺序和人家数据不一样!!坑死我了!! 左边是错的,右边才是对的, 接着往下,来看他的引脚说明。

第二个坑,第4号管脚,4 PDWN I 掉电控制信号,低有效。这个芯片是由掉电控制,当该引脚输入为低电平的时候,芯片掉电不工作,
当初画图有点快,忘记了这个管脚,以为是内部上拉高电平。直至刷完板子回来才发现这个问题。该引脚可以通过1个4.7k的电阻上拉至
VCC电平即可,如果考虑的低功耗,可以通过引脚来控制该芯片引脚的电平。
接着往下,要注意的是外部晶振的时钟的频率要求

要求是1M - 5M之间,我采用的是4.9152M晶振,谐振电容选用10pf ,原理图如下

其他参数指标大家可以自己了解一下,我们接着往下说。
该芯片需要有外部的参考电压源,这个参考电压源的电压是有要求的,如下图所示

我们采用的是3.3V供电,参考电压电压源选择是2.5V,注意,是在RANGE值为1的时候才可设置为2.5V。硬件大致就这些,接下来我们说软件部分。
MCU我们采用的是华大HC32F460,通过SPI协议与MS1243进行通信。
第一个坑是时钟频率
MS1243的时钟频率为4.9152M,我们MCU的SPI时钟频率不能高于该时钟频率,最好小于芯片时钟频率的1/2
我们采用的是1.5M时钟的频率,华大的SPI时钟频率为100M,因此进行时钟分频。
  stcSpiInit.enClkDiv = SpiClkDiv64; //时钟分频64,我们进行了64分频,100 / 64  = 1.5625M,比较合适。
第二个坑是MS1243 空闲时的时钟极性和时钟相位。

由图得知,MS1243的SPI协议规定为空闲时时钟为低电平,第一个上升沿发送数据,偶数边沿采集数据,不要弄反了。

第三个坑

DRDY管脚是数据是都准备就绪的标志,当该引脚电平为低的时候,表示数据准备好可以度,当该引脚电平为低的时候,此时数据正在转换,不能去读,
因此可以将此管脚作为中断输入,下降沿触发去读取24位数据。
    当MCU没给MS143芯片读取数据信号事,MS1243会自己按照一定的频率进行数据更新,频率如下图所示。

第四个坑是该芯片需要校正时候的延时问题和置位问题。

根据晶振的频率,一个数据输出周期大概是50ms左右,两个时钟周期就是100ms,我们延时150ms

值得注意的是,ACR寄存器第二个为即RANGE校准是必须为0,而我们需要的是RANGE为1。因此在校准完成之后
将ACR寄存器的RANGE位置1.并且校准完之后,第一个数据是不正确的,应该舍弃。

第四个坑,也是和重要的就是发送读取命令和读取数据要有足够的时间间隔。

SDI是数据输入,也就是MCU给MS1243发送命令或者写寄存器
该芯片读取数据的命令有两种,一种是连续读取,一种是单词读取
我们采用的单次读取操作,即发送命令
static unsigned char MS1243_SendByte(unsigned char byte)
{
    unsigned char u8Byte;

    /* Wait tx buffer empty */
    while (Reset == SPI_GetFlag(MS1243_SPI1_UNIT, SpiFlagSendBufferEmpty))
    {
    }
    /* Send data */
    SPI_SendData8(MS1243_SPI1_UNIT, byte);
    /* Wait rx buffer full */
    while (Reset == SPI_GetFlag(MS1243_SPI1_UNIT, SpiFlagReceiveBufferFull))
    {
    }
    /* Receive data */
    u8Byte = SPI_ReceiveData8(MS1243_SPI1_UNIT);

    return u8Byte;
}

  MS1243_SendByte(CMD_RDATA);


发送完读取命令之后,要等待50个时钟周期, 50 *(1 / 4915200) = 10us左右
发送完转换命令之后,我们延时了10us,然后进行了数据读取

读取了3个字节 24位的数据
然后将读取的数据转换为电压,24位的分辨率

得到电压之后进行相应的运算转换即可。
最后一点,我们是多通道的ADC转化芯片,肯定要进行采集通道的切换操作

切换通道指令即往寄存器MUX写通道配置信息,高四位正输入端的通道,低四位为负输入端通道,我们负输入端固定,即为MS1243_MUXN_AIN7。
发送配置MUX寄存器指令

写寄存器命令WREG,读寄存器命令RREG


注意一点,在切换通道时,尽量在DRDY引脚电平为低的时候,防止出现错误。
读取完24位数据之后,DRDY会立即被拉高。
以上就对写MS4243多路ADC采集芯片学习的总结。

886116287a8cd37ac8.png (131.16 KB )

886116287a8cd37ac8.png

使用特权

评论回复

打赏榜单

wanghar 打赏了 10.00 元 2023-02-03
理由:1243详细例程

21小跑堂 打赏了 20.00 元 2022-05-24
理由:恭喜通过原创文章审核!请多多加油哦!

评论
21小跑堂 2022-5-24 13:15 回复TA
使用小华MCU通过SPI连接MS4243实现多路ADC采集。 

相关帖子

沙发
suncat0504| | 2022-5-31 12:06 | 只看该作者
楼主辛苦,写得很细,国产的还不是那么成熟,尽量支持。以后会慢慢好起来的

使用特权

评论回复
板凳
Wayner| | 2022-8-5 15:26 | 只看该作者
谢谢分享,要是我调试,不知要花多少天才能搞定.看你写得这么详细,我也打算掉一次坑里

使用特权

评论回复
地板
MAA256| | 2022-11-14 16:33 | 只看该作者
你好,请问楼主可以分享一下例程嘛

使用特权

评论回复
5
xbug| | 2022-11-15 22:17 | 只看该作者
同求例程

使用特权

评论回复
评论
MAA256 2022-11-16 16:38 回复TA
兄弟研究出来了么,我采到的数一直在跳 
6
datouyuan| | 2022-11-19 10:13 | 只看该作者
楼主辛苦

使用特权

评论回复
7
wanghar| | 2023-2-1 22:56 | 只看该作者
求例程。在stm32F103上一直没有调通。wanghar@163.com

使用特权

评论回复
评论
zsq2396988422 2023-3-3 15:06 回复TA
兄弟咋样了?我也是F103一直没调通3133747364@qq.com 可以交流吗? 
8
woai32lala|  楼主 | 2023-2-4 08:48 | 只看该作者

文件大小限制了,上传不了

使用特权

评论回复
评论
zsq2396988422 2023-3-3 15:07 回复TA
兄弟能发一份历程给邮箱吗? 3133747364@qq.com 
9
天意无罪| | 2023-3-3 21:02 | 只看该作者
国产做模拟芯片且做的不错的公司很少,稍微要求高点的模拟运放、模数转换器很难找到国产替代。

使用特权

评论回复
发新帖 本帖赏金 30.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

107

主题

535

帖子

5

粉丝