<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      歡迎來到SFWR的博客

      訓練題——ADC讀取溫度

      Author:XuanYu

      利用ADC測量單片機內部溫度

      廢話不多說,直接開搞。

      科普

      先科普一下ADC(不是 AD carry!),ADC是模數轉化器,就是模擬信號轉換成數字信號的東西,通常的模數轉換器是將一個輸入電壓信號轉換為一個輸出的數字信號。由于數字信號本身不具有實際意義,僅僅表示一個相對大小。故任何一個模數轉換器都需要一個參考模擬量作為轉換的標準,而輸出的數字量則表示輸入信號相對于參考電壓的大小。 因此,模擬數字轉換器會會將模擬信號轉換為表示一定比例電壓值的數字信號。
      舉個簡單的例子,對于一般的單片機上的ADC,測量電壓的范圍也就是輸入的模擬信號的范圍是0-3.3V,而轉化后的數字信號范圍取決于ADC的位數,假如是12位的那就是0-2^12也就是0-4096,也就是說要是輸入電壓是1V的話,那轉化的電壓就是1/3.3*4096=1240。

      ADC的主要作用就是讀取輸入到單片機的電壓等物理量,當然也可以測溫度,現在我們就來用單片機自帶的溫度傳感器測溫度吧!

      配置

      先用中斷的方式使用ADC讀取電壓。
      首先拿出我們的單片機(我用的是STM32f407ZGT6)然后放到一邊
      打開cubemx配置如下:
      image
      image
      image

      配置ADC這里可能不同的單片機溫度傳感器的位置不一樣,要找到自己單片機的Temperature Sensor Channel并選中,同時勾選一下NVIC Settings里的那個Enabled下面的框,開啟adc的全局中斷。
      image

      這里配了一個串口,方便一會輸出測量的溫度,操作就是選一個串口然后把最上面的mode設置成Asynchronous就可以了。

      最后再配置一下時鐘樹,前面應該有講我就不贅述了。

      然后生成工程,開始寫代碼。

      #ifdef __GNUC__
      #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
      #else
      #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
      #endif
      PUTCHAR_PROTOTYPE
      {
          HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
          return ch;
      }
      

      現在最上面加這段代碼,然后再按照下圖操作
      在cubeide主界面,選中工程,然后點擊項目->屬性->C/C++構建->設置->MCU Settings
      image
      把下面的兩個Use都選上
      這樣就可以直接調用printf函數通過串口輸出了。

      使用ADC

      然后再寫一個adc的中斷函數

      void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
      {
      	   HAL_ADC_PollForConversion(&hadc1 ,10);  //等待adc采樣結束
      	   light_value=HAL_ADC_GetValue(hadc);      //讀取adc采樣的數值并賦值給light_value
      	   v=light_value*3.3/4096;
      tem=((light_value*3.3/4096-0.76)/0.0025)+25;   //計算溫度
      
      	  // printf("light_value=%d\n",light_value );
      }
      

      image

      這個是我的單片機的溫度傳感器的一個電氣特性,就是說adc采集的電壓和實際的溫度是一個正比的關系,然后第三行的Avg_Slope是斜率,也就是2.5mV/°C 然后第四行是說25°時讀取的電壓大約為0.76,所以就可以根據這兩個算出當讀取的電壓值為v0時,實際的溫度是(v0-0.76)/0.0025+25。

      最后主函數中不斷開啟ADC中斷就可以了。代碼如下

      while (1)
        {
      	  HAL_ADC_Start_IT(&hadc1);
      	  printf("get_value=%d,V=%f\r\n",light_value,v);
      	  printf("temp=%f\r\n",tem);   //把溫度值打印出來
      	  HAL_Delay(1000);
          /* USER CODE END WHILE */
      
          /* USER CODE BEGIN 3 */
        }
        /* USER CODE END 3 */
      

      然后把程序燒到單片機里,連接串口調試助手結果如下:
      image

      輸出的溫度大概是18°左右,因為沒有室溫計所以沒法比較誤差,但是對比當時的天氣預報顯示的是20°(可能科協比較冷一點)也能反映這次測量大概是比較準的。

      其他ADC調用方法

      也可以用一種簡單的查詢阻塞的方式
      這個配置起來就比較簡單,和中斷相比就不用勾選ADC的全局中斷Enable了,其他的相同。
      代碼的話直接在主函數里寫就行,
      image

      代碼我就扔個圖片就好。

      最后還有一種方式通過DMA采集
      這個博客建議大家看一看,挺實用的。
      【STM32技巧】ADC模擬量采集的幾種用法_小石頭有大內涵的博客-CSDN博客_stm32模擬信號采集

      關于DMA的配置也可以參考文章:https://blog.csdn.net/weixin_44584198/article/details/119453399
      ADC是單片機里比較基礎的也是最常用的東西了,希望大家都能認真學習,有問題先 csdn再找學長問,希望大家都能有所收獲。

      posted @ 2022-11-13 09:48  SFWR  Views(651)  Comments(0)    收藏  舉報
      主站蜘蛛池模板: 久久国产精品第一区二区| 亚洲综合色网一区二区三区| 在线看免费无码的av天堂| 高清中文字幕国产精品| 你懂的在线视频一区二区| 一出一进一爽一粗一大视频| 人妻伦理在线一二三区| 亚洲美免无码中文字幕在线| 亚洲精品国产精品国在线| 成人性生交大片免费看| 成年站免费网站看v片在线| 粉嫩国产一区二区三区在线| 丰满熟女人妻一区二区三| 国产成人精品国产成人亚洲| 国产人妻人伦精品1国产丝袜| 一区二区三区四区五区色| 40岁大乳的熟妇在线观看| 三上悠亚在线精品二区| 国内精品人妻一区二区三区| 久久亚洲色WWW成人男男| 国产一区二区波多野结衣| 亚洲国产av一区二区| 少妇熟女久久综合网色欲| 亚洲精品国产免费av| 国产精品亚洲五月天高清| 一区二区亚洲人妻精品| 中文国产成人精品久久一| 激情人妻自拍中文夜夜嗨| 亚洲成熟女人毛毛耸耸多| 久久国产精品免费一区| 免费a级毛片18以上观看精品| 精品亚洲国产成人av| 日韩精品一区二区三区色| 开心色怡人综合网站| 黑人异族巨大巨大巨粗| 中国丰满少妇人妻xxx性董鑫洁| 久久99精品久久久久久| 亚洲成人av在线资源| 乌什县| 国产精品进线69影院| 天天做天天爱夜夜爽导航|