嵌入式学习小组
直播中

张琛根

8年用户 167经验值
私信 关注

如何用STM32F107单片机做外部adc128s022的5路采集

受到警告
提示: 作者被禁止或删除 内容自动屏蔽

回帖(11)

黄思

2019-7-19 08:17:19
云汉达人
我也正想学习STM32的单片机采集多路ADC的问题,哈哈……不会帮顶……
举报

h1654155275.5814

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

王萍

2019-7-19 08:58:28
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 09:10:12
你的程序是什么问题?
举报

更多回帖

×
20
完善资料,
赚取积分