This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] ADS1255:具有采用 SPI 的 pic 微控制器的 ads1255

Guru**** 2549560 points
Other Parts Discussed in Thread: ADS1255, ADS1256

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/966180/ads1255-ads1255-with-pic-microcontroller-using-spi

器件型号:ADS1255
主题中讨论的其他器件: ADS1256

你(们)好

我正在开发一个用于 ads1255的驱动程序、以便使用具有 pic18f46k80微控制器的 SPI 读取模拟数据

我从互联网上遵循了示例代码、但无法正常工作

此外、我还阅读了数据表、但仍然无法获得

因此需要使用 SPI 和 ADs1255连接到微控制器的示例代码

谢谢

 R Sridhar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Sridhar、您好!

    下面是 e2e 中一些示例代码的链接。 这将是您的最佳起点: https://e2e.ti.com/support/data-converters/f/73/t/571671?ADS1256-Sample-code-for-ADS1256-

    布莱恩

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    我已经检查了您的代码、它非常有用

    我当前正在将波特率从 uC 写入到 ads1255模块、它接受并设置波特率

    我还通过读取寄存器来检查波特率、它仅在连接 PICKIT-4时起作用、仅当我单击断开然后连接时起作用

    那么、我认为初始化中存在一些问题

    那么、您能否为 ads1255模块提供示例初始化  

    我的代码中  

    我将更新我的代码以供参考

    void ads_1255_channel_function (void)

    //  SPI_WriteByte (ADS125X_CMD_RESET);DelayMicro (100);

    ADS125X_DRDY_WAIT ();

      SPI_WriteByte (ADS125X_CMD_SDATAC);DelayMicro (100);   

                 spiTx[0]=(ADS125X_CMD_WREG|ADS125X_REG_MUX);//第一个命令字节

                 spiTx[1]= 0;//第二个命令字节=要读取的字节-1

      spiTx[2]=(ADS125X_MUXP_AIN4|ADS125X_MUXN_AIN0);

      SPI_WriteByte (spiTx[0]);DelayMicro (1);

      SPI_WriteByte (spiTx[1]);DelayMicro (1);

      SPI_WriteByte (spiTx[2]);DelayMicro (10);

    void ads_1255_channel_read_function (void)

      ADS125X_DRDY_WAIT ();

      SPI_WriteByte (ADS125X_CMD_SYNC);DelayMicro (10);

      ADS125X_DRDY_WAIT ();

      SPI_WriteByte (ADS125X_CMD_WAKEUP);DelayMicro (40);   

      spiTx[0]= ADS125X_CMD_RDATA;//第一个命令字节

      spiTx[1]= 0;//第二个命令字节=要读取的字节-1

      ADS125X_DRDY_WAIT ();

      SPI_WriteByte (spiTx[0]);DelayMicro (10);

      ADS125X_DRDY_WAIT ();

      SPI_WriteByte (spiTx[1]);DelayMicro (10);

      DATA_RATE_u8=SPI_ReadByte ();DelayMicro (10);

      sprintf (ext_int_str、"%05x"、data_rate _u8);

      LedDisplay (ext_int_str、0、0);Delay1sec (2);

    谢谢

    R Sridhar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好  

    现在、我的代码正在工作、我可以使用轮询方法读取数据

    但当读取所有24位时、该值会波动高达5000次计数

    我需要可重复性以及如何实现这一点?

    谢谢

    R Sridhar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Sridhar、您好!

    为了从 Δ-Σ ADC 获得最佳的可重复性、它有助于尽可能慢地进行采样。 这样可以实现更多的平均值计算、从而降低噪声。

    此外、请确保您的信号链尽可能无噪声。 例如、如果您使用的是24位 ADC、但在 ADC 前面有一个非常嘈杂的放大器、即使您使用的是高分辨率 ADC、系统性能也不会非常好。

    布莱恩

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    现在、我的 ads1255模块正在使用 ads1255  

    读取 SPI 数据时出错  

    我的数据模式为8位、但我以24位模式读取、因此无法读取正确的 ADC 值  

    我正在更新我的代码以供参考、以帮助他人

    //基准电压
    #define ADS125X_VREF (2.5f)
    #define ADS125X_OSC_FREQ (7680000)
    /*
    const 默认值={
    ClkinFrequency:7680000、
    spiFrequency:976563、
    spiMode:1、
    VREF:2.5、
    };
    *
    // ADS1256寄存器
    #define ADS125X_REG_STATUS 0x00
    #define ADS125X_REG_MUX 0x01
    #define ADS125X_REG_ADCON 0x02
    #define ADS125X_REG_DRATE 0x03
    #define ADS125X_REG_IO 0x04
    #define ADS125X_REG_OFC0 0x05
    #define ADS125X_REG_OFC1 0x06
    #define ADS125X_REG_OFC2 0x07
    #define ADS125X_REG_FSC0 0x08
    #define ADS125X_REG_FSC1 0x09
    #define ADS125X_REG_FSC2 0x0A
    // ADS1256命令
    //数据表第34页/表24
    //所有命令都是独立的
    //除了寄存器读取和写入(RREG、WREG)
    //需要第二个命令字节加上数据
    #define ADS125X_CMD_WAKEUP 0x00
    #define ADS125X_CMD_RDATA 0x01
    #define ADS125X_CMD_RDATAC 0x03
    #define ADS125X_CMD_SDATAC 0x0F
    #define ADS125X_CMD_RREG 0x10
    #define ADS125X_CMD_WREG 0x50
    #define ADS125X_CMD_SELFCAL 0xF0
    #define ADS125X_CMD_SELFOCAL 0xF1
    #define ADS125X_CMD_SELFGCAL 0xF2
    #define ADS125X_CMD_SYSOCAL 0xF3
    #define ADS125X_CMD_SYSGCAL 0xF4
    #define ADS125X_CMD_SYNC 0xFC
    #define ADS125X_CMD_STANDBY 0xFD
    #define ADS125X_CMD_RESET 0xFE
    #define ADS125X_BUFON 0x02
    #define ADS125X_BUFOFF 0x00
    #define ADS125X_CLKOUT_OFF 0x00
    #define ADS125X_CLKOUT_1 0x20
    #define ADS125X_CLKOUT_Half 0x40
    #define ADS125X_CLKOUT_四分之一0x60
    #define ADS125X_RDATA 0x01 /*读取数据*/
    #define ADS125X_RDATAC 0x03 //连续读取数据*/
    #define ADS125X_SDATAC 0x0F /*持续停止读取数据*/
    #define ADS125X_RREG 0x10 //从 REG 读取*/
    #define ADS125X_WREG 0x50 /*写入 REG */
    #define ADS125X_SELFCAL 0xF0 //偏移和增益自校准*/
    #define ADS125X_SELFOCAL 0xF1/*偏移自校准*/
    #define ADS125X_SELFGCAL 0xF2 /*增益自校准*/
    #define ADS125X_SYSOCAL 0xF3 /*系统偏移校准*/
    #define ADS125X_SYSGCAL 0xF4 /*系统增益校准*
    #define ADS125X_SYNC 0xFC //同步 A/D 转换*/
    #define ADS125X_STANDBY 0xFD //开始待机模式*/
    #define ADS125X_RESET 0xFE //重置为加电值*/
    #define ADS125X_WAKEUP 0xFF //完成同步并退出待机模式*/
    //多路复用器代码
    #define ADS125X_MUXP_AIN0 0x00
    #define ADS125X_MUXP_AIN1 0x10
    #define ADS125X_MUXP_AIN2 0x20
    #define ADS125X_MUXP_AIN3 0x30
    #define ADS125X_MUXP_AIN4 0x40
    #define ADS125X_MUXP_AIN5 0x50
    #define ADS125X_MUXP_AIN6 0x60
    #define ADS125X_MUXP_AIN7 0x70
    #define ADS125X_MUXP_AINCOM 0x80
    #define ADS125X_MUXN_AIN0 0x00
    #define ADS125X_MUXN_AIN1 0x01
    #define ADS125X_MUXN_AIN2 0x02
    #define ADS125X_MUXN_AIN3 0x03
    #define ADS125X_MUXN_AIN4 0x04
    #define ADS125X_MUXN_AIN5 0x05
    #define ADS125X_MUXN_AIN6 0x06
    #define ADS125X_MUXN_AIN7 0x07
    #define ADS125X_MUXN_AINCOM 0x08
    //增益代码
    #define ADS125X_PGA1 0x00
    #define ADS125X_PGA2 0x01
    #define ADS125X_PGA4 0x02
    #define ADS125X_PGA8 0x03
    #define ADS125X_PGA16 0x04
    #define ADS125X_PGA32 0x05
    #define ADS125X_PGA64 0x06
    //数据速率代码
    /**@注:数据速率因晶振频率而异。
    *下面列出的数据速率假定晶振频率为7.68Mhz
    *有关其他频率、请参阅数据表。
    *
    #define ADS125X_DRATE_30000SPS 0xF0
    #define ADS125X_DRATE_15000SPS 0xE0
    #define ADS125X_DRATE_7500SPS 0xD0
    #define ADS125X_DRATE_3750SPS 0xC0
    #define ADS125X_DRATE_2000SPS 0xB0
    #define ADS125X_DRATE_1000SPS 0xA1
    #define ADS125X_DRATE_500SPS 0x92
    #define ADS125X_DRATE_100SPS 0x82
    #define ADS125X_DRATE_60SPS 0x72
    #define ADS125X_DRATE_50SPS 0x63
    #define ADS125X_DRATE_30SPS 0x53
    #define ADS125X_DRATE_25SPS 0x43
    #define ADS125X_DRATE_15SPS 0x33
    #define ADS125X_DRATE_10SPS 0x23
    #define ADS125X_DRATE_5SPS 0x13
    #define ADS125X_DRATE_2_5SPS 0x03

    char dummy = 0;
    /**
    *@简短等待 DRDY 引脚变为低电平
    *@param *指向 ADS 句柄的指针
    *
    uint8_t ADS125X_DRDY_WAIT (){
    while (READ_ADC_DRDY_Func ());
    // while (!read_adc_DRDY_Func ());
    // while (read_adc_DRDY_Func ());
    返回0;

    //#include "Menu.h"//如果包含、则自动将其删除以避免错误
    /*主应用程序*/
    静态长整型 I = 0、j;
    unsigned long ext_int_u32;
    char ext_int_str[10]、val[10];
    unsigned char abc=0xAA;
    extern void SPI_WriteByte (uint8_t byte);
    extern uint8_t SPI_ReadByte (void);
    uint8_t spiTx[10]、spiRx[10]、data_rate_u8;
    unsigned char a[3];
    long total、avg_total;
    int ADC_Array[10];
    long adc_val_fil=0;
    INT FRONT = 0;
    Int Rear =-1;
    int itemCount = 0、TempCnt;
    extern long ADC_Moving_Avg;
    extern long WeightADC;
    extern long WeightADCFilterCnt;
    外部长 Avg_ADC_buff [100];
    外部长 Avg_ADC_cnt;
    空 RemoveData()
    {if (itemCount =(unsigned int) adc_Moving_Avg)
    {itemCount--;}
    其他
    {}

    长 MOV_AVG_DataInsert (长数据)
    {int l=0;
    long s采样_adc=0;
    long final_adc_data=0;
    //如果 ADC 缓冲器达到最大限制,此函数将递减
    //缓冲区变量
    RemoveData();
    //将新的 ADC 数据插入缓冲区
    if (itemCount!=(unsigned int) adc_Moving_Avg)
    {if (rear =(unsigned int) adc_Moving_Avg)-1)
    {rear =-1;}
    ADC_Array[++refore]=数据;
    itemCount++;

    //读取缓冲区中的值
    for (l=0;<itemCount;l++)
    {SAMPLING_ADC = SAMPLING_ADC + ADC_Array[l];}
    final_adc_data=采样_adc/itemCount;
    返回 final_adc_data;

    空 ClearAdcbuffer()
    {ree=1;
    itemCount=0;
    memset (adc_Array、0、10);

    长整型 AVERAGE_Filter_func (空)

    长 Value1 =0;
    for (TempCnt=0;TempCnt {Value1 += Avg_ADC_buff [TempCnt];}
    Value1 /= ADC_Moving_Avg;
    return (Value1);

    空 ADC_Filter_func (长整型值)

    WeightADC +=值;
    WeightADCFilterCnt++;
    //ADC_Moving_Avg=5;
    if (WeightADCFilterCnt >= 10)// 1至9

    Avg_ADC_buff [Avg_ADC_Cnt++]= WeightADC /(长) 10;
    IF (Avg_ADC_cnt >= ADC_Moving_Avg)
    Avg_ADC_Cnt = 0;
    WeightADC = WeightADCFilterCnt = 0;


    void ads_1255_status_function (void)

    spiTx[0]=(ADS125X_CMD_WREG|ADS125X_REG_STATUS);//第一个命令字节
    spiTx[1]= 0;//第二个命令字节=要读取的字节-1
    spiTx[2]= 0x06;//缓冲器被启用&自动校准被启用
    ADS125X_DRDY_WAIT ();
    SPI_WriteByte (spiTx[0]);DelayMicro (1);
    SPI_WriteByte (spiTx[1]);DelayMicro (1);
    SPI_WriteByte (spiTx[2]);DelayMicro (10);

    void ads_1255_status_read_function (void)

    spiTx[0]=(ADS125X_CMD_RREG|ADS125X_REG_STATUS);//第一个命令字节
    spiTx[1]= 0;//第二个命令字节=要读取的字节-1
    ADS125X_DRDY_WAIT ();
    SPI_WriteByte (spiTx[0]);DelayMicro (1);
    SPI_WriteByte (spiTx[1]);DelayMicro (10);
    DATA_RATE_u8=SPI_ReadByte ();DelayMicro (10);
    sprintf (ext_int_str、"%05x"、data_rate _u8);
    LedDisplay (ext_int_str、0、0);Delay1sec (2);

    void ads_1255_adcon_function (void)

    spiTx[0]=(ADS125X_CMD_WREG|ADS125X_REG_ADCON);//第一个命令字节
    spiTx[1]= 0;//第二个命令字节=要读取的字节-1
    spiTx[2]= 0x47;//clkin/2、gain64
    ADS125X_DRDY_WAIT ();
    SPI_WriteByte (spiTx[0]);DelayMicro (1);
    SPI_WriteByte (spiTx[1]);DelayMicro (1);
    SPI_WriteByte (spiTx[2]);DelayMicro (10);

    void ads_1255_adcon_read_function (void)

    spiTx[0]=(ADS125X_CMD_RREG|ADS125X_REG_ADCON);//第一个命令字节
    spiTx[1]= 0;//第二个命令字节=要读取的字节-1
    ADS125X_DRDY_WAIT ();
    SPI_WriteByte (spiTx[0]);DelayMicro (1);
    SPI_WriteByte (spiTx[1]);DelayMicro (10);
    DATA_RATE_u8=SPI_ReadByte ();DelayMicro (10);
    sprintf (ext_int_str、"%05x"、data_rate _u8);
    LedDisplay (ext_int_str、0、0);Delay1sec (2);

    void ads_1255_data_rate 函数(void)

    spiTx[0]=(ADS125X_CMD_WREG|ADS125X_REG_DRATE);//第一个命令字节
    spiTx[1]= 0;//第二个命令字节=要读取的字节-1
    spiTx[2]= 0xA1;//1000SPS//500->0x92
    ADS125X_DRDY_WAIT ();
    SPI_WriteByte (spiTx[0]);DelayMicro (1);
    SPI_WriteByte (spiTx[1]);DelayMicro (1);
    SPI_WriteByte (spiTx[2]);DelayMicro (10);

    void ads_1255_data_rate _read_function (void)

    spirx[0]=(ADS125X_CMD_RREG|ADS125X_REG_DRATE);//第一个命令字节
    spirx[1]= 0;//第二个命令字节=要读取的字节-1
    ADS125X_DRDY_WAIT ();
    SPI_WriteByte (spirx[0]);DelayMicro (1);
    SPI_WriteByte (spirx[1]);DelayMicro (10);
    DATA_RATE_u8=SPI_ReadByte ();DelayMicro (10);
    sprintf (ext_int_str、"%05x"、data_rate _u8);
    LedDisplay (ext_int_str、0、0);Delay1sec (2);

    void ads_1255_channel_function (void)

    ADS125X_DRDY_WAIT ();
    spiTx[0]=(ADS125X_CMD_WREG|ADS125X_REG_MUX);//第一个命令字节
    spiTx[1]= 0;//第二个命令字节=要读取的字节-1
    spiTx[2]= 0x01;
    SPI_WriteByte (spiTx[0]);DelayMicro (1);
    SPI_WriteByte (spiTx[1]);DelayMicro (1);
    SPI_WriteByte (spiTx[2]);DelayMicro (10);

    void ads_1255_channel_read_function (void)

    spiTx[0]=(ADS125X_CMD_RREG|ADS125X_REG_MUX);;//第一个命令字节
    spiTx[1]= 0;//第二个命令字节=要读取的字节-1
    ADS125X_DRDY_WAIT ();
    SPI_WriteByte (spiTx[0]);DelayMicro (1);
    SPI_WriteByte (spiTx[1]);DelayMicro (10);
    DATA_RATE_u8=SPI_ReadByte ();DelayMicro (10);
    sprintf (ext_int_str、"%05x"、data_rate _u8);
    LedDisplay (ext_int_str、0、0);Delay1sec (2);

    void ads_1255_self_cal_function (void)

    ADS125X_DRDY_WAIT ();
    SPI_WriteByte (ADS125X_SYSOCAL);DelayMicro (10);
    ADS125X_DRDY_WAIT ();
    SPI_WriteByte (ADS125X_SYSGCAL);DelayMicro (10);
    ADS125X_DRDY_WAIT ();
    SPI_WriteByte (ADS125X_SELFOCAL);DelayMicro (10);
    ADS125X_DRDY_WAIT ();
    SPI_WriteByte (ADS125X_SELFGCAL);DelayMicro (10);
    ADS125X_DRDY_WAIT ();
    SPI_WriteByte (ADS125X_SELFCAL);DelayMicro (10);

    void ads_1255_read_function (void)

    ADS_1255_CHANNEL 函数();
    ADS_1255_DATA_RATE_FUNC();
    ADS_1255_DATA_RATE_READ_FUNC();
    ads_1255_self_cal_function ();
    ads_1255_adcon_function ();

    无符号长整型 shift_8_bit_value_to_24_bit_value (字符 arr[])

    unsigned long Adcdata=0;
    unsigned char ADC_Byte=0;
    对于(ADC_Byte=0;ADC_Byte<3;ADC_Byte++)

    Adcdata =(Adcdata|arr[2-adc_Byte]);
    Adcdata <<= 8;

    返回 Adcdata;

    void ads_1255_read_adc_function (void)

    memset (spiRx、0、sizeof (spiRx));
    ADS125X_DRDY_WAIT ();
    // SPI_WriteByte (ADS125X_CMD_SYNC);DelayMicro (10);
    // while (!read_adc_DRDY_Func ()) DelayMicro (1);
    // SPI_WriteByte (ADS125X_CMD_WAKEUP);DelayMicro (40);
    spirx[0]=(ADS125X_CMD_RDATA);//第一个命令字节
    spirx[1]= 0;//第二个命令字节=要读取的字节-1
    spirx[2]= 0;//第三个命令字节=要读取的字节-1
    spirx[3]= 0;//第4个命令字节=要读取的字节-1
    // spirx[4]= 0;//第4个命令字节=要读取的字节-1
    总计=0;
    SPI_WriteByte (spirx[0]);DelayMicro (8);
    SPI_WriteByte (spirx[1]);DelayMicro (1);A[2]=SPI_ReadByte ();DelayMicro (1);
    SPI_WriteByte (spirx[2]);DelayMicro (1);A[1]=SPI_ReadByte ();DelayMicro (1);
    SPI_WriteByte (spirx[3]);DelayMicro (1);A[0]= SPI_ReadByte ();DelayMicro (1);
    total=shift_8_bit_value_TO_24_bit_value (&a[0]);
    // avg_total=MOV_AVG_DataInsert (total);
    AdcVal=(total>>15);//获取原始 ADC 值完整范围的实际值为1000000
    ADC_Moving_Avg=100;
    // Setup.ADCFilter=2;
    Wadccnt++;//ADC 滤波器函数
    WeightAdc += AdcVal;
    if (Wadccnt >= Setup.ADCFilter)//trial

    Wadccnt = 0;
    AdcVal = 0;
    AdcVal = WeightAdc / Setup.ADCFilter;//prev
    AdcBuff[AdcCounter++]= AdcVal;
    if (AdcCounter >= 100)//prev
    if (AdcCounter >= ADC_Moving_Avg)//试用
    AdcCounter = 0;
    WeightAdc = 0;
    AdcIntr = 1;


    空 INT1_ISR (空)

    if (ext_int_u32>=100)
    {ext_int_u32=0;
    // EXT_INT1_InterruptDisable ();

    其他
    {ext_int_u32++;}
    ADS_1255_READ_ADC_FUNC();
    //***用户区域结束->代码***
    EXT_INT1_InterruptFlagClear ();
    //每次执行此 ISR 时调用回调函数
    int1_callback ();


    void SPI_Initialize (void)(空)

    // SPI 设置
    TRISCbits.TRISC3=0;//SCK
    TRISCbits.TRISC4=1;//SDI
    TRISCbits.TRISC5=0;//sdo
    SSPSTAT = 0xC0;
    SSPCON1 = 0x01;
    SSPCON2 = 0x00;
    SSPCON1bits.SSPEN = 1;
    SSPADD=0x00;
    // PIE1bits.SSPIE = 1;
    SSPCON1bits.CKP = 0;
    SPI_SetInterruptHandler (SPI_ISR);

    谢谢

    R Sridhar