基於STM8的ADC讀取

来源:https://www.cnblogs.com/zhenghaoyu/archive/2019/04/08/10672864.html
-Advertisement-
Play Games

想學會如何在STM8上使用ADC這個功能,我們先得瞭解單片機中ADC究竟是什麼。 ADC是模擬信號轉成數值信號,單片機只能識別TTL電平,其實就是 1 或者 0 ,但是如果我們給它一個3.3V電壓,單片機就無法識別,,若想使用單片機讀取出來得時候,它必須將模擬量變成數字量。 瞭解完後,我們就開始講解 ...


1. 綜訴

  想學會如何在STM8上使用ADC這個功能,我們先得瞭解單片機中ADC究竟是什麼。

  ADC是模擬信號轉成數值信號,單片機只能識別TTL電平,其實就是 1 或者 0 ,但是如果我們給它一個3.3V電壓,單片機就無法識別,,若想使用單片機讀取出來得時候,它必須將模擬量變成數字量。

 

2. 關於STM8S103手冊的ADC簡介

 

由官方的全英手冊可知。

----------------------------------------------------------------------------------------------------------------------------------

STM8中ADC1和ADC2主要功能如下:

  • 10位解析度
  • 單詞和連續的轉換模式
  • 可編程的(轉換頻率的)預分頻,fMASTER 可以被分頻 2到18
  • 可選擇ADC專用外部中斷(ADC_ETR)或者定時器觸發信號(TRGO)來作為外部觸發信號
  • 模擬放大(對於具有VREF引角的型號)
  • 轉換結束時可產生中斷
  • 靈活的數據對齊方式
  • ADC輸入電壓範圍:VSSA≤VIN≤VDDA

----------------------------------------------------------------------------------------------------------------------------------

ADC1具有以下拓展功能:

  • 帶緩衝的連續轉換模式
  • 單次和連續轉換的掃描模式
  • 具有上限和下限門檻的模擬看門狗
  • 模擬看門狗時間發生可產生中斷

----------------------------------------------------------------------------------------------------------------------------------

3. 常式

3.1 編譯環境

  我的編譯環境是IAR,這款軟體是現在STM8的主流平臺,比較推薦。不過我打算等到STCubeMX更新出比較方便的版本後再去使用Keil5,因為我在用STM32的時候就是利用Keil5,的確很方便,你們也可以學著用一下。

 

3.2 主晶元

  我的主晶元是STM8S系列中的103,其中STM8S的003、005、和103、105,配置一樣(外設和CPU頻率,FLASH),在代碼相同的情況下均可進行燒寫。

 

3.3 庫文件的添加

  我們的工程可以在IAR的常式中複製,操作過程:打開STM8S_StdPeriph_Lib(這是一個官方的庫文件,下載IAR STM8包的時候就攜帶,裡面有庫文件和相對應的常式),將Libraries文件複製到你工程所在的文件下,並將有關於ADC的庫文件添加到你的工程列表當中。添加完成後,有可能你會看到一些C文件會有紅色的小點報錯,這是因為你選的晶元上沒有該功能,你需要將其刪掉才能不報錯。如圖。

 

添加成功後,我們需要將頭文件添加進來,頭文件的路徑存放在 Libraries->STM8S_StdPeriph_Driver->inc中,如圖。 

 

 

3.4 代碼編寫

  STM8SF003這款晶元能用的是5個AD採樣通道,分別為為AIN2~AIN6。其一個通道AIN7,但在官方手冊中我沒找到有對其描述的,感興趣的朋友可以去察看晶元的英文手冊進行研究,也許會找到和我不一樣的結果。

在ADC頭文件中,將ADC1所有的ADC1_CHANNEL(ADC通道)都進行枚舉,以方便調用。

 1 /* Enum ----------------------------------------------------------------------*/
 2 
 3 enum ADC1_CHANNEL
 4 {                                        //bit  8  7  6  5  4  3  2  1
 5   
 6     ADC1_CHANNEL2 = 0x01,                //     0  0  0  0  0  0  0  1
 7     ADC1_CHANNEL3 = 0x02,                //     0  0  0  0  0  0  1  0
 8     ADC1_CHANNEL4 = 0x04,                //     0  0  0  0  0  1  0  0
 9     ADC1_CHANNEL5 = 0x08,                //     0  0  0  0  1  0  0  0
10     ADC1_CHANNEL6 = 0x10                 //     0  0  0  1  0  0  0  0
11         
12 };  

 

在ADC.C文件中,分為了多個函數,降低他們的耦合性,也方便理解。

首先是ADC中引角的初始化,將你所選通道的引角進行初始化,沒有選到的就不進行初始化。

 1 /*******************************************************************************
 2 * Function Name  : MX_ADC_GPIO_Init
 3 * Description    : ADC GPIO Init
 4 * Input          : ADC1_CHANNEL
5 * Output : None 6 * Return : None 7 ********************************************************************************/ 8 9 void MX_ADC_GPIO_Init(uint8_t ADC1_CHANNEL) 10 { 11 switch(ADC1_CHANNEL) 12 { 13 case ADC1_CHANNEL2: GPIO_Init(ADC_Opt_GPIOC_Port,ADC_channe2_Pin,GPIO_MODE_IN_PU_NO_IT);break; 14 case ADC1_CHANNEL3: GPIO_Init(ADC_Opt_GPIOD_Port,ADC_channe3_Pin,GPIO_MODE_IN_PU_NO_IT);break; 15 case ADC1_CHANNEL4: GPIO_Init(ADC_Opt_GPIOD_Port,ADC_channe4_Pin,GPIO_MODE_IN_PU_NO_IT);break; 16 case ADC1_CHANNEL5: GPIO_Init(ADC_Opt_GPIOD_Port,ADC_channe5_Pin,GPIO_MODE_IN_PU_NO_IT);break; 17 case ADC1_CHANNEL6: GPIO_Init(ADC_Opt_GPIOD_Port,ADC_channe6_Pin,GPIO_MODE_IN_PU_NO_IT);break; 18 } 19 20 }

 

  然後是ADC1的選擇通道初始化:ADC連續讀取,所選的通道,二分頻,外部轉換觸發,外部觸發器不開啟,數據右對齊,施密特觸發,不開啟。(註意:STMS8003中的串口使用了PD5和PD6,與ADC1中通道5、通道6發生衝突,故不可使用。如需使用,請將串口的TX\RX引角更改換為其它的引角。

 1 /*******************************************************************************
 2 * Function Name  : MX_ADC1_CHANNEL_Init
 3 * Description    : ADC CHANNEL Init
 4 * Input          : ADC1_CHANNEL
 5 * Output         : None
 6 * Return         : None
 7 ********************************************************************************/
 8 
 9 void MX_ADC1_CHANNEL_Init(uint8_t ADC1_CHANNEL)
10 {
11   switch(ADC1_CHANNEL)
12   {
13     case ADC1_CHANNEL2: 
14     {
15        ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_2, 
16        ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE, 
17        ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL2, DISABLE);break;
18     }
19     case ADC1_CHANNEL3:
20     {
21        ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_3, 
22        ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE, 
23        ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL3, DISABLE);break;
24     }
25     case ADC1_CHANNEL4:
26     {
27        ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_4, 
28        ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE, 
29        ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL4, DISABLE);break;
30     } 
31     case ADC1_CHANNEL5:
32     {
33        ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_5, 
34        ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE, 
35        ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL5, DISABLE);break;
36     }
37     case ADC1_CHANNEL6:
38     {
39        ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_6, 
40        ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE, 
41        ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL6, DISABLE);break;
42     }
43   } 
44 }

 

這裡就是將所有的ADC初始化進行一個統一的一個歸類。

 1 /*******************************************************************************
 2 * Function Name  : MX_ADC1_Init
 3 * Description    : ADC Init
 4 * Input          : ADC1_CHANNEL
 5 * Output         : None
 6 * Return         : None
 7 ********************************************************************************/
 8 void MX_ADC1_Init(uint8_t ADC1_CHANNEL)
 9 {  
10   //初始化GPIO
11   MX_ADC_GPIO_Init(ADC1_CHANNEL);
12   
13   //初始化ADC1所有寄存器
14   ADC1_DeInit();
15   
16   //配置ADC1寄存器中的參數
17   MX_ADC1_CHANNEL_Init(ADC1_CHANNEL);
18   
19   //使能ADC1
20   ADC1_Cmd(ENABLE);
21   
22   //ADC1轉換開始
23   ADC1_StartConversion();
24 }

 最後就是數據獲取,可以選擇直接獲取數據,也可以獲取十次數據後取平均數。

 

註意:

ADC獲取的值是AD值,需要將其進行代入公式中才能得到電壓值。

Vin = (ADC * Vref) / 1024

VCC很明顯可以使用萬用表先測出來,1024是因為STM8S這款的AD是10位精度。

這裡測試的VCC是3.35V,VCC另外一個意思就是單片機的供給電源。

 1 /*******************************************************************************
 2 * Function Name  : MX_ADC1_Get_Data
 3 * Description    : get VCC data
 4 * Input          : None
 5 * Output         : None
 6 * Return         : fVCC
 7 ********************************************************************************/
 8 float MX_ADC1_Get_Data(void)
 9 {
10   int iADC1_Value;
11   float fVCC;
12   
13   //讀取轉換結果
14   iADC1_Value = ADC1_GetConversionValue();
15   fVCC = (iADC1_Value * 3.350)/1024;
16   return fVCC;
17   
18 }
19 
20 
21 /*******************************************************************************
22 * Function Name  : MX_ADC1_Get_Average_Data
23 * Description    : Get VCC ten times average data. 
24 * Input          : None
25 * Output         : None
26 * Return         : fAverage_VCC
27 ********************************************************************************/
28 float MX_ADC1_Get_Average_Data(void)
29 {
30   int i;
31   float fAverage_VCC = 0.0;
32   
33   for(i=0;i<10;i++)
34   {
35    fAverage_VCC += MX_ADC1_Get_Data();
36   }
37   fAverage_VCC /= 10;
38   
39   return fAverage_VCC;
40   
41 }

將上面需要用到的函數在主函數中調用列印即可。

 

4. 實驗結果

 調試儀器:可調式電源,可通過旋鈕控制電壓的輸出大小。

 當沒有輸出電壓時,列印的值為0V.

當可調式電源輸出的電壓值為3.3V,串口助手上列印的也是3.3V。

 

當可調式電源輸出的電壓值為24V,串口助手上列印的也是24V。

註意:請不要將24V電源直接通入單片機中,我是自己設置了一條電路進行測試的。ADC的最大輸入電壓是3.3V,為了安全起見,請不要超過該值。

註意:請不要將24V電源直接通入單片機中,我是自己設置了一條電路進行測試的。ADC的最大輸入電壓是3.3V,為了安全起見,請不要超過該值。

註意:請不要將24V電源直接通入單片機中,我是自己設置了一條電路進行測試的。ADC的最大輸入電壓是3.3V,為了安全起見,請不要超過該值。

 

5. 結尾

對STM8的ADC的說明和引用到這裡結束,感謝各位看官的點擊。

如果覺得有所收穫請點下推薦,若認為該博客中存在錯誤的說明或者對博客中某方面有疑問請留言。

 

作 者:浩宇99✌
出 處:https://www.cnblogs.com/zhenghaoyu/p/10672864.html
版權聲明:本文原創發表於 博客園,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則視為侵權。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文鏈接:Create media for automated unattended install of Windows 10 我從來沒看到過像上面的文章一樣這麼詳細的描述過Windows10的無人值守安裝過程,看完長知識了,值得一看。之後我會將自己的製作過程發出來,讓大家學習一下。 只為了學習, ...
  • 1.使用tree命令查看根目錄的樹結構 如果沒有tree命令,可以使用yum進行安裝 執行命令後,即可看到根下一共有19個目錄 . 當前目錄 / 根目錄 /bin 存放必要的命令; 軟連接 /usr/bin /boot 存放內核以及啟動所需的文件; /dev 存放硬體設備文件 /etc 存放系統配置 ...
  • 1. 主機規劃 遠程執行教程文檔 所有模塊文檔 模塊在機器上存在的位置 註意事項 2. 使用格式 2.1. 指定目標 上一篇文章詳細說過,這裡簡單說下 2.2. 指定執行模塊 2.3. 執行參數 3. 使用示例 3.1. network 3.2. service 3.3. cp【可使用Salt-cp ...
  • Windows 使用 L2TP 協議連接VPN服務 首先, 點擊"添加 VPN 連接" 其次, 選擇 L2TP 協議 此時若嘗試連接發現會失敗, 打開網路共用中心, 會發現多了一個 VPN 的連接, 右鍵屬性 勾選相應選項, 再嘗試連接即可成功. ...
  • 先說BUG,最近要做項目需要樹莓派和陀螺儀,資金充足的話肯定是買一個硬體卡爾曼濾波的感測器類似JY901模塊,資金不足的就買MPU6050。 網上關於MPU6050在樹莓派上的代碼還能用,關於JY901的代碼真的是千奇百怪,而且複製現象特別嚴重,有很多系統本身有問題,導致很多像我一樣的新手在上面浪費 ...
  • 1. 主機規劃 Targeting Minions文檔 另請參見:自動化運維神器之saltstack (三)節點組及複合匹配器 註意事項 修改了master或者minion的配置文件,那麼必須重啟對應的服務。 2. 目標指定方式 Letter Match Type Example Alt Delim ...
  • 本文主要介紹一下阿裡雲CentOS7下如何對MySql 8.0資料庫進行自動備份,並使用.NET Core 將備份文件上傳至七牛雲存儲上,並對整個過程所踩的坑加以記錄. 環境、工具、準備工作 伺服器:阿裡雲64位CentOS 7.4.1708版本;並安裝MySql 8.0 資料庫(如何安裝點擊) 客 ...
  • Windows 評估和部署工具包 (Windows ADK) 具有自定義大規模部署的 Windows 映像以及測試系統、添加的組件和在該系統上運行的應用程式的質量和性能所需的工具。 Windows ADK 包括:用於評估系統或組件的質量和性能的 Windows 評估工具包和 Windows Perf ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...