打印
[数据转换器-信号链]

我用STM32F107 SPI方式采集ADC128S022的问题,采到的数据不对

[复制链接]
2156|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
extern void Delay(vu32 nCount);
#define NUM_OF_RESULTS   8    // Number of temp sensor samples to take
#define ADC_CHANNEL      0    // ADC channel for conversion
#define SCALE_FACTOR     3    // For averaging converted samples
#define ADC12_RATIO    0.805664   // 3300/4096(3300mV ref & 12bit converter, straight binary o/p)
#define ADC_INPUT0        0
#define ADC_INPUT1        1
#define ADC_INPUT2        2
#define ADC_INPUT3        3
#define ADC_INPUT4        4
#define ADC_INPUT5        5
#define ADC_INPUT6        6
#define ADC_INPUT7        7
volatile unsigned char bdata;
unsigned char ADC_Input  = 0x00;  
unsigned char ADC_Cnt  = 0x00;  
unsigned short ADC_Data  = 0x0000;           
unsigned char ADC_Numbytes = 0x00;
unsigned char i ;         void TI_ADC128S022_Init(void)
{
    ADC_Numbytes = 16;
    ADC_Data  = 0;
    AD_CS_DISABLE();
     AD_SCLK_DISABLE();
    Delay(1000);
     AD_CS_ENABLE();
   #if 0
     switch(NUM_OF_RESULTS)  
    {   
           case 0:ADC_Input = ADC_INPUT0;    break;  
           case 1:ADC_Input = ADC_INPUT1;    break;   
           case 2:ADC_Input = ADC_INPUT2;    break;   
           case 3:ADC_Input = ADC_INPUT3;    break;   
           case 4:ADC_Input = ADC_INPUT4;    break;   
           case 5:ADC_Input = ADC_INPUT5;    break;   
           case 6:ADC_Input = ADC_INPUT6;    break;   
           case 7:ADC_Input = ADC_INPUT7;    break;  
    default:   
    break;
    }
    #endif
    ADC_Input = 0xe1;
    for(ADC_Cnt = 0; ADC_Cnt < ADC_Numbytes; ADC_Cnt++)  
     {   
      Delay(1000);   
      AD_SCLK_DISABLE();   
      if (ADC_Cnt<5)
    {
      if(ADC_Input&0x80)  
     {
      ADC_DOU_ENABLE();
     }
      else
       {
        ADC_DOU_DISABLE();
             }
       ADC_Input <<= 1;
    }
       else
       {
        ADC_DOU_DISABLE();
             }
       Delay(1000);
       AD_SCLK_ENABLE();
       Delay(1000);
            // if(ADC_Cnt >= 4 )
      // {
      //  ADC_Data <<= 1;  
            
       //if(ADC_DIN_ENABLE)
       // {
       //    ADC_Data |= 0x0001;
            //   }
       // else
       // {
         // ADC_Data &= 0xfffe;
             //  }   
  }
   // else
   // {;}
//}
     AD_CS_DISABLE();
       //AD_SCLK_ENABLE();
      // *adc_data   = ADC_Data;
     // return;  
     //    printf("%d ",ADC_Data);       //这儿打印出来的值是4095
}
        void TI_ADC128S022_ADC_vout (void)
{
  uint8_t i;
   static uint16_t results[NUM_OF_RESULTS];       // To store ADC output
   static uint32_t sum_adc_data = 0;              // accumulate and avg adc results
   volatile static float vout;                    // ADC vout
   
   for(i=0; i<8;i++)
   {
     results = SPI_ReadWriteByte(ADC_CHANNEL); // read and store ADC Channel output   
     sum_adc_data += results;                  // accumulate result
     Delay(1000);                                  // acquisition time                             
   }
   sum_adc_data >>= SCALE_FACTOR;                 // Average the accumulated sum
   vout = sum_adc_data * ADC12_RATIO;             // ADC vout  
   sum_adc_data = 0;                              // Set Breakpoint here & see measured vout     
    while(1)
   {
   printf("%f ",vout);       //这儿打印值是205.444321
   Delay(5000000);
   }
}


int main(void)
{  
  Init_Usart();
   SPI_Configuration();
  TI_ADC128S022_Init();
  TI_ADC128S022_ADC_vout();
}
问题出在哪了,这是我的程序

AD_Sample.zip

3.51 MB

相关帖子

沙发
zhshw0614|  楼主 | 2015-4-24 10:49 | 只看该作者
大家帮忙看看,谢谢

使用特权

评论回复
板凳
airwill| | 2015-4-24 14:07 | 只看该作者
这么一大堆, 也没有看明白问的什么问题.
ADC 采样错了? 数值计算错误?

使用特权

评论回复
地板
xyz549040622| | 2015-4-24 17:51 | 只看该作者
本帖最后由 xyz549040622 于 2015-4-24 18:07 编辑

1.抓波形,看看读到的值的波形和实际二进制是否对应
2.看看实际电压和读到电压的差距有多大3.抓你的波形对照数据手册的波形

使用特权

评论回复
5
zhshw0614|  楼主 | 2015-4-27 16:30 | 只看该作者
STM32 spi采集ADC128S022误差很大,下面是我的记录值和误差,怎么减小误差

1.png (6.83 KB )

1.png

使用特权

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

本版积分规则

31

主题

113

帖子

2

粉丝