发 帖  
原厂入驻New
实战多通道高速精密测温仪的全系列设计教程,以实际项目为依托,提升工程师核心竞争力!→点击立即抢购←
如何用STM32F107单片机做外部adc128s022的5路采集
25 STM32F107 单片机
分享
正在用STM32F107单片机做外部adc128s022的的5路采集,,没有思路谁做过能说说思路或者程序参考一下吗,谢谢
0
2019-7-19 05:55:22   评论 分享淘帖 邀请回答
11个回答
云汉达人
我也正想学习STM32的单片机采集多路ADC的问题,哈哈……不会帮顶……
2019-7-19 08:17:19 评论

举报

我用的STM32F107是25M晶振,AD芯片的是
   0.8 MHz to 3.2 MHz.我应该怎么分频,
用什么方式,看手册是SPI
2019-7-19 08:45:21 评论

举报

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();
}
  问题出在哪了,这是我的程序
2019-7-19 08:58:28 评论

举报

你的程序是什么问题?
2019-7-19 09:10:12 评论

举报

SPI配置,我用的64分频
2019-7-19 09:25:36 评论

举报

你去看下clk一个周期多少时间,算一下就可以知道分多少频的。
2019-7-19 09:34:34 评论

举报


STM32 spi采集ADC128S022误差很大,是我的记录值和误差,怎么减小误差,,我的程序
2019-7-19 09:48:46 评论

举报

STM32 spi采集ADC128S022误差很大,下面是我的记录值和误差,怎么减小误差

  我的程序
2019-7-19 09:57:02 评论

举报

这样看起来误差好像是有点大,但是也有几次数据是误差不大的,第一个就是多次采样,取平均,第二就是,那个模拟电压用RC滤波一下。
2019-7-19 10:16:38 评论

举报

程序修改后的测试:                   实际电压mv     误差mv     测量mv           4167     200.004639     3966.995361mv           3917     214.470947     3702.529053mv           3679     240.937256     3438.062744mv           3415     241.403564     3173.596436mv           3141     231.870117     2909.129883mv           2881     236.336426     2644.663574mv           2620     239.802734     2380.197266mv           2352     236.269043     2115.730957mv           2084.4     233.135474     1851.264526mv           1836     249.201782     1586.798218mv           1576.8     254.468213     1322.331787mv           这是我采集的误差,怎么减小误差
2019-7-19 10:27:11 评论

举报

是不是你计算的公式有问题?
2019-7-19 10:40:46 评论

举报

只有小组成员才能发言,加入小组>>

115个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /10 下一条

快速回复 返回顶部 返回列表