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.

[参考译文] ADS1232:ADS1232固定输出

Guru**** 1129500 points
Other Parts Discussed in Thread: ADS1232, TMS320F2812, ADS1232REF
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/875426/ads1232-ads1232-fixed-output

器件型号:ADS1232
主题中讨论的其他器件: TMS320F2812

您好!

在秤重项目中、我遇到了一个奇怪的问题。 我已经使用了 ADS1232TMS320F2812和 SPI 串行接口。

在 DRDY 的每个下降沿之后、读取数据寄存器、但它始终为 FFFFFF、与输入范围无关、

有时为7FFFFF 或3FFFFF

使用秤重应用原理图

我的代码:

使用 SPI 示例:

包括"DSP281x_Device.h" // DSP281x 头文件 include 文件
#include "DSP281x_examples.h"// DSP281x 示例 include 文件

//此文件中找到的函数的原型语句。
//中断 void ISRTimer2 (void);
void delay_loop (void);
void SPI_xmit (uint16 a);
void SPI_fifo_init (void);
void SPI_init (void);
void error (void);
uint16 Temp;
uint16 sdata;//发送数据
uint16 RDATA[3];//接收到的数据



void main (void)
{
uint16 i=0;

InitSysCtrl();
InitGpio();//针对此示例跳过


DINT;

InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();

spi_fifo_init ();//初始化 SPI FIFO
SPI_init ();//初始化 SPI
InitXIntraupt(); //初始化外部中断


IER |= M_INT1 | M_INT6
EINT; //启用 INTM
ERTM; //启用 DBGM

GpioDataRegs.GPBDAT.bit.GPIOB0=1;//启用 ADS1232

GpioDataRegs.GPFDAT.ALL = 0x0000;
temp=0xF0;


for (i=0;i<3;i++) RDATA[i]=0;
sdata = 0x0000;
for (;)
{
}
}



void SPI_init()
{ //0000 0000 0000 01111
SpiaRegs.SPICCR.all =0x0007;// Reset.7 (使能),极性=0,SPILBK =0,上升沿,8位字符位
SpiaRegs.SPICTL.ALL =0x0006;//溢出 int.4=0 phase .3=0,启用 master=1,正常相位,
//启用 TALM.1=1,禁用 SPI int.0。
SpiaRegs.SPIBRR = 0x007F;
SpiaRegs.SPICCR.all =0x0087;//从复位中撤回 SPI
SpiaRegs.SPIPRI.bit.FREE = 1; //设置断点不会干扰 xmission
}

void SPI_xmit (uint16 a)
{
SpiaRegs.SPITXBUF=a;
}

void SPI_Fifo_init ()
{
//初始化 SPI FIFO 寄存器//1110 0000 0100 0000
SpiaRegs.SPIFFTX.All=0xE040;//SPIRST.15、SPIFFENA.14、TXFIFOREST .13可重写、
//TXFFST.12-8、TXFFINT.7、TXFFINT CLR.6、TXFFIENA.5、TXFFIL4-0
SpiaRegs.SPIFFRX.All=0x204f;//RXFFOVF.15、RXFFOVF CLR.14、RXFIFOReset (RENABLE)、RXFFST12-8
//RXFFINT、RXFFINT CLR、RXFFIENA.5、RXFFIL4-0

SpiaRegs.SPIFFCT.ALL=0x0;// FIFO 发送延迟位
}

和 XINT:

中断空 XINT2_ISR (空)
{
//在此处插入 ISR 代码
uint16 i=0;
温度^= 0xC0;
GpioDataRegs.GPFDAT.ALL =温度;
//发送数据
sdata=0xF0;
for (i=0;i<3;i++)
{
SPI_xmit (sdata<8);
//等待数据被接收
while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}
//检查已发送的数据
RDATA[i]= SpiaRegs.SPIRXBUF;
sdata++;
} 

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

    你好、Nima、

    您是否可以尝试重新发布原理图、因为图像没有通过。 您说过您不是初始化 GPIO、但如果您使用 GPIO 来控制 ADS1232、则不能在 ADS1232上使用悬空输入引脚。  ADS1232是一款引脚控制型器件、所有控制信号都必须连接高电平或低电平。

    此致、

    Bob B

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

    尊敬的 Bob:

    感谢您的指导

    您提到的任务已被检查、输出与输入成比例地增加

    1) 1)为什么输出大约为0x3fc07、即使输入为0V? 还有很多变化吗?

    2) 2)我应该如何提高测量精度? (硬件和软件)


    在代码 ADS1232ref 中、如何将十六进制数据转换为电压?

    中断(port2_vector) ads1232_ISR (void)
    {
    u8 * CPTR=(u8 *)(&_code);
    
    //在移位
    DRDYIEL ()之前禁用 int;
    
    //获取3个字节
    U0TXBUF=0;
    while (!(IFG1&URXIFG0));
    CPTR[2]=UXBUF
    
    
    ;while (UXIFG0UXIF0UXIFF);while (UXIF0UXIFG1&0)!
    CPTR[1]=U0RXBUF;
    
    U0TXBUF=0;
    while (!(IFG1&URXIFG0));
    CPTR[0]=U0RXBUF;
    
    if (_flags.cal){
    SCLKOUTL ();
    SCLKSELL ();
    SCLKOUTH
    ();SCLKOUTH
    ();SCLKOUTL ();SCLKOUTL (SCLKOUTL);SCLKOUTL ();
    SCLKOUTL ();
    SCLKSELH ();
    }否则{
    //符号扩展
    CPTR[3]=(CPTR[2]和0x80)?0xff:0;
    #ifdef ADS1230
    _code_>>4;
    #endif
    }
    //清除并重新启用 int
    DRDYIFGL
    
    
    
    _flags.ca
    
    
    
    
    ();DRYLD:0;#ifdef _code_>4;#endif
    
    
    
    }taskdata (如果不是_flags.cal=0;);task= taskl (如果是),则为 tasknewal/ task)
    

    您能否为此转换提供伪代码?

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

    你好、Nima、

    我仍然没有您的原理图、因此我很难猜测您为什么会有较大的偏移。  加电时、您是否确保在电源达到标称电压后 PDWN 引脚保持低电平至少10us?  您是否启动了自偏移校准?  这两项都非常重要。  如果您将 PDWN 引脚连接到 GPIO、则在上电后对 PDWN 引脚进行脉冲也是一个好主意、可确保 ADS1232以正确的增益系数正确启动。  所有数字引脚应连接到某个位置、而不应悬空。  可以悬空模拟输入引脚。

    您从 ADS1232REF 中显示的代码段是仅用于捕获数据的中断例程。  您应该在服务例程中尽可能少地执行操作、尤其是在使用低速微控制器时、如 ADS1232REF 上存在的微控制器。   

    代码到电压转换位于 display.c 文件中、并按照查找表8中所示代码(LSB)值的过程进行操作、该表显示为(+0.5Vref/gain)/(2^23-1)。  获取一个 LSB 的结果并乘以接收到的转换值。  使用的实际 C 代码如下所示、并通过使用稍微不同的 LSB 计算(Vref/gain)/(2^24)进行更改。

    float code2volt (float c)
    {
    
    返回(c/(1L<<24))*(disp_vref/ads1232_get_gain());
    
    } 

    由于 ADS1232REF 可以有多种配置,因此变量 display_vref 和 ads1232_get_gain ()的返回值可以在代码中设置为固定值。  例如、如果基准电压设置为5V、增益设置为128、则返回值将变为:

    float code2volt (float c)
    {
    
    返回(c/(1L<<24))*(5.0/128);
    
    } 

    显然、还有许多其他方法可以在 C 中实现相同的结果

    此致、

    Bob B