TI论坛
直播中

李欢

8年用户 1144经验值
私信 关注
[问答]

用ADS1230采集3吨称重传感器的数据,什么原因会导致差分信号动态变化时就不正常呢?


  • 用ADS1230采集3吨称重传感器的数据。
    调试的时候用电阻和电位器搭了一个模拟传感器输出差分信号的电路,此时测量出来的差分电压准确。不过都是在静态下测的,也就是输出的差分信号是一个固定电压值,每次都只是测量这个固定的电压。
    实际测量时,称重传感器输出的是渐变的信号,随着压力的增大,实时采集压力值。但是此时ADS1230就不能正常工作了,采集回来的值不准确,甚至直接是7FFFF。电路采用的datasheet上的推荐电路,后来甚至按照ti的ADS1230评估板搭了一个电路,也是如此。
    什么原因会导致采集静态的差分信号正常,而当差分信号动态变化时就不正常呢??
    下面是数据采集程序。每次采集都会等待ADS1230输出转换结果。
    设置的芯片AD转换速率是80SPS。
    我的ADS1230是在单独的一块小板上,通过接线和主控板相连。
    最最无法理解的是:最开始的一块小板可以正常工作,但是其后几块小板都是我说的问题。我的程序就是在最开始的那块能工作的小板上用的。


    //读取ADS1230的转换结果
    unsigned long ADconvert( void )
    {
            unsigned long ulResult = 0;
            unsigned int uiTemp = 0;
            unsigned char ucTemp = 0;
            unsigned char i = 0;
            unsigned char j = 0;
            
            ADsclk = 0;
            
            for( j = 0 ; j < 30 ; j++ );
            
            while( 1 )
            {
                    PCA0CPH4 = 0;
                   
              if( ADdout == 0 )                                     //确认AD转换是否完成
                      {
                              for( j = 0 ; j < 180 ; j++ );
                            
                              for( i = 0 ; i < 12 ; i++ )                     //读高12位数据
                              {
                                      ADsclk = 1;
                                    
                                      for( j = 0 ; j < 30 ; j++ );
                                    
                                      if( ADdout == 1 )
                                              {
                                                      uiTemp = ( uiTemp << 1) | 0x0001;
                                              }
                                      else
                                              {
                                                      uiTemp = uiTemp << 1;
                                              }
                                           
                                      ADsclk = 0;
                                    
                                      for( j = 0 ; j < 30 ; j++ );
                              }
                            
                              for( i = 0 ; i < 8 ; i++ )                      //读低8位数据
                              {
                                      ADsclk = 1;
                                    
                                      for( j = 0 ; j < 30 ; j++ );
                                    
                                      if( ADdout == 1 )
                                              {
                                                      ucTemp = ( ucTemp << 1) | 0x01;
                                              }
                                      else
                                              {
                                                      ucTemp = ucTemp << 1;
                                              }
                                           
                                      ADsclk = 0;
                                    
                                      for( j = 0 ; j < 30 ; j++ );
                              }
                            
                              ADsclk = 1;                                     //发送第21个时钟脉冲,使ADS1230芯片的DOUT输出拉高
                            
                              for( j = 0 ; j < 30 ; j++ );
                                    
                              ADsclk = 0;
                            
                              for( j = 0 ; j < 30 ; j++ );
                            
    //                          ADdout = 1;
                            
    //                          for( j = 0 ; j < 30 ; j++ );
                              
                              PCA0CPH4 = 0;
                              
                              break;
                      }
                   
            }
            
            ulResult = uiTemp;
            ulResult = ulResult << 8;        
            ulResult = ulResult | ucTemp;
                            
            return ulResult;
                   
    }
    我有鼓捣了一下。
    利用断点调试,可以读到转换的AD值,反复读取,值会变小。同一电压,一般最先读取的二进制数大,以后读取的都逐渐变小,当然最大和最小也就差不到16,可能差10左右。
    后来为了直观一点,接了液晶屏,把采集到的值按照对应压力值显示出来。
    奇怪的是,第一次上电后,我调节电位器,还能够显示力值从小变大,当压力值达到90公斤时,单片机会发送脉冲给步进电机驱动器,这里没有接驱动器,并且显示界面会变一下,就是把显示的压力值数字形状变大而已。但是这以后采集数据就出错了,显示力值不准。并且断电后,再上电,调节电位器,当压力值小于90公斤时,也无**确显示,采集的值不准。
    后来我又使用断电调试,采集固定差分电压还是没有问题的。
    完全不知如何应对啊。


    我已经改为直接读取20位了。
    我的硬件是本来有一块主控板,然后单独做了一个ADS1230的小板,中间接线来采集数据。
    最开始有一块ADS1230小板是正常工作的,但是后面焊的同样的小板就不行,主控板还是同一块。
    至于程序的采集和显示控制逻辑,换成HX710的小板是可以正常工作的。
    由于后面焊的小板都不行,我后来照着TI的评估板电路做了一个小板,也是同样的现象。
    电路图就是照着评估板来的。

回帖(2)

巩潇然

2025-2-5 14:42:38
20bit的ADC,能够敏感地读出电压的波动。排除纹波噪声等因素,所以即使你用其他仪器测不变的电压值,ADS1230测出来的值也是有可能是有变化的。
举报

麻酱

2025-2-5 17:21:46
差分信号动态变化时不正常的原因可能有很多,以下是一些可能的原因:

1. 采样率不足:如果ADS1230的采样率不足以捕捉快速变化的信号,可能会导致数据不准确。请检查您的采样率设置,并确保它足够高以捕捉动态变化的信号。

2. 滤波器设置不当:在动态信号采集过程中,滤波器的设置至关重要。如果滤波器的截止频率设置不当,可能会导致信号失真。请检查您的滤波器设置,并确保它适合您的信号特性。

3. 信号完整性问题:在动态信号采集过程中,信号完整性可能会受到影响。这可能是由于信号线过长、接触不良或者受到干扰等原因造成的。请检查您的信号线和连接,并确保它们符合要求。

4. 电源噪声:电源噪声可能会影响ADS1230的性能。请确保您的电源稳定且干净,以减少噪声对信号采集的影响。

5. 模拟前端问题:ADS1230的模拟前端可能存在问题,导致动态信号采集不准确。请检查您的模拟前端电路,并确保它按照数据手册的要求进行设计。

6. 代码问题:您的代码可能存在问题,导致动态信号采集不准确。请检查您的代码,并确保它正确地处理动态信号。

7. 传感器问题:称重传感器本身可能存在问题,导致动态信号采集不准确。请检查您的传感器,并确保它正常工作。

为了解决这个问题,您可以尝试以下步骤:

1. 检查采样率设置,并确保它足够高以捕捉动态变化的信号。
2. 检查滤波器设置,并确保它适合您的信号特性。
3. 检查信号线和连接,并确保它们符合要求。
4. 确保电源稳定且干净。
5. 检查模拟前端电路,并确保它按照数据手册的要求进行设计。
6. 检查代码,并确保它正确地处理动态信号。
7. 检查传感器,并确保它正常工作。

通过以上步骤,您应该能够找到导致差分信号动态变化时不正常的原因,并采取相应的措施来解决问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分