STM32 AD單通道與多通道實戰指南

文章目錄

    • AD單通道(實驗)
      • 有關配置的庫函數
      • AD單通道部分主要代碼
    • AD多通道實現
      • 多通道采集實現思路探討
      • 單次轉換非掃描模式實現AD多通道
      • AD多通道部分代碼

學習建議:推薦搭配 江協科技 AD單通道 AD多通道一起食用!!!!
【STM32入門教程-2023版 細致講解 中文字幕】https://www.bilibili.com/video/BV1th411z7sn?p=22&vd_source=66c03c3ecc640bbe982dc3d48bfd8841

AD單通道(實驗)

在這里插入圖片描述
在這里插入圖片描述

  1. 初始化流程
    開啟時鐘 → 配置 GPIO 為模擬輸入 → 配置規則組通道 → 初始化 ADC 結構體 → 開啟 ADC 電源 → 校準 ADC。
  2. 單次轉換流程
    軟件觸發轉換 → 等待 EOC 標志位 → 讀取轉換結果。

有關配置的庫函數

1. RCC_ADCCLKConfig

  • 功能:配置 ADC 的時鐘分頻器,確定 ADC 工作時鐘(ADCCLK)。
  • 參數:可選分頻系數為 2、4、6、8,輸入時鐘為 APB2 的 72MHz 時鐘。
    • 示例:若選擇 6 分頻,ADCCLK = 72MHz / 6 = 12MHz。
  • 作用:確保 ADC 工作在合適的時鐘頻率下,保證轉換精度和穩定性。
  • 在RCC庫函數中,配置ADC工作時鐘。

2.電源與校準函數

  • ADC_Cmd
    • 功能:開啟或關閉 ADC 電源。
    • 參數ENABLE 啟動 ADC,DISABLE 關閉。
  • 校準函數組(需按順序調用):
    • ADC_ResetCalibration:復位校準寄存器。
    • ADC_GetResetCalibrationStatus:等待復位校準完成(通過循環檢測標志位)。
    • ADC_StartCalibration:啟動校準。
    • ADC_GetCalibrationStatus:等待校準完成(通過循環檢測標志位)。
    • 作用:減小 ADC 轉換誤差,需在初始化后調用。

3.中斷與 DMA 相關函數

  • ITConfig:開啟或關閉 ADC 中斷(如模擬看門狗中斷)。
  • NVIC_Init:配置中斷優先級(需結合 ITConfig 使用)。
  • DMA_Cmd:開啟 DMA 傳輸(用于多通道數據搬運,會議中未深入講解)。

4.觸發與轉換控制函數

  • ADC_SoftwareStartConvCmd
    • 功能:軟件觸發 ADC 開始轉換(適用于單次轉換模式)。
    • 參數ENABLE 觸發轉換,DISABLE 關閉。
  • ADC_GetSoftwareStartConvStatus
    • 不能獲取軟件觸發轉換狀態,因為當有軟件觸發標志時,一旦開始轉化就會將軟件觸發標志位清零,不會通過該函數獲得是否轉化完成。
  • ADC_GetFlagStatus
    • 功能:獲取轉換狀態標志位。
    • 關鍵參數
      • ADC_FLAG_EOC:規則組轉換完成標志位(轉換結束后硬件置 1)。
    • 用途:通過檢測 EOC 標志位判斷轉換是否完成,而非使用 ADC_GetSoftwareStartConvStatus(該函數僅返回觸發狀態,與轉換完成無關)。

5.配置間斷模式函數

  • ADC_DiscModeChannelCountConfig
    • 每隔幾個通道間斷一次
  • ADC_DiscModeCmd
    • 是否開啟間斷模式

6.規則組通道配置

  • ADC_RegularChannelConfig
    • 功能:配置規則組通道參數,如通道號、序列位置、采樣時間。
    • 參數
      • ADCx:ADC 外設(如 ADC1)。
      • ADC_Channel:通道編號(如 PA0 對應 ADC_Channel_0)。
      • Rank:序列位置(1~16,非掃描模式下僅需設為 1)。
      • ADC_SampleTime:采樣時間(影響轉換速度和穩定性,可選短 / 中 / 長周期)。

7.其他

  • ADC_ExternalTrigConvCmd

    • 外部觸發轉換控制 ,就是是否允許外部觸發轉換
  • ADC_GetConversionValue

    • 功能:讀取規則組通道的轉換結果(16 位無符號整數)。
    • 返回值:轉換后的數字量,需結合參考電壓計算實際模擬值。
  • ADC_GetDualModeConversionValue

    • ADC獲取雙模式轉換值,雙ADC模式讀取轉化結果的函數
  • ADC_TempSensorVrefintCmd

    • ADC溫度傳感器,內部參考電壓控制,用來開啟內部的兩個通道。

8.注入組與模擬看門狗函數

  • 注入組函數:帶 Injected 前綴的函數(如 ADC_InjectedChannelConfig),用于配置緊急通道(會議中未使用)。

  • 模擬看門狗函數

    • ADC_AnalogWatchdogCmd:啟動模擬看門狗,監測輸入電壓是否超出閾值。
    • ADC_AnalogWatchdogThresholdsConfig:設置電壓閾值(高 / 低閾值)。
  • ADC_AnalogWatchdogSingleChannelConfig

    • 配置看門的通道

AD單通道部分主要代碼

// AD.c
#include "stm32f10x.h"                  // Device headervoid AD_Init(void)
{//1.開始時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//2. 配置ADC時鐘信號//只能使用6 或者 8 分頻,因為有限制RCC_ADCCLKConfig(RCC_PCLK2_Div6);//3.配置gpio口 //初始化gpioinit參數中的結構體GPIO_InitTypeDef GPIO_InitStructure;//將gpio口設置為模擬輸入模式,就是io口不起作用不會影響數據轉化GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//4.配置規則組通道ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);//5.初始化ADC模塊ADC_InitTypeDef ADC_InitStruct;//是否連續轉化ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//對齊方式ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//外部觸發方式,使用軟件觸發,所以配置為ADC_ExternalTrigConv_NoneADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;ADC_InitStruct.ADC_NbrOfChannel = 1;//配置連續掃描ADC_InitStruct.ADC_ScanConvMode = DISABLE;ADC_Init(ADC1, &ADC_InitStruct);//6. 開啟ADC總開關ADC_Cmd(ADC1, ENABLE);//7.校準ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1) == SET);ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1) == SET);}
//啟動轉換,獲取結果函數
uint16_t AD_GetValve(void)
{//內部軟件啟動轉換ADC_SoftwareStartConvCmd(ADC1, ENABLE);//查看是否轉化完成//查看標志位,轉化完成會將EOC標志位置一while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//讀取數據return ADC_GetConversionValue(ADC1);
}

AD多通道實現

多通道采集實現思路探討

  • 掃描模式結合 DMA :利用列表填充四個通道觸發轉換可實現多通道,但存在數據覆蓋問題,最好配合 DMA 實現,講完 DMA 后再嘗試。
  • 手動轉運數據問題 :掃描模式下單個通道轉換完成無標志位和中斷,只有整個列表轉換完才有 EOC 標志位和中斷,易造成數據覆蓋丟失;且 AD 轉換快,手動轉運數據對程序要求高,操作困難。
  • 間斷模式手動轉運 :可使用間斷模式,每轉換一個通道暫停,手動轉運數據后再繼續,但因無標志位需靠 delay 延時保證轉換完成,不省心且效率低,暫不推薦。

單次轉換非掃描模式實現AD多通道

  • 具體實現方式 :每次觸發轉換前手動更改列表第一個位置的通道,如依次寫入通道 0、1、2、3 等,觸發轉換等待讀值,就能實現多通道轉換。

AD多通道部分代碼

//AD.c
#include "stm32f10x.h"                  // Device headervoid AD_Init(void)
{//1.開始時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//2. 配置ADC時鐘信號//只能使用6 或者 8 分頻,因為有限制RCC_ADCCLKConfig(RCC_PCLK2_Div6);//3.配置gpio口  //初始化gpioinit參數中的結構體GPIO_InitTypeDef GPIO_InitStructure;//將gpio口設置為模擬輸入模式,就是io口不起作用不會影響數據轉化GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//5.初始化ADC模塊ADC_InitTypeDef ADC_InitStruct;//是否連續轉化ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//對齊方式ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//外部觸發方式,使用軟件觸發,所以配置為ADC_ExternalTrigConv_NoneADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;ADC_InitStruct.ADC_NbrOfChannel = 1;//配置連續掃描ADC_InitStruct.ADC_ScanConvMode = DISABLE;ADC_Init(ADC1, &ADC_InitStruct);//6. 開啟ADC總開關ADC_Cmd(ADC1, ENABLE);//7.校準ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1) == SET);ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1) == SET);}
//使用單次轉化,非掃描模式實現AD多通道
//啟動轉換,獲取結果函數
uint16_t AD_GetValve(uint8_t ADC_Channel)
{//配置規則組通道ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);//內部軟件啟動轉換ADC_SoftwareStartConvCmd(ADC1, ENABLE);//查看是否轉化完成//查看標志位,轉化完成會將EOC標志位置一while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//讀取數據return ADC_GetConversionValue(ADC1);
}
//main.c#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "AD.h"
uint16_t value0;
uint16_t value1;
uint16_t value2;
uint16_t value3;int main(void)
{OLED_Init();AD_Init();OLED_ShowString(1, 1, "V0:");OLED_ShowString(2, 1, "V1:");OLED_ShowString(3, 1, "V2:");OLED_ShowString(4, 1, "V3:");while(1){value0 = AD_GetValve(ADC_Channel_0);value1 = AD_GetValve(ADC_Channel_1);value2 = AD_GetValve(ADC_Channel_2);value3 = AD_GetValve(ADC_Channel_3);OLED_ShowNum(1, 4, value0, 4);OLED_ShowNum(2, 4, value1, 4);OLED_ShowNum(3, 4, value2, 4);OLED_ShowNum(4, 4, value3, 4);Delay_ms(100);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/83518.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83518.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/83518.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

溝通頻率不合適,如何找到平衡點

在團隊協作中,溝通頻率過高、信息干擾、節奏錯位常常導致效率下降與成員倦怠。PMI研究指出,溝通不當是75%項目延誤的根源,其中溝通頻率失衡是關鍵變量之一。要解決這一問題,關鍵在于設定節奏、分層溝通、制定協議。其中&#xff0…

EC2 實例詳解:AWS 的云服務器怎么玩???

彈性計算、靈活計費、全球可用,AWS EC2 全攻略 在 AWS 生態中,有兩個核心服務是非常關鍵的,一個是 S3(對象存儲),另一個就是我們今天的主角 —— Amazon EC2(Elastic Compute Cloud&#xff09…

lvs-keepalived高可用群集

目錄 1.Keepalived 概述及安裝 1.1 Keepalived 的熱備方式 1.2 keepalived的安裝與服務控制 (1)安裝keep alived (2)控制 Keepalived 服務DNF 安裝 keepalived 后,執行以下命令將keepalived 服務設置為開機啟動。 2.使用 Keepalived 實現雙機熱備 …

車載診斷架構SOVD --- 車輛發現與建連

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 鈍感力的“鈍”,不是木訥、遲鈍,而是直面困境的韌勁和耐力,是面對外界噪音的通透淡然。 生活中有兩種人,一種人格外在意別人的眼光;另一種人無論…

BUUCTF之[ACTF2020 新生賽]BackupFile

打開環境就一句話 找出源文件! 結合題目名字&#xff1a;BackupFile 先用dirsearct掃描網站文件 發現一個index.php.bak ,拼接url下載 打開發現php代碼 <?php include_once "flag.php";if(isset($_GET[key])) {$key $_GET[key];if(!is_numeric($key)) {exit…

Rag技術----項目博客(六)

RAG 定義&#xff1a;檢索增強生成&#xff08;Retrieval Augmented Generation&#xff09;&#xff0c;簡稱 RAG&#xff0c;已經成為當前最火熱的LLM應用方案。 目的&#xff1a;通過提供相關領域數據庫通過問題檢索信息&#xff0c;將相關信息合并到Prompt中&#xff0c;…

設計模式——外觀設計模式(結構型)

摘要 本文介紹了外觀設計模式&#xff0c;它是一種結構型設計模式&#xff0c;通過引入一個外觀類來封裝復雜子系統的調用細節&#xff0c;對外提供簡單統一的接口。文中通過生活類比、關鍵角色介紹、使用場景分析以及結構說明等方面對這一模式進行了全面闡述&#xff0c;還涉…

LabVIEW磁懸浮軸承傳感器故障識別

針對工業高端裝備中主動磁懸浮軸承&#xff08;AMB&#xff09;的位移傳感器故障檢測需求&#xff0c;基于 LabVIEW 平臺構建了一套高精度故障識別系統。通過集成品牌硬件與 LabVIEW 的信號處理能力&#xff0c;實現了傳感器探頭故障的實時監測與精準定位&#xff0c;解決了傳統…

集成學習三種框架

集成學習通過組合多個弱學習器構建強學習器&#xff0c;常見框架包括Bagging&#xff08;裝袋&#xff09;、Boosting&#xff08;提升&#xff09; 和Stacking&#xff08;堆疊&#xff09; 一、Bagging&#xff08;自助裝袋法&#xff09; 核心思想 從原始數據中通過有放回…

PCI DSS培訓記錄

22日上午: 整體PCI DSS 結構分享VISA分享全球欺詐風險動態 信用卡被偷枚舉攻擊依然是最為主要的安全威脅之一(枚舉驗證碼),增加3DS驗證防護勒索軟件和信息泄漏攻擊欺詐分子對AI技術的興趣日益增加,如換臉軟件過驗證基于NFC技術利用非接交易進行欺詐成為新的攻擊手段,如NF…

數據安全中心是什么?如何做好數據安全管理?

目錄 一、數據安全中心是什么 &#xff08;一&#xff09;數據安全中心的定義 &#xff08;二&#xff09;數據安全中心的功能 1. 數據分類分級 2. 訪問控制 3. 數據加密 4. 安全審計 5. 威脅檢測與響應 二、數據安全管理的重要性 三、如何借助數據安全中心做好數據安…

黑馬Java面試筆記之 微服務篇(業務)

一. 限流 你們項目中有沒有做過限流?怎么做的? 為什么要限流呢? 一是并發的確大(突發流量) 二是防止用戶惡意刷接口 限流的實現方式: Tomcat:可以設置最大連接數 可以通過maxThreads設置最大Tomcat連接數,實現限流,但是適用于單體架構 Nginx:漏桶算法網關,令牌桶算法自定…

PostgreSQL的擴展 passwordcheck

PostgreSQL的擴展 passwordcheck passwordcheck 是 PostgreSQL 內置的一個密碼復雜度檢查擴展&#xff0c;用于強制實施基本的密碼策略。 一、擴展概述 功能&#xff1a;在創建或修改用戶密碼時檢查密碼復雜度目的&#xff1a;防止使用過于簡單的密碼適用版本&#xff1a;Po…

Go語言學習-->編譯器安裝

Go語言學習–&#xff1e;編譯器安裝 Go采用的是UTF-8編碼的文本文件存放源代碼&#xff0c;理論上使用任何一款文本編輯器都可以做Go語言開發。這里推薦使用VS Code和Goland。 VS Code是微軟開源的編輯器&#xff0c;而Goland是jetbrains出品的付費IDE。我們這里使用VS Code …

基于Android的一周穿搭APP的設計與實現 _springboot+vue

開發語言&#xff1a;Java框架&#xff1a;springboot AndroidJDK版本&#xff1a;JDK1.8服務器&#xff1a;tomcat7數據庫&#xff1a;mysql 5.7數據庫工具&#xff1a;Navicat12開發軟件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.6 系統展示 APP登錄 A…

井字棋——ai PK you

挑戰人工智能&#xff0c;體驗經典井字棋的對決&#xff01;AI 擁有強大的邏輯計算能力&#xff0c;每一步都經過精準推演。你能戰勝它嗎&#xff1f;還是會被 AI 徹底碾壓&#xff1f; 特點&#xff1a; 智能 AI&#xff0c;難度可調 極簡界面&#xff0c;快速上手 實時勝負…

關于easyx頭文件

一、窗口創建 &#xff08;1&#xff09;幾種創建方式 #include<easyx.h>//easyx的頭文件 #include<iostream> using namespace std;int main() {//創建一個500*500的窗口//參數為&#xff1a;長度&#xff0c;寬度&#xff0c;是否顯示黑框&#xff08;無參為不…

【學習記錄】Django Channels + WebSocket 異步推流開發常用命令匯總

文章目錄 &#x1f4cc; 摘要&#x1f9f0; 虛擬環境管理? 創建虛擬環境? 刪除虛擬環境? 激活/切換虛擬環境 &#x1f6e0;? Django 項目管理? 查看 Django 版本? 創建 Django 項目? 創建 Django App &#x1f4ac; Channels 常用操作? 查看 Channels 版本 &#x1f50…

Java線程狀態及其流轉

在Java編程中&#xff0c;線程是一種重要的并發實體。為了更好地理解和管理多線程應用程序&#xff0c;我們需要清楚線程的不同狀態及其流轉機制。本文將詳細介紹Java中線程的幾種主要狀態以及它們之間的轉換關系。 一、線程狀態概述 Java線程的生命周期有多個狀態&#xff0…

LabVIEW雙光子顯微鏡開發

基于LabVIEW 開發高性能雙光子顯微鏡系統&#xff0c;聚焦于生物樣本深層成像與納米材料三維表征。實現了超快激光控制、多維數據采集與實時圖像重建。系統采用飛秒激光光源與高精度振鏡掃描模塊&#xff0c;結合 LabVIEW 的 FPGA 實時控制能力&#xff0c;可對活體組織、熒光納…