打印
[测量]

称重 cs5530

[复制链接]
7041|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 babyrabbit 于 2018-5-11 21:42 编辑

用stm32配置的cs5530,配置代码如下,现在采集的数,放大一倍,能稳定到零点几个毫伏,精度不够。看芯片手册,需要进行校准,没太看懂,那个CC2-CC0位没找到。请问大神这个怎么具体执行校准啊,还有就是硬件电路输入信号部分我直接输入的,有什么滤波电路推荐吗?(除了算法滤波)
 // 设置偏移寄存器
        Write_CS5530_Register(Write_OFFSET,0x00000000);
        delay_ms(50);
        // 设置增益寄存器
        Write_CS5530_Register(Write_GAIN,0x0f000000);
        delay_ms(50);
        // 设置配置寄存器,设置参考电压,信号极性,字速度等等
        //Write_CS5530_Register(Write_CONFIG,0x02004800);
        //Delay_ms(50);
        temp = 0x00;
        temp |= UNIPOLAR_MODE; // 单极性
        temp |= LINE_FREQ_60; // 滤波选择缺省滤波字
        temp |= DATARATE_25;
        temp |= NORMAL_MODE; // 普通操作
        temp |= VREF_HIGH; // VREF_HIGH 为 2.5V 基准; VREF_LOW 为 1-2.5V 基准
        temp |= CR_A0_0;
        temp |= CR_A1_0;
        temp |= TURN_OFF_300NA; // 不激活电流源
        Write_CS5530_Register(Write_CONFIG,temp);
        delay_ms(50);        
        Write_CS5530( SYSTEM_OFFSET_CAL);        //执行系统偏移校准
        Write_CS5530( SYSTEM_GAIN_CAL);                // 执行系统增益校准
        //启动转换
        Write_CS5530( START_CONTINUOUS + NORMAL_CONVERSION); // 单次转换


1.png (99.33 KB )

1.png

相关帖子

沙发
ningling_21| | 2018-5-12 14:22 | 只看该作者
/*========================CS5530驱动程序头文件==========================*/
//cs5530.h
#ifndef __cs5530_h__
#define __cs5530_h__
#define SYNC1 0xff
#define SYNC0 0xfe
#define NULL_BYTE 0x00
// Command Register
#define CMD_WRITE (0x00<<3)                //写寄存器命令
#define CMD_READ (0x01<<3)                //读寄存器命令
#define REG_OFFSET 0x01                    //偏移寄存器
#define REG_GAIN 0x02                    //增益寄存器
#define REG_CONFIG 0x03                    //配置寄存器
#define START_SINGLE (0x00<<6)            //单次转换
#define START_CONTINUOUS (0x01<<6)        //连续转换
#define NORMAL_CONVERSION (0x80+0x00)    //转换命令
#define SYSTEM_OFFSET_CAL (0x80+0x05)    //执行偏移校准
#define SYSTEM_GAIN_CAL (0x80+0x06)        //执行增益校准
// Configuration Register
#define STANDBY_MODE (0x00L<<31)        //待机模式
#define SLEEP_MODE (0x01L<<31)            //休眠模式
#define POWER_SAVE_MODE (0x01L<<30)        //节电模式
#define NORMAL_MODE (0x00L<<29)            //正常操作
#define SYSTEM_RESET (0x01L<<29)        //激活一个复位周期,复位后自动清0
#define RESET_STATUS (0x01L<<28)        //复位有效,系统已复位,只读
#define SHORT_INPUTS (0x00L<<27)        //输入正常输入 个通道输入不断接
#define VREF_HIGH (0x00L<<25)            //参考电压 2.5~((VA+)-(VA-))V
#define VREF_LOW (0x01L<<25)            //参考电压 1~2.5V
#define CR_A1_0 (0x00L<<24)
#define CR_A1_1 (0x01L<<24)
#define CR_A0_0 (0x00L<<23)
#define CR_A0_1 (0x01L<<23)
#define LINE_FREQ_60 (0x00L<<19)        //滤波数率选择 缺省输入字
#define LINE_FREQ_50 (0x01L<<19)        //输出字数率及相应滤波器特性乘以系数5/6
#define DATARATE_100 (0x00L<<11)        //字数率 不同位就不同
#define DATARATE_50 (0x01L<<11)
#define DATARATE_25 (0x02L<<11)
#define DATARATE_12P5 (0x03L<<11)
#define DATARATE_6P25 (0x04L<<11)
#define DATARATE_3200 (0x08L<<11)
#define DATARATE_1600 (0x09L<<11)
#define DATARATE_800 (0x0aL<<11)
#define DATARATE_400 (0x0bL<<11)
#define DATARATE_200 (0x0cL<<11)
#define BIPOLAR_MODE (0x00L<<10)        //极性选择双极性模式
#define UNIPOLAR_MODE (0x01L<<10)        //极性选择单极性模式
#define TURN_OFF_300NA (0x00L<<9)        //不激活电流源
#define TURN_ON_300NA (0x01L<<9)        //激活电流源300ma
void CS5530_Serial_Reset(void);
void CS5530_System_Reset(void);
void CS5530_Config(void);
unsigned char CS5530_ADC_Ready(void);
unsigned long CS5530_Result(void);
#endif
//============================CS5530驱动程序实现文件==============================
//CS5530.C
/*============================================================================
程序来源: 网络
排版加注: 孤独的牧羊人(http://tywood.blog.163.com)
日期:     2012.03.24
==============================================================================*/
#include "w79e824.h"
#include "cs5530.h"
//#include                                //?
sbit cs5530_clk=P0^5;                    //时钟脚
sbit cs5530_cs=P1^6;                    //片选脚
sbit cs5530_sdo=P0^6;                    //数据输出脚
sbit cs5530_sdi=P0^7;                    //数据输入脚
sbit SCK=P0^5;                            //时钟脚
sbit MISO=P0^6;                            //数据MISO(主入从出)脚
sbit MOSI=P0^7;                            //数据MOSI(主出从入)脚
#define cs5530_clk_h    cs5530_clk=1    //时钟线拉高
#define cs5530_clk_l    cs5530_clk=0;    //时钟线拉低
#define cs5530_cs_h        cs5530_cs=1        //片选拉高(禁止器件)
#define cs5530_cs_l        cs5530_cs=0        //片选拉低(选中器件)
#define cs5530_in_h        cs5530_sdi=1    //MOSI输出1
#define cs5530_in_l        cs5530_sdi=0    //MOSI输出0
#define cs5530_out        cs5530_sdo        //读CS5530的输出数据位
#define uint8_t unsigned char
#define uint32_t unsigned long
#define uchar unsigned char
#define uint unsigned int
//毫秒级延时函数
void delay5530(uint iMs)
{
    uint cou;
    uchar i;
    for(cou=0;cou<iMs;cou++)
    {
        for(i=0;i<130;i++)
        {_nop_();}
    }
}
//SPI读写函数
uchar SPI_RW(uchar byte)
{
    uchar ctr;
//    cs5530_cs_l;                        //选中cs5530
    for(ctr=0;ctr<8;ctr++)                //送出8个数据位
    {
        MOSI=(byte & 0x80);                //输出1个数据位(MSB)到MOSI
        byte=(byte<<1);                    //移位,为送下一位数据作准备
        SCK=1;                            //拉高时钟线让对方以旧换新数据位
        _nop_();_nop_();_nop_();_nop_();//..
        _nop_();_nop_();_nop_();_nop_();//
        _nop_();_nop_();_nop_();_nop_();//..
        _nop_();_nop_();_nop_();_nop_();//
        byte|=MISO;                        //接收对方送出的数据位(MISO)
        SCK=0;                            //拉低时钟线,使对方发送下一个数据位到总线上
        _nop_();_nop_();_nop_();_nop_();//..
        _nop_();_nop_();_nop_();_nop_();//
        _nop_();_nop_();_nop_();_nop_();//..
        _nop_();_nop_();_nop_();_nop_();//
    }
    // cs5530_cs_h;                        //取消cs5530片选信号
    return(byte);                         //返回收到的字节数据
}
//向cs5530写一个字节
void cs5530_write(uint8_t write_cs5530data)
{
    cs5530_cs_l;                        //选中cs5530
/*    SPDR=write_cs5530data;                //使用SPI部件发数据
    while(!(SPSR & (1<
*/
    SPI_RW(write_cs5530data);            //使用模拟spi收发一个字节
    cs5530_cs_h;                        //取消cs5530片选信号
}
//从cs5530读取一个字节
uint8_t cs5530_read(void)
{
    uint8_t ad_number;
    cs5530_cs_l;
/*
    SPDR=0xFF;                            //先发送一个空操作指令
    while(!(SPSR & (1< ad_number=SPI_RW(0x00);
/*    ad_number=SPDR;                        //读SPI
    SPSR=0x00;
*/
    cs5530_cs_h;
    return ad_number;
}
//从cs5530读取一个双字
uint32_t CS5530_Read_Dword ( void )
{
    unsigned long return_data;
    return_data=cs5530_read();
    return_data<<=8;
    return_data+=cs5530_read();
    return_data<<=8;
    return_data+=cs5530_read();
    return_data<<=8;
    return_data+=cs5530_read();
    return_data=return_data>>9;            //?
    return (return_data);
}
//读取cs5530数据就绪状态
uint8_t cs5530_check_over(void)
{
    uint8_t return_data;
    cs5530_cs_h;                        //取消cs5530片选信号
    _nop_();
    cs5530_clk_l;                        //先把时钟信号置为低电平
    _nop_();
    _nop_();
    cs5530_cs_l;                        //选中cs5530
    _nop_();
    _nop_();
    _nop_();
    return_data=cs5530_out;                //读取cs5530在SDO/RDY线上给出的数据就绪状态
    return_data>>=3;                    //???
    cs5530_cs_h;                        //取消cs5530片选信号
    return (return_data);                //返回结果
}
//向cs5530写入一个双字
void CS5530_Write_Dword ( uint32_t ld )
{
    union type1
    {
        uchar ch[4];
        unsigned long lon;
    };                                    //定义用于将32位整数转为4个字节的联合体数据结构
    union type1 temp;
    temp.lon= ld;                        //
    cs5530_write (temp.ch[0]);            //逐个字节发送数据
    cs5530_write (temp.ch[1]);
    cs5530_write (temp.ch[2]);
    cs5530_write (temp.ch[3]);
}
//cs5530 SPI串口复位函数
void CS5530_Serial_Reset(void) //1
{
    uint8_t i = 18;
    while (i--)cs5530_write(SYNC1);        //发送18个SYNC1(至少15个)
    cs5530_write(SYNC0);                //发送1个SYNC0
}
//cs5530系统复位函数
void CS5530_System_Reset ( void ) //
{
    uint8_t read_data,cs5530_rst;
    cs5530_write(CMD_WRITE+REG_CONFIG);//发出"写配置寄存器"命令
    CS5530_Write_Dword(SYSTEM_RESET);    //初始化(CFG_REG=0x20000000)
    delay5530(1);                        //延时
    cs5530_write(CMD_READ+REG_CONFIG);    //发出"读配置寄存器"命令
    read_data=cs5530_read();            //读取结果
    cs5530_rst=read_data;                //配置寄存器有32位,RV在D28位上
    read_data=cs5530_read();            //后面三个字节不用管
    read_data=cs5530_read();
    read_data=cs5530_read();
    while(cs5530_rst&0x10)                //如果RV位为1表明复位成功,读配置寄存器后RV自动清0
    {                                    //重新读取RV位确保它已经清0
        cs5530_write(CMD_READ+REG_CONFIG);//发读配置寄存器命令
        read_data=cs5530_read();
        cs5530_rst=read_data;
        read_data=cs5530_read();
        read_data=cs5530_read();
        read_data=cs5530_read();
    }
    cs5530_write(CMD_WRITE+REG_CONFIG);    //发"写配置寄存器"命令
    CS5530_Write_Dword(NORMAL_MODE);    //写配置寄存器清除RS位(CFG_REG=0x00000000),退出复位状态
}
//配置cs5530
void CS5530_Config (void) //3
{
    cs5530_write(CMD_WRITE+REG_CONFIG);    //发"写配置寄存器"命令
    //DATARATE_800 LINE_FREQ_50DATARATE_960 UNIPOLAR_MODEDATARATE_6P25
    CS5530_Write_Dword(NORMAL_MODE+VREF_HIGH+CR_A0_0+CR_A1_0+SHORT_INPUTS+LINE_FREQ_60+DATARATE_200+BIPOLAR_MODE+TURN_OFF_300NA);
    cs5530_write(START_CONTINUOUS+NORMAL_CONVERSION);    //开始连续转换START_SINGLE
//    cs5530_read();                        //读转换结果吗?应该要先查实数据是否就绪吧?
//    cs5530_read();
//    cs5530_read();
//    cs5530_read();
}
//读取cs5530模数转换结果
uint32_t CS5530_Result (void)
{
    cs5530_write (NULL_BYTE) ;            //发出8个时钟信号来清除SDO标志(数据就绪标志?)
    return (uint32_t)(CS5530_Read_Dword());//读取并返回32位结果(24位ADC转换结果加上1个溢出标志和7个无意义的0位)
}
//启动cs5530进行A/D转换,读取并回返AD转换结果
long CS5530_Adc(void)
{
    long temp;
    cs5530_cs=1;                        //禁止cs5530片选
    cs5530_clk=0;                        //时钟空闲
    cs5530_cs=0;                        //选中cs5530
    _nop_();_nop_();_nop_();_nop_();    //..
    _nop_();_nop_();_nop_();_nop_();    //
    _nop_();_nop_();_nop_();_nop_();    //..
    _nop_();_nop_();_nop_();_nop_();    //
    SPI_RW(0x80);                        //发出"执行单次转换"命令
    while(cs5530_sdo==1);                //等待数据就绪
    SPI_RW(0x00);                        //NULL命令,用来清除端口标志位使得转换器保持在连续转换模式
    temp=0;
    temp+=SPI_RW(0x00);                    //读取结果的最高字节
    temp<<=8;
    temp+=SPI_RW(0x00);                    //读取结果的次高字节
    temp<<=8;
    temp+=SPI_RW(0x00);                    //读取结果的次低字节
    temp<<=8;
    temp+=SPI_RW(0x00);                    //读取结果的最低字节
    cs5530_cs_h;                        //取消cs5530片选信号
    return(temp);                        //返回32位结果
}
//读取并返回参数指明的cs5530特定寄存器的内容
unsigned long CS5530_ReadReg(uchar reg)
{
    unsigned long temp;
    cs5530_cs=1;                        //禁止cs5530片选
    cs5530_clk=0;                        //时钟空闲
    cs5530_cs=0;                        //选中cs5530
    _nop_();_nop_();_nop_();_nop_();    ///..
    _nop_();_nop_();_nop_();_nop_();    //
    _nop_();_nop_();_nop_();_nop_();    ///..
    _nop_();_nop_();_nop_();_nop_();    //
    SPI_RW(reg);                        //发出读取指定寄存器内容的命令
    temp=SPI_RW(0X00);                    //连续读取4个字节的数据
    temp<<=8;
    temp+=SPI_RW(0x00);
    temp<<=8;
    temp+=SPI_RW(0x00);
    temp<<=8;
    temp+=SPI_RW(0x00);
    cs5530_cs=1;                        //取消cs5530片选信号
    return(temp);
}

使用特权

评论回复
板凳
ningling_21| | 2018-5-12 17:48 | 只看该作者
硬件电路稳定不? 抗干扰和滤波电路都有吗?
先把硬件搞稳定了,再调试软件部分

使用特权

评论回复
地板
babyrabbit|  楼主 | 2018-5-12 19:20 | 只看该作者
ningling_21 发表于 2018-5-12 17:48
硬件电路稳定不? 抗干扰和滤波电路都有吗?
先把硬件搞稳定了,再调试软件部分
...

硬件部分,输入信号能稳定到小数点后三位,稳定到0.01mv,供电电压能稳定到第三位,现在是采集的信号还没有输入的信号稳定性好。看datasheet需要校准,但是不会做。。。或者会不会是其他问题  。我的供电电压模拟是5v,因为用的32单片机做的,所以数字供电是3.3v。不知有没有影响。

使用特权

评论回复
5
ningling_21| | 2018-5-13 15:20 | 只看该作者
babyrabbit 发表于 2018-5-12 19:20
硬件部分,输入信号能稳定到小数点后三位,稳定到0.01mv,供电电压能稳定到第三位,现在是采集的信号还没 ...

3.3V影响不大,数字电路和模拟电路应该隔离,如果不能隔离两个地也要单点相连

使用特权

评论回复
6
linda_6000| | 2018-12-28 14:20 | 只看该作者
我的数字电路部分用的是5V,建议用5v,然后与单片机通讯处转换一下就可以了。

使用特权

评论回复
7
wangjb80| | 2019-10-15 09:38 | 只看该作者
本帖最后由 wangjb80 于 2019-10-18 15:28 编辑

我们也想开发用stm32F1+cs5530做称重模块,希望从硬件线路板开始和ARM程序设计, Modbus RTU 协议 联系方式13361820667王-微信也是这个号,有酬劳哦

使用特权

评论回复
8
ningling_21| | 2019-10-25 15:50 | 只看该作者
wangjb80 发表于 2019-10-15 09:38
我们也想开发用stm32F1+cs5530做称重模块,希望从硬件线路板开始和ARM程序设计, Modbus RTU 协议 联系方式 ...

这个资料也不少,遇到问题可以交流

使用特权

评论回复
9
masmin| | 2019-11-1 23:39 | 只看该作者
wangjb80 发表于 2019-10-15 09:38
我们也想开发用stm32F1+cs5530做称重模块,希望从硬件线路板开始和ARM程序设计, Modbus RTU 协议 联系方式 ...

指标有吗,我们有产品可以直接使用了

使用特权

评论回复
10
贝贝妮妮heart| | 2019-11-5 15:52 | 只看该作者
masmin 发表于 2019-11-1 23:39
指标有吗,我们有产品可以直接使用了

你好,是STM32驱动CS5530吗,我也需要一份,有酬劳的哈  982511842

使用特权

评论回复
11
liuningzhuag| | 2019-11-20 23:41 | 只看该作者
楼主解决了吗?

使用特权

评论回复
12
liuningzhuag| | 2019-11-20 23:53 | 只看该作者
ningling_21 发表于 2018-5-12 17:48
硬件电路稳定不? 抗干扰和滤波电路都有吗?
先把硬件搞稳定了,再调试软件部分
...

有代码吗?

使用特权

评论回复
13
masmin| | 2019-12-2 13:50 | 只看该作者
贝贝妮妮heart 发表于 2019-11-5 15:52
你好,是STM32驱动CS5530吗,我也需要一份,有酬劳的哈  982511842

有,算是定制产品,具体的参数是根据对方的要求做的,大体参数:传感器类型:应变式,拱桥电压:10V,测量精度:0.007%FS,支持Modbus-RTU协议。实测的精度在21bits~22bits之间。E:\格微电子\项目工程\称重变送器\微信图片_20191202134715

微信图片_20191202134715.jpg (205.45 KB )

微信图片_20191202134715.jpg

微信图片_20191202134653.jpg (218.98 KB )

微信图片_20191202134653.jpg

使用特权

评论回复
14
liuningzhuag| | 2020-4-18 08:49 | 只看该作者
masmin 发表于 2019-11-1 23:39
指标有吗,我们有产品可以直接使用了

有联系方式吗?,可以沟通一下吗

使用特权

评论回复
15
masmin| | 2020-5-6 15:26 | 只看该作者
liuningzhuag 发表于 2020-4-18 08:49
有联系方式吗?,可以沟通一下吗

masmin@163.com

使用特权

评论回复
16
slot867| | 2024-1-31 15:10 | 只看该作者
fully compatible. 板子拿来,换个芯片,性能更佳。MCU不用改 c code。

平替Cirrus Logic芯片

SIG5532B 平替 CS5532BS(32-bit)
SIG5534B 平替 CS5534BS(32-bit)
SIG5532A 平替 CS5532AS(24-bit)
SIG5534A 平替 CS5534AS(24-bit)
SIG5530 平替 CS5530 (24-bit)
SIG5530B 平替 CS5530(32-bit)

平替ADI芯片
SIG7792 平替 AD7792
SIG7793 平替 AD7793
SIG7794 平替 AD7794
SIG7795 平替 AD7795
SIG7796 平替 AD7796
SIG7797 平替 AD7797
SIG7798 平替 AD7798
SIG7799 平替 AD7799

平替TI芯片
SIG1230A 平替 ADS1230 (20-bit)
SIG1232A 平替 ADS1232 (24-bit)

平替ADI芯片
SIG7190 平替 AD7190
SIG7192 平替 AD7192
SIG7193 平替 AD7193

功能替代TI芯片
SIG24130/SIG24131/SIG24132 替代 ADS1220、ADS1247、ADS1248
SIG16130/SIG16131/SIG16132 替代 ADS1120、ADS1147、ADS1148

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

88

帖子

3

粉丝