STM32 G431RB + LM35 ADC的采樣


在STM32 G431RB的板子上配置ADC對LM35溫度傳感器進行溫度采樣。

代碼放到Github上 https://github.com/magicduan/demo_adc

STM32 Cube IDE 的ico文件的配置:

  1. 配置freertos OS 
  2. PA6配置為PWM呼吸燈模式 (在面包板上加了一個LED等)
    • 配置LED等是用來檢測ADC能否工作
  3. PC5配置為ADC2_11
    • LM35的vout連接到PC5管腳,Vs管腳連接到板子的5V,GND接GND
    • 將Chanel 11配置為Single-ended

    • Clock Prescaler配置為divided by16。由於我配置的系統時鍾是170MHZ,而ADC的最大配置時鍾是14MHZ,所以我將這個Prescaler配置為divided by 16

      Resolution就是采樣對應的值范圍,系統缺省的是12bit,這里我配置為10bit。也就是說最大值為2^10 = 1024,溫度范圍有限,你也可以配置為8bit,具體影響到做數值轉換

 

 


配置好ICO后,生成代碼。呼吸燈代碼參考Demo_pwm的代碼處理。

我先將PC5的ADC采樣直接連接到PA5的LED管腳上,可以取得值,可能是采樣頻率相關,只能取得0和一個值。具體為什么不能取到不同的值沒有去深究了。

然后我將ADC連接到LM35的Vout管腳進行溫度采樣。代碼中用的簡單的Polling模式。

main函數中進行Calibrate操作。

  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
  HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);

  /* USER CODE END 2 */

在StartDefaultTask中取得adc的值並通過串口輸出

      HAL_ADC_Start(&hadc2);
      HAL_ADC_PollForConversion(&hadc2,1);
      adc_res = HAL_ADC_GetValue(&hadc2);
       
      //temperature = adc_res*0.488; //5/1024*100 
      temperature = adc_res*0.3225; //3.3/1024*100 
      sprintf(buffer,"ADC Result = %d Tempareture = %f\n",adc_res,temperature);
      HAL_UART_Transmit(&hlpuart1,buffer,strlen(buffer)+1,1000);
      osDelay(5);

 

整個代碼實現中碰到的坑有幾個:

  1. ADC的采樣頻率最大為14MHZ,我的系統頻率為170MHZ,所以需要加Prescaler
  2. LM35的工作電壓為4v-30v,我用的板子上的5v,后來改用3.3v也可以正常工作,最終我還是選擇了5v
  3. 將LM35的工作電壓與ADC的采樣電壓搞混了,G431Rb的ADC采樣電壓是3.3v,工作電壓設置為5v或者3.3v不影響采樣的值。
  4. ADC采樣值到溫度的轉換計算。

LM35是線性的。ADC的Resolution設置為10bit,也就是說當Vout = 參考電壓3.3v 時,ADC的值是1023(2^10-1)。這樣溫度的轉換方法就變為

temperature = adc_res(ADC的采樣值)*3.3/1023*100 度

  *剛開始錯誤的理解參考電壓為LM35的工作電壓(5v)這樣計算出來的溫度就太高了。

         

 

 

參考文章:

https://deepbluembedded.com/temperature-sensor-lm35-interfacing-with-pic-microcontrollers/

https://deepbluembedded.com/stm32-adc-tutorial-complete-guide-with-examples/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM