[模拟产品] MCP3564 在STM32H743 上的使用

[复制链接]
1562|5
手机看帖
扫描二维码
随时随地手机跟帖
cym_anhui|  楼主 | 2021-10-20 16:06 | 显示全部楼层 |阅读模式
本帖最后由 cym_anhui 于 2021-10-28 13:08 编辑

[url=home.php?mod=space&uid=760190]@21小跑堂 #申请原创#[/url] 1. 设计目的
我们公司之前一直使用ADI的adc转换器 ad7175 大家知道ad7175巨贵,大约80元附近,前几天老板觉得这个ad成本太高
,让我们找找有没有其他家24Bit多通道adc,能代替ad7175,然后我搜了一下,发现mcp3564也是24bit,样品才20元不到,可接4个查分通道或8路单端,满足我们的要求。
2. 开始设计
然后从嘉立创买了几个,画了一块板,前几天板子和元器件都到了,让硬件部门帮我焊了2块,还是SPI接口,程序只是加了稍稍改动。
把寄存器地址和名称改了一下,
程序部分,摘录部分如下
void MX_SPI2_Init(void)
{
    hspi2.Instance                                  = SPI2;
    hspi2.Init.Mode                          = SPI_MODE_MASTER;                                //
    hspi2.Init.Direction                  = SPI_DIRECTION_2LINES;                //
    hspi2.Init.DataSize                  = SPI_DATASIZE_8BIT;                        //
   
    hspi2.Init.NSS                                  = SPI_NSS_SOFT;                                //
    hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;        //
   
    hspi2.Init.TIMode                          = SPI_TIMODE_DISABLE;                        
    hspi2.Init.CRCCalculation          = SPI_CRCCALCULATION_DISABLE;        //
    hspi2.Init.CRCPolynomial          = 0x7;

    if (HAL_SPI_Init(&hspi2) != HAL_OK)
    {
        Error_Handler();
    }
}
uint8_t SPI_ReadWriteByte(uint8_t TxData)
{               
    uint8_t  RxData;
        #if (MCP3564_SPI4 == 1)
    HAL_SPI_TransmitReceive(&hspi4,&TxData,&RxData,1,1000);         
        #else
    HAL_SPI_TransmitReceive(&hspi2,&TxData,&RxData,1,1000);  
        #endif
        
    return RxData;
}
void ReadWriteSPI(uint8_t *Read, uint8_t *Write, uint8_t unLen)   
{
    uint8_t i;
    i = 0;        
        #if (MCP3564_SPI4 == 1)
        MCP3564_SPI_CS4_HIGH();
    MCP3564_SPI_CS4_LOW();        
        #else
        MCP3564_SPI_CS2_HIGH();
    MCP3564_SPI_CS2_LOW();        
        #endif        
    do
    {
        Read<i> = SPI_ReadWriteByte(Write<i>);
        ++i;
    }while(i<unLen);
}</i></i>

3. 硬件检查
检查有无短路,没有,上电,测试电压,OK
4.  驱动测试
简单看了一下芯片守则,发现MCP3564的寄存器地址和命令以及设备地址共同组成一个命令字节,设备地址是2个bit,我的地址是0x01,寄存器地址是0x00---0x0F,,命令有二个BIT,包含读或写,
10是写。11是读。
先读芯片的ID,单元是0x0E(01 1110 11, 组成命令格式0x7B),应该是0x0F,读出来果然是0x0F,说明是对的,不错,说明SPI读写没有问题,
5. 芯片手册 阅读
接下来是慢慢读一下MCP3564 的芯片手册,,
24位分辨率,
4差分或8单端 模拟输入
可编程数据速率高达153,6kSPS,
可编程增益0.33x到64x,
内部时钟和外部时钟可选
内部温度传感器
短路和开路检测
偏置和增益误差校准
IRQ中断输出,方便同步采集
16位CRC校准,保证数据OK
20M SPI兼容模式 模式0,0 或1,1
AVDD电压 2.7V--3.6V
VDD电压 1.8V--3.6V
封装很小UQFN 3mmx3mm
6. ADC读写测试
先写配置,
CONFIG0 ,        地址为 0x01,   8BIT, 配置值为 0x03 ,时钟配置,电流配置,ADC模式配置
CONFIG1 ,         地址为 0x02,  8BIT,配置值为 0x3C ,过采样配置
CONFIG2 ,          地址为 0x03,        8BIT,配置值为 0x8B ,Bias配置,PGA配置
CONFIG3 ,      地址为 0x04,        8BIT,配置值为 0xC3 ,连续采样,24BitADC,CRC 16
                                                使能OFFSET CAL,使能GAIN CAL
IRQ,                  地址为 0x05,        8BIT,配置值为 0x07,IRQ模式,平时高电平,开始转换
MUX,                  地址为 0x06,        8BIT。配置值为 0xDE,配置内部温度传感器
SCAN,                  地址为 0x07,         24BIT,配置为0x201000,延时,扫描 通道
TIMER,                  地址为 0x08,   24BIT,配置为0x000004,扫描通道时间间隔
OFFSETCAL,  地址为 0x09,        24BIT,配置为0x000000,配置OFFSET CAL
GAINCAL,          地址为 0x0A,  24BIT,配置为0x800000,配置GAINSET CAL


然后读ADC值,
计算,和万用表测得的一样,很准确,OK
7. 使用总结
还算顺利,但发现MICROCHIP的datasheet,的结构没有ADI好,觉得读ADI的芯片手册感觉结构化
清晰些,个人只见,也许用microchip芯片较少的原因,还有发现microCHip的fae不热情啊,感觉问他也不管我,随便和我瞎扯,
,没有办法,我们小啊


使用特权

评论回复
cym_anhui|  楼主 | 2021-10-20 16:07 | 显示全部楼层
如何@版主,

使用特权

评论回复
海滨消消| | 2021-10-21 10:57 | 显示全部楼层
分析的好

使用特权

评论回复
cym_anhui|  楼主 | 2021-10-21 15:56 | 显示全部楼层
谢谢各位

使用特权

评论回复
cym_anhui|  楼主 | 2021-10-22 11:34 | 显示全部楼层
修改了一点

使用特权

评论回复
cym_anhui|  楼主 | 2021-10-23 09:09 | 显示全部楼层
如果有人感兴趣,可以聊聊啊

使用特权

评论回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则