這篇文章是嵌入式中我通過大量資料 整合成了一份 系統完整、層次清晰的 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_JSQ | R注入系列寄存器 |
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 設置值 | 采樣時間(周期) | 說明 |
---|---|---|
000 | 1.5 | 快速采樣,低精度 |
111 | 239.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 | 初始化 ADC | ADC_Init() |
3 | 開啟 ADC | ADC_Cmd(ADC1, ENABLE) |
4 | 校準 ADC | ADC_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>© 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 系列 的實現機制 涵蓋 理論、硬件架構、采樣機制及轉換過程 的原理。
以上,歡迎有從事同行業的電子信息工程、互聯網通信、嵌入式開發的朋友共同探討與提問,我可以提供實戰演示或模板庫。希望內容能夠對你產生幫助!