【STM32】ADC模數轉換基本原理(提供完整實例代碼)

這篇文章是嵌入式中我通過大量資料 整合成了一份 系統完整、層次清晰的 ADC 模數轉換原理解析 文檔。

這里系統地梳理了 STM32F1 系列 ADC 模數轉換的核心資料,包括:

1.原理 + 特性
2.通道配置
3.模式選擇(單次/連續/掃描)
4.關鍵寄存器與時序
5.全套庫函數調用方式
6.提供示例實驗代碼

📘 STM32F1 系列 ADC 模數轉換原理詳解

參考資料:
STM32F1xx官方資料:《STM32中文參考手冊V10》-第11章 模擬/數字轉換(ADC)

🧩 第一部分:STM32 ADC 基本原理
什么是 ADC?

ADC(Analog to Digital Converter) 是一種將模擬電壓信號轉換為數字信號的模塊。在 STM32 中,ADC 是片上外設,可將 03.3V 的電壓轉換為 12 位數值(04095)。

ADC 指模/數轉換器或者模擬/數字轉換器。是指將連續變量的模擬信號轉換為離散的數字信號的器件。

典型的模擬數字轉換器將模擬信號轉換為表示一定比例電壓值的數字信號。

為什么需要 ADC?

因為 MCU(如 STM32)只能處理 數字信號(0 和 1),而現實世界中的信號多數是連續的模擬量,如:

模擬信號數字處理需求
溫度需要轉換為數字量
電壓需要轉為數字量
光照強度數字化后進行計算
電流數字化后保護電路
ADC 的基本工作過程

🎯 模擬信號 → 數字值:

  • 將輸入電壓 VIN 轉換為一個 數字碼值,范圍為 0 ~ 2? - 1,其中 n 為 ADC 的分辨率。
  • 例如在 STM32F1 中,ADC 是 12 位,所以:
    • 數字范圍:0 ~ 4095(212 - 1)
    • 輸入范圍:VREF- ~ VREF+(一般為 0V ~ 3.3V)

STM32F10x ADC特點:

12位逐次逼近型的模擬數字轉換器。
最多帶3個ADC控制器
最多支持18個通道,可最多測量16個外部和2個內部信號源。
支持單次和連續轉換模式
轉換結束,注入轉換結束,和發生模擬看門狗事件時產生中斷。
通道0到通道n的自動掃描模式
自動校準
采樣間隔可以按通道編程
規則通道和注入通道均有外部觸發選項
轉換結果支持左對齊或右對齊方式存儲在16位數據寄存器
ADC轉換時間:最大轉換速率 1us。(最大轉換速度為1MHz,在ADCCLK=14M,采樣周期為1.5個ADC時鐘下得到。)
ADC供電要求:2.4V-3.6V
ADC輸入范圍:VREF- ≤ VIN ≤ VREF+

電壓轉換公式

V = (ADC_Value / 4096.0) * Vref

假設 Vref = 3.3V,ADC_Value = 2048:則

V = 2048 / 4096 * 3.3 = 1.65V
特性描述
轉換精度12位(0~4095)
架構逐次逼近型(SAR)
控制器個數最多 3 個(ADC1~ADC3)
通道數量最多 18 個(16個外部 + 溫度 + VREF)
模式單次 / 連續 / 掃描 / 注入
對齊方式左對齊 / 右對齊
校準功能支持自動校準
時鐘要求ADCCLK ≤ 14MHz

🧩 第二部分:通道與引腳對應關系(如下圖示)
STM32F10x大容量芯片帶3個ADC控制器

在這里插入圖片描述
其中144腳芯片因為帶PF腳,所以多5個通道,為21個外部通道。小于144腳芯片只有16個外部通道。

【轉換通道結構】
通道類型		最大通道數		特點
規則通道		16 個			正常順序轉換
注入通道		4 個			類似中斷處理,可打斷規則通道
內部通道		2 個			溫度(ch16)、VREF(ch17)
STM32F10x系列芯片ADC通道和引腳對應關系

在這里插入圖片描述

ADC引腳

在這里插入圖片描述

ADC 模塊框圖(ADC 寄存器結構 + 模式)

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

ADC的模塊包含:輸入多路選擇器模擬至數字轉換器(SAR)控制邏輯(觸發、注入/規則選擇)數據寄存器(ADC_DR、JDRx)狀態寄存器(ADC_SR)

📦 核心模塊說明:

模塊功能
多路復用器(MUX)選擇當前要轉換的通道
采樣保持電路暫存輸入電壓,穩定后再轉換
SAR ADC逐次逼近型 ADC,12 位精度
控制器控制轉換模式、觸發方式、通道順序等
數據緩沖存儲轉換結果(ADC_DR)
STM32通道組

規則通道組: 相當正常運行的程序。最多16個通道。
規則通道和它的轉換順序在ADC_SQRx寄存器中選擇,規則組轉換的總數應寫入ADC_SQR1寄存器的 L[3:0] 中。
注入通道組: 相當于中斷。最多4個通道。
注入組和它的轉換順序在ADC_JSQR寄存器中選擇。注入組里轉化的總數應寫入ADC_JSQR寄存器的 L[1:0] 中。

在這里插入圖片描述
STM32F1的ADC的各通道可以單次,連續,掃描或者間斷模式執行。


🧩 第三部分:模式選擇(單次/連續/掃描)
轉換模式:
模式描述
單次轉換(Single)一次啟動 → 一次轉換,手動觸發
連續轉換(Continuous)自動重復轉換,同一通道
掃描模式(Scan)多通道自動輪詢
注入模式(Injected)類似中斷方式,打斷規則組轉換
軟件觸發SWSTART 啟動(程序調用觸發)
外部觸發定時器、外部引腳等外設觸發(EXTSEL)
單次轉化 VS 連續轉換

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

掃描模式

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

ADC中斷

在這里插入圖片描述

ADC時鐘配置
RCC_ADCCLKConfig(RCC_PCLK2_Div6); 

在這里插入圖片描述

不要讓ADC時鐘超過14MHz,否則可能不準。


🧩 第四部分:關鍵寄存器與時序
📌 ADC 核心寄存器說明(簡表)
寄存器作用
ADC_CR1模式選擇,掃描模式使能,EOC中斷
ADC_CR2啟動控制、觸發源、數據對齊、CONT
ADC_SQRx通道順序配置
ADC_SMPRx通道采樣時間配置
ADC_JSQR注入系列寄存器
ADC_DR轉換結果數據寄存器
ADC_JDR注入通道數據寄存器
ADC_SR狀態標志(EOC、AWD等)
ADC_CR1寄存器

在掃描模式下,由ADC_SQRx或者ADC_JSQRx寄存器選中的通道被轉換。如果設置了EOCIE或者JEOCIE,在最后一個通道轉換完畢后才會產生EOC或者JEOC中斷。

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

ADC_CR2寄存器

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

數據對齊方式:
在這里插入圖片描述

ADC_SMPR1寄存器

在這里插入圖片描述

ADC_SMPR2寄存器

在這里插入圖片描述

ADC的采樣時間:
在這里插入圖片描述
最小采樣時間1us(ADC時鐘=14MHz,采樣周期為1.5周期下得到)

采樣時間(Sample Time)選擇:

SMPx 設置值采樣時間(周期)說明
0001.5快速采樣,低精度
111239.5高阻抗信號推薦

總轉換時間 = 采樣周期 + 12.5 周期


ADC 對輸入電壓采樣的時間長度,單位為 ADC 時鐘周期(如 1.5 周期、7.5 周期等)。
采樣時間越長:精度越高、可適配輸入阻抗大的傳感器。

ADC 采樣時間建議:

采樣時間必須根據輸入阻抗、電壓變化速度、ADC 時鐘等參數合理選擇。

采樣周期建議用途
1.5 周期高頻快速采樣,精度低,輸入阻抗需小
71.5 周期推薦默認
239.5 周期輸入阻抗高/慢信號更穩
? 示例:讀取 PA1 電壓值
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
ADC_GPIO_Init(); // PA1 模擬輸入
ADC1_SingleChannel_Init();ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
uint16_t value = ADC_GetConversionValue(ADC1);
float voltage = (value / 4096.0f) * 3.3f;

ADC_SQRx:ADC_SQR1/SQR2/SQR3規則序列寄存器

在這里插入圖片描述

ADC_JSQR注入系列寄存器

在這里插入圖片描述

ADC_DR規則通道數據寄存器

在這里插入圖片描述

ADC_JDR注入通道數據寄存器

在這里插入圖片描述

ADC_SR狀態寄存器

在這里插入圖片描述

配置流程
🧾 1. RCC 時鐘設置

ADC 時鐘不能超 14MHz,推薦如下設置:

RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 72MHz/6 = 12MHz
🧾 2. ADC 初始化結構體
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
🧾 3. 通道配置 + 采樣時間
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5);
通道按 Rank 順序決定轉換順序
采樣時間越長,精度越高,輸入阻抗越能適應
🧾 4. 啟動轉換流程
// 開啟ADC
ADC_Cmd(ADC1, ENABLE);// 校準
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1));// 軟件啟動轉換
ADC_SoftwareStartConvCmd(ADC1, ENABLE);// 等待完成
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));// 讀取結果
uint16_t value = ADC_GetConversionValue(ADC1);

🧩 第五部分:全套庫函數調用方式
常用庫函數
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
void ADC_DeInit(ADC_TypeDef* ADCx)
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);void ADC_ResetCalibration(ADC_TypeDef* ADCx);
FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);
void ADC_StartCalibration(ADC_TypeDef* ADCx);
FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);
函數功能
ADC_Init()初始化結構體配置
ADC_Cmd()啟用 ADC
ADC_ResetCalibration() / StartCalibration()復位校準 / 啟用校準
ADC_SoftwareStartConvCmd()軟件觸發
ADC_RegularChannelConfig()配置通道順序與采樣時間
ADC_SoftwareStartConvCmd()啟動轉換(軟件)
ADC_GetConversionValue()獲取轉換結果(12位)
(右對齊/左對齊)
ADC初始化函數ADC_Init
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
typedef struct
{uint32_t ADC_Mode;//ADC模式:配置ADC_CR1寄存器的位[19:16]  :DUALMODE[3:0]位FunctionalState ADC_ScanConvMode; //是否使用掃描模式。ADC_CR1位8:SCAN位 FunctionalState ADC_ContinuousConvMode; //單次轉換OR連續轉換:ADC_CR2的位1:CONTuint32_t ADC_ExternalTrigConv;  //觸發方式:ADC_CR2的位[19:17] :EXTSEL[2:0]                uint32_t ADC_DataAlign;   //對齊方式:左對齊還是右對齊:ADC_CR2的位11:ALIGN         uint8_t ADC_NbrOfChannel;//規則通道序列長度:ADC_SQR1的位[23:20]: L[3:0]       
}ADC_InitTypeDef;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//獨立模式ADC_InitStructure.ADC_ScanConvMode = DISABLE;	//不開啟掃描 
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//單次轉換模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//觸發軟件 
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC數據右對齊
ADC_InitStructure.ADC_NbrOfChannel = 1;//順序進行規則轉換的ADC通道的數目
ADC_Init(ADC1, &ADC_InitStructure);	
ADC使能函數 ADC_Cmd();
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
ADC_Cmd(ADC1, ENABLE);	//使能指定的ADC1
ADC使能軟件轉換函數 ADC_SoftwareStartConvCmd
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx,FunctionalState NewState);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能ADC1的軟件轉換啟動
ADC 規則通道配置函數ADC_RegularChannelConfig
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 );
ADC 獲取轉換結果函數ADC_GetConversionValue
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
ADC_GetConversionValue(ADC1);//獲取ADC1轉換結果

🧩 第六部分:這是一個完整的 STM32F103 系列 ADC 實驗代碼
🎯 實驗目標

使用 ADC1 的通道1(PA1)
采用 單次轉換模式
軟件觸發轉換,讀取電壓值
將 ADC 值輸出到串口或用作其他邏輯判斷

項目條件:
模擬輸入范圍VREF- ≤ VIN ≤ VREF+(默認 VSSA~VDDA)
分辨率:12 位,轉換結果范圍:0 ~ 4095
輸入引腳:通道 1 → PA1
模式:單次轉換、軟件觸發、右對齊
時鐘要求:ADC 時鐘 ≤ 14MHz,推薦 RCC_ADCCLKConfig(RCC_PCLK2_Div6)
數據讀取方式:輪詢 ADC_SR.EOC 位,或使用中斷(本例使用輪詢)

📦 使用外設:

ADC1
GPIOA(PA1)
RCC(時鐘配置)

#include "stm32f10x.h"// 延時函數(用于測試)
void delay_ms(uint32_t ms)
{SysTick->LOAD = 72000 - 1;SysTick->VAL = 0;SysTick->CTRL = 0x5;while (ms--){while (!(SysTick->CTRL & (1 << 16)));}SysTick->CTRL = 0;
}// UART 打印函數可自行添加// 初始化 PA1 為模擬輸入
void ADC_GPIO_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef gpio;gpio.GPIO_Pin = GPIO_Pin_1;gpio.GPIO_Mode = GPIO_Mode_AIN; // 模擬輸入GPIO_Init(GPIOA, &gpio);
}// 配置 ADC1 通道1
void ADC1_SingleChannel_Init(void)
{// 1. 開啟 ADC1 時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);// 2. 設置 ADC 時鐘分頻(PCLK2/6 = 12MHz)RCC_ADCCLKConfig(RCC_PCLK2_Div6);// 3. 復位 ADC1ADC_DeInit(ADC1);// 4. 初始化 ADC1ADC_InitTypeDef adc;adc.ADC_Mode = ADC_Mode_Independent;               // 獨立模式adc.ADC_ScanConvMode = DISABLE;                    // 禁用掃描adc.ADC_ContinuousConvMode = DISABLE;              // 單次轉換adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 軟件觸發adc.ADC_DataAlign = ADC_DataAlign_Right;           // 右對齊adc.ADC_NbrOfChannel = 1;                          // 僅一個通道ADC_Init(ADC1, &adc);// 5. 使能 ADC1ADC_Cmd(ADC1, ENABLE);// 6. 復位校準ADC_ResetCalibration(ADC1);while (ADC_GetResetCalibrationStatus(ADC1));// 7. 啟動校準ADC_StartCalibration(ADC1);while (ADC_GetCalibrationStatus(ADC1));
}// 讀取 ADC1 通道1 的電壓值(0~4095)
uint16_t ADC1_Read_PA1(void)
{// 1. 配置規則通道:ADC1, 通道1, 第1個轉換,采樣時間 239.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5);// 2. 軟件觸發轉換ADC_SoftwareStartConvCmd(ADC1, ENABLE);// 3. 等待轉換完成(EOC 置位)while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));// 4. 讀取轉換結果return ADC_GetConversionValue(ADC1);
}int main(void)
{SystemInit();ADC_GPIO_Init();ADC1_SingleChannel_Init();uint16_t adc_value;while (1){adc_value = ADC1_Read_PA1(); // 讀取ADC值(0~4095)// 比如輸出到串口,或控制LED亮滅// printf("ADC Value = %d\r\n", adc_value);delay_ms(500);}
}
ADC 寄存器與控制流程(以規則通道為例)(初始化流程圖)

流程(簡化版):

模擬輸入  →  采樣保持電路  →  SAR ADC(12位)  →  數據寄存器(ADC_DR)↑                    |通道選擇器(MUX)    控制邏輯(觸發、掃描、注入)
RCC 配置 ADC 時鐘
↓
GPIO 配置為模擬輸入
↓
ADC_Init() 初始化結構體
↓
ADC 校準(ResetCalibration + StartCalibration)
↓
ADC 配置通道 + 采樣時間
↓
啟動轉換(軟件/外部)
↓
等待 EOC 標志
↓
讀取 ADC_DR 寄存器

總結 ADC 配置過程要點

步驟操作對應函數或寄存器
1設置時鐘分頻RCC_ADCCLKConfig(RCC_PCLK2_Div6)
2初始化 ADCADC_Init()
3開啟 ADCADC_Cmd(ADC1, ENABLE)
4校準 ADCADC_Reset/StartCalibration()
5配置通道ADC_RegularChannelConfig()
6軟件觸發ADC_SoftwareStartConvCmd()
7等待轉換完成ADC_FLAG_EOC
8獲取數據ADC_GetConversionValue()

結果轉換公式:

// 假設參考電壓為 3.3V
float voltage = adc_value * 3.3 / 4096;

實驗完整代碼(標準庫實現)(模塊化)

因為在 Keil 軟件中,函數設計是模塊劃分的(代碼整理):

實驗目的:ADC1的通道1(PA1)進行單次轉化

流程:
① 開啟PA口時鐘和ADC1時鐘,設置PA1為模擬輸入。
GPIO_Init();
APB2PeriphClockCmd();
② 復位ADC1,同時設置ADC1分頻因子。
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
ADC_DeInit(ADC1);
③ 初始化ADC1參數,設置ADC1的工作模式以及規則序列的相關信息。
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
④ 使能ADC并校準。
ADC_Cmd(ADC1, ENABLE);
⑤ 配置規則通道參數:
ADC_RegularChannelConfig();
⑥開啟軟件轉換:ADC_SoftwareStartConvCmd(ADC1);
⑦等待轉換完成,讀取ADC值。
ADC_GetConversionValue(ADC1);

📄 adc.h

#ifndef _ADC_H_
#define _ADC_H_#include "stm32f10x.h"
#include <stdio.h>void MX_ADC_Init(void);uint16_t Get_ADC(ADC_TypeDef* ADCx, uint8_t ADC_Channel);#endif

📄 adc.c

#include "adc.h"void MX_ADC_Init(void)
{//-------------------------------------GPIO Init---------------------------------------//GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_ADC1, ENABLE);GPIO_InitStruct.GPIO_Mode 	= GPIO_Mode_AIN;			//配置為模擬輸入GPIO_InitStruct.GPIO_Pin 		= GPIO_Pin_0;					//配置 0 管腳GPIO_InitStruct.GPIO_Speed 	= GPIO_Speed_50MHz;		//翻轉速度 50MHzGPIO_Init(GPIOC, &GPIO_InitStruct);GPIO_WriteBit(GPIOC, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9, Bit_SET);//-------------------------------------GPIO Init---------------------------------------//RCC_ADCCLKConfig(RCC_PCLK2_Div6);		//設置ADC時鐘 6 分頻ADC_InitTypeDef ADC_InitStruct;ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;										//不使用連續轉換ADC_InitStruct.ADC_DataAlign					= ADC_DataAlign_Right;				//ADC 數據右對齊ADC_InitStruct.ADC_ExternalTrigConv   = ADC_ExternalTrigConv_None;	//轉換由軟件而不是外部觸發啟動ADC_InitStruct.ADC_Mode								=	ADC_Mode_Independent;				//ADC1 和 ADC2 工作在獨立模式ADC_InitStruct.ADC_NbrOfChannel				= 1;													//僅使用了通道10。規定了順序進行規則轉換的 ADC 通道的數目。這個數目的取值范圍是 1 到 16。ADC_InitStruct.ADC_ScanConvMode				=	DISABLE;										//不使用掃描模式ADC_Init( ADC1, &ADC_InitStruct);ADC_Cmd( ADC1, ENABLE );								//使能 ADC1ADC_ResetCalibration( ADC1 );						//重置指定的 ADC 的校準寄存器while(ADC_GetResetCalibrationStatus( ADC1 ) == SET ){};   //等待校準完成 --ADC 重置校準寄存器的新狀態(SET 或者 RESET)ADC_StartCalibration( ADC1 );						//開啟校準while(ADC_GetCalibrationStatus( ADC1 ) == SET){};	//等待校準完成}uint16_t Get_ADC(ADC_TypeDef* ADCx, uint8_t ADC_Channel)
{ADC_RegularChannelConfig( ADCx, ADC_Channel, 1, ADC_SampleTime_239Cycles5);	//配置好ADC的規則通道ADC_SoftwareStartConvCmd( ADCx, ENABLE);	//開啟ADC轉換while(ADC_GetSoftwareStartConvStatus( ADCx ) == SET){};	//等待轉換完成return ADC_GetConversionValue( ADCx );
}

📄 main.c

/********************************************************************************* @file    Project/STM32F10x_StdPeriph_Template/main.c * @author  MCD Application Team* @version V3.5.0* @date    08-April-2011* @brief   Main program body******************************************************************************* @attention** THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.** <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>*******************************************************************************/  /* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "stdio.h"
#include "gpio.h"
#include "systick.h"
#include "exti.h"
#include "usart.h"
#include "string.h"
#include "wdg.h"
#include "tim.h"
#include "pwm.h"
#include "adc.h"int main()
{
//	uint16_t Compare2 = 0;
//	bool Dir = 0;uint32_t ADC1_ts = 0;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中斷使用分組2Systick_Initerupt_Init();MX_EXTI0_Init();MX_USART1_Init(115200);USART1_NVIC_Init(1,1);MX_TIM3_PWM_Init(20000 -1, 72-1);		//周期 xx/msMX_ADC_Init();printf("System Init OK! \r\n");while(1){Get_ADC(ADC1, ADC_Channel_10);if(GetTick() - ADC1_ts > 500){ADC1_ts = GetTick();printf("ADC = %d \r\n", Get_ADC(ADC1, ADC_Channel_10));}}
}/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

在這里插入圖片描述

以上,便是 ADC(模數轉換器)基本原理 的系統性說明,結合 STM32F1 系列 的實現機制 涵蓋 理論、硬件架構、采樣機制及轉換過程 的原理。

以上,歡迎有從事同行業的電子信息工程、互聯網通信、嵌入式開發的朋友共同探討與提問,我可以提供實戰演示或模板庫。希望內容能夠對你產生幫助!

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

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

相關文章

圖神經網絡 gnn 應用到道路網絡拓撲結構與交通碳排放相關性。,拓撲指標量化、時空關聯模型及演化機制分析

針對您提出的“道路網絡拓撲結構與交通碳排放相關框架&#xff0c;以下結合研究目標、數據與方法進行系統性深化設計&#xff0c;重點強化拓撲指標量化、時空關聯模型及演化機制分析&#xff1a;一、核心研究問題深化 靜態關聯&#xff1a;不同拓撲結構&#xff08;方格網/環射…

7.6 優先隊列| dijkstra | hash | rust

lc1337pair存入&#xff0c;lambda sort后取出&#xff0c;最開始想用hash&#xff0c;寫一半感覺寫復雜了class Solution {public:vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {int m mat.size();int n mat[0].size();vector<pair…

最新 HarmonyOS API 20 知識庫 重磅推出

最新 HarmonyOS API 20 知識庫 重磅推出 前言 最近整理下 華為開發者聯盟最新的 API 20的鴻蒙應用開發文檔&#xff0c;這次的API 20 相比較之前的文檔&#xff0c;要多了不少內容&#xff0c;目前整理后是9000千多篇&#xff0c;不容易呀。 如何使用 基于騰訊的知識庫工具 …

uniapp 監聽物理返回按鈕

import {onShow,onHide,onLoad,onReady,onBackPress} from "dcloudio/uni-app"onBackPress((e) > {showLog("返回按鈕觸發")if(e.frombackbutton){//開始干活}})參數說明屬性類型說明fromString觸發返回行為的來源&#xff1a;backbutton——左上角導航…

多線程(2)

多線程&#xff08;2&#xff09; &#x1f534;&#x1f7e0;&#x1f7e1;&#x1f7e2;&#x1f535;&#x1f7e3;&#x1f534;&#x1f534;&#x1f7e0;&#x1f7e1;&#x1f7e2;&#x1f535;&#x1f7e3;&#x1f534;&#x1f534;&#x1f7e0;&#x1f7e1;&am…

網關助力航天噴涂:Devicenet與Modbus TCP的“跨界對話“

在航空航天領域&#xff0c;飛機、航天器的制造過程有著極高的精度與安全性要求。以飛機、航天器表面噴涂作業為例&#xff0c;不僅要進行嚴格的防腐蝕處理&#xff0c;而且對表面光滑度要求極高&#xff0c;這直接關系到飛行器的空氣動力學性能和使用壽命。為確保作業安全與質…

從傳統項目管理到敏捷DevOps:如何轉向使用DevOps看板工具進行工作流管理

在DevOps實踐中&#xff0c;DevOps看板工具成為了開發與運維團隊之間高效協作的關鍵。隨著企業對敏捷開發和持續交付的需求日益增長&#xff0c;DevOps看板工具通過可視化的管理方法&#xff0c;幫助團隊在繁雜的任務中保持高效的工作節奏和清晰的進度跟蹤。 具體而言&#xff…

【leetcode100】下一個排列

1、題目描述 整數數組的一個 排列 就是將其所有成員以序列或線性順序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下這些都可以視作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整數數組的 下一個排列 是指其整數的下一個字典序更大的排列。更正…

Flink-Source算子狀態恢復分析

背景 修改 source 算子 kafka_old_topic 消費任務運行一段時間后&#xff0c;暫停狀態并保留。然后將 uid 和 topic 都改了&#xff0c;消費者 offset 會從 earliest 開始。 // before FlinkKafkaConsumer consumer KafkaConfig.getConsumer("kafka_old_topic");…

IDEA中application.yml配置文件不自動提示解決辦法

今天在自己的電腦上使用IDEA的時候&#xff0c;發現在application配置文件里面輸入配置項的時候沒有提示&#xff0c;網上找了一圈也沒解決&#xff0c;最后自己試出來了。 解決辦法&#xff1a; 鼠標移動到配置文件上&#xff0c;單擊右鍵-重寫文件類型、選擇YAML(捆綁)&#…

Vite 完整功能詳解與 Vue 項目實戰指南

Vite 完整功能詳解與 Vue 項目實戰指南 Vite 是下一代前端開發工具&#xff0c;由 Vue 作者尤雨溪開發&#xff0c;提供極速的開發體驗和高效的生產構建。以下是完整功能解析和實戰示例&#xff1a;一、Vite 核心功能亮點閃電般冷啟動 基于原生 ES 模塊&#xff08;ESM&#xf…

Vue 3 中使用路由參數跳轉時 watch 觸發重復請求問題詳解

&#x1f4d8;Vue 3 中使用路由參數跳轉時 watch 觸發重復請求問題詳解&#x1f516; 收藏 點贊 關注&#xff0c;掌握 Vue 3 路由參數監聽中的隱藏陷阱&#xff0c;避免詳情頁、嵌套路由頁誤觸發重復請求&#xff01;&#x1f9e9; 一、問題背景 在 Vue 3 項目中&#xff0c…

前端 項目更新通知 (plugin-web-update-notification)

項目版本更新迭代時&#xff0c;需提示用戶更新系統&#xff0c;不然早時間不更新對用戶體驗很不好&#xff0c;所以在每次部署后需要提示用戶&#xff0c;刷新靜態資源。推薦插件 plugin-web-update-notification .具體配置 vite.config.js文件中 import { webUpdateNotice …

【力扣(LeetCode)】數據挖掘面試題0002:當面對實時數據流時您如何設計和實現機器學習模型?

文章大綱一、實時數據處理&#xff1a;構建低延遲的數據管道1. 數據接入與緩沖2. 實時清洗與校驗3. 特征標準化與對齊二、模型設計&#xff1a;選擇適配實時場景的模型架構1. 模型選擇原則三、訓練與更新策略&#xff1a;離線與在線協同&#xff0c;應對概念漂移1. 離線-在線協…

TongWeb8.0.9.0.3部署后端應用,前端訪問后端報405(by sy+lqw)

問題描述&#xff1a; 客戶前端部署在nginx上&#xff0c;后端部署在tongweb8上&#xff08;相當于前后端分離&#xff09;&#xff0c;登錄的時候報錯&#xff0c;f12看network&#xff0c;狀態碼405&#xff0c;如下所示&#xff1a;看console&#xff0c;如下所示&#xff1…

mysql互為主從失效,重新同步

一、分別登錄服務器A和服務器B的mysqlmysql -u root -p 123456789二、分別查看數據庫狀態信息,下邊兩項參數有一項為NO就表示同步異常Slave_IO_Running:從服務器&#xff08;Slave&#xff09;中的 I/O 線程的運行狀態Slave_SQL_Running:從服務器上的 SQL 線程是否正在運行mysq…

板凳-------Mysql cookbook學習 (十一--------6)

https://blog.csdn.net/weixin_43236925/article/details/146382981 清晰易懂的 PHP 安裝與配置教程 12.6 查找每組行中含有最大或最小值的行 mysql> set max_price (select max(price) from painting); Query OK, 0 rows affected (0.01 sec)mysql> select artist.name…

ECS由淺入深第四節:ECS 與 Unity 傳統開發模式的結合?混合架構的藝術

ECS由淺入深第一節 ECS由淺入深第二節 ECS由淺入深第三節 ECS由淺入深第四節 ECS由淺入深第五節 盡管 ECS 帶來了顯著的性能和架構優勢&#xff0c;但在實際的 Unity 項目中&#xff0c;完全摒棄 GameObject 和 MonoBehaviour 往往是不現實的。Unity 引擎本身的大部分功能&…

Mac關閉觸控板

打開 “有鼠標或無線觸控板時忽略內建觸控板”選項即可 參考&#xff1a;Mac如何關閉觸控板防止誤觸&#xff1f;內置的設置就可以達成 - Mac天空

Python:Rich 終端富文本與界面樣式工具庫

??? 1、簡述 Rich 是一個強大的 Python 庫,用于在終端中呈現富文本和精美的格式,讓命令行界面(CLI)應用擁有現代、美觀的輸出效果。本文將深入介紹 Rich 的核心功能,并通過一系列實際示例展示其強大能力。 Rich 由 Will McGugan 開發,主要特點包括: 豐富的文本樣式:支…