登录/注册

STM32F103使用ADC

更多

在STM32F103中使用ADC(模数转换器)的步骤如下,分为配置、校准和读取数据三个主要部分:


1. ADC基本特性


2. 配置步骤

(1) 启用时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  // 启用ADC1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 启用GPIOA时钟(假设使用PA1作为ADC输入)

(2) 配置GPIO为模拟输入

GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;          // 以PA1为例
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;      // 模拟输入模式
GPIO_Init(GPIOA, &GPIO_InitStruct);

(3) 配置ADC参数

ADC_InitTypeDef ADC_InitStruct;
ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;        // 独立模式
ADC_InitStruct.ADC_ScanConvMode = DISABLE;             // 单通道模式(禁用扫描)
ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;       // 单次转换模式
ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 软件触发
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;    // 数据右对齐
ADC_InitStruct.ADC_NbrOfChannel = 1;                   // 1个转换通道
ADC_Init(ADC1, &ADC_InitStruct);

(4) 配置通道和采样时间

ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5); // 通道1(PA1),采样时间55.5周期

(5) 校准ADC

ADC_Cmd(ADC1, ENABLE);                    // 启用ADC
ADC_ResetCalibration(ADC1);               // 复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); // 等待复位完成
ADC_StartCalibration(ADC1);               // 开始校准
while(ADC_GetCalibrationStatus(ADC1));    // 等待校准完成

3. 读取ADC值

(1) 启动转换并读取结果(轮询方式)

ADC_SoftwareStartConvCmd(ADC1, ENABLE);      // 启动转换
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待转换完成
uint16_t adc_value = ADC_GetConversionValue(ADC1); // 获取ADC值

(2) 转换为电压值

float voltage = (adc_value * 3.3f) / 4095;  // 计算实际电压(假设VREF=3.3V)

4. 使用DMA(多通道/连续采样)

如果需要连续采集或多个通道,需配置DMA:

// 启用DMA时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

// 配置DMA
DMA_InitTypeDef DMA_InitStruct;
DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)adc_buffer; // 存储ADC结果的数组
DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStruct.DMA_BufferSize = 100;         // 数据长度
DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStruct.DMA_Mode = DMA_Mode_Circular; // 循环模式
DMA_InitStruct.DMA_Priority = DMA_Priority_High;
DMA_Init(DMA1_Channel1, &DMA_InitStruct);
DMA_Cmd(DMA1_Channel1, ENABLE);

// 启用ADC的DMA
ADC_DMACmd(ADC1, ENABLE);
ADC_ContinuousConvModeCmd(ADC1, ENABLE);    // 连续转换模式
ADC_SoftwareStartConvCmd(ADC1, ENABLE);     // 启动转换

5. 注意事项

  1. 参考电压:确保VREF+和VREF-连接稳定(通常VREF+=3.3V,VREF-=GND)。
  2. 采样时间:高频信号需要更短的采样时间,高阻抗信号需要更长的采样时间。
  3. 噪声抑制:在ADC电源引脚添加0.1μF滤波电容。
  4. 内部通道:使用温度传感器或VREFINT时,需在ADC_RegularChannelConfig中选择ADC_Channel_16ADC_Channel_17

示例代码(单通道轮询)

#include "stm32f10x.h"

int main(void) {
    // 初始化时钟和GPIO
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    // 配置ADC
    ADC_InitTypeDef ADC_InitStruct;
    ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStruct.ADC_ScanConvMode = DISABLE;
    ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStruct.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &ADC_InitStruct);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);
    ADC_Cmd(ADC1, ENABLE);

    // 校准ADC
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));

    while(1) {
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
        uint16_t adc_value = ADC_GetConversionValue(ADC1);
        float voltage = (adc_value * 3.3f) / 4095;
        // 处理电压值...
    }
}

通过以上步骤,您可以快速在STM32F103上实现ADC功能。如需更复杂的配置(如多通道、中断、DMA),请参考STM32标准外设库或HAL库文档。

stm32f302和stm32f103ADC区别是什么?

请问stm32f302和stm32f103的ADC除了stm32f103

2024-05-15 08:03:36

ARM系列STM32F103芯片的解密方法

本文介绍ARM系列STM32F103芯片的解密方法,其内核是Cortex-M3,内存从16K-512K都有。

2024-02-28 11:20:34

学习STM32F103ADC功能

三勺最近在学习STM32F103的ADC功能,居然连最简单的独立模式的单通道的电压采集都不能实现,这就不能忍了,这是对智商的侮辱。

2023-10-24 16:06:03

基于STM32F103的SVPWM算法实现

基于STM32F103的SVPWM算法实现

资料下载 jinyi7016 2022-03-22 12:12:17

GD32F103STM32F103的区别 2021.6.2

GD32F103和STM32F103区别介绍关键词Key words:GD32F103、

资料下载 李杰 2021-12-08 11:06:03

基于STM32f103的输入捕获测频率和占空比

基于STM32f103的输入捕获测频率和占空比

资料下载 shyshyshy 2021-08-02 10:10:24

基于STM32f103的FFT频率测试程序下载

基于STM32f103的FFT频率测试程序下载

资料下载 shyshyshy 2021-08-02 10:07:20

基于STM32f103使用的DAC正弦波

基于STM32f103使用的DAC正弦波

资料下载 shyshyshy 2021-08-02 10:05:00

ARM系列STM32F103芯片的解密方法

破解STM32F103芯片的方法

2023-09-19 09:03:40

ch32v103stm32f103的区别

ch32v103与stm32f103的区别  Ch32v103与STM32f103

2023-08-22 15:49:00

STM32F103 GPIO内部电路图讲解

STM32F103 GPIO内部电路图讲解

2023-02-01 16:32:14

基于STM32F103单片机的矩阵按键设计

本实验使用STM32F103单片机,主题代码通用的。

2022-12-09 17:18:46

采用STM32F103硬件ADC功能进行光照强度采集

光照强度采集ADC方式采集,STM32F103本身自带有硬件ADC功能。将采集到的数据实时刷新到屏幕上即可完成波形显示。

2022-05-31 11:32:52

如何对STM32F103 ADC寄存器进行配置

STM32F103系列有几个ADC?STM32F103系列的ADC主要特

2021-09-27 09:08:10

stm32f030和stm32f103功能差异

stm32f030和stm32f103功能差异主要表现在哪?

2021-07-22 09:35:47

7天热门专题 换一换
相关标签