STM32F103 ADC电压采集
STM32F103C8T6 最小系统开发板驱动ADC电压采集
1. 硬件设计
1.1 最小系统开发板
STM32F103C8T6是基于ARM Cortex-M3内核的微控制器,具有强大的ADC功能。STM32F103C8T6开发板上有多个模拟输入通道,可以用于电压采集。本项目将通过ADC模块采集一个模拟电压信号。
假设使用的是开发板上的一个模拟输入引脚(如PA0)连接到一个模拟电压源,以下是连接方式:
STM32F103C8T6 引脚 | 模拟电压源 引脚 | 描述 |
---|---|---|
PA0 | 电压输入 | 模拟电压源输入 |
1.2 ADC原理
ADC(模数转换器)用于将模拟信号转换为数字信号。在STM32F103C8T6中,ADC的原理如下:
- 采样:ADC首先对输入的模拟信号进行采样,将其转换为一个近似值。
- 转换:然后,ADC通过内部的转换器将该模拟信号转换为数字信号。STM32F103C8T6的ADC通常使用12位分辨率,这意味着输出值的范围为0-4095。
- 通道选择:STM32F103C8T6可以选择多个ADC输入通道。每个通道对应一个特定的输入引脚。
2. 软件设计
2.1 开发环境
- 开发工具:STM32CubeMX、Keil uVision 5
- 下载工具:ST-Link V2(用于将程序烧录到STM32开发板)
- 固件库:STM32Cube HAL库
2.2 STM32CubeMX配置
- 打开STM32CubeMX,选择STM32F103C8T6芯片。
- 配置时钟、GPIO和ADC等外设:
- 配置PA0为模拟输入通道(ADC通道)。
- 配置ADC为独立模式,单次转换,12位分辨率。
- 生成代码并打开Keil uVision 5。
2.3 驱动ADC采集电压的步骤
2.3.1 初始化ADC
首先,初始化ADC外设,设置其为独立模式,分辨率为12位,采样时间设置为适当的值。代码如下:
/* ADC初始化代码 */
ADC_HandleTypeDef hadc1;
void ADC_Init(void)
{
__HAL_RCC_ADC1_CLK_ENABLE(); // 启用ADC时钟
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; // 禁用扫描模式
hadc1.Init.ContinuousConvMode = DISABLE; // 禁用连续转换
hadc1.Init.DiscontinuousConvMode = DISABLE; // 禁用不连续转换
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; // 软件启动转换
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 数据右对齐
hadc1.Init.NbrOfConversion = 1; // 1个转换通道
HAL_ADC_Init(&hadc1); // 初始化ADC
}
2.3.2 配置输入通道
接下来,配置输入通道(如PA0)。这将指定ADC采样的引脚和通道:
/* 配置ADC通道 */
ADC_ChannelConfTypeDef sConfig = {0};
void ADC_Channel_Config(void)
{
sConfig.Channel = ADC_CHANNEL_0; // 选择PA0作为输入通道
sConfig.Rank = ADC_REGULAR_RANK_1; // 排列顺序为1
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; // 设置采样时间
HAL_ADC_ConfigChannel(&hadc1, &sConfig); // 配置ADC通道
}
2.3.3 启动ADC转换并读取结果
启动ADC转换,读取转换结果并转换为电压值。以下是启动ADC和读取结果的代码:
/* 启动ADC转换并获取结果 */
uint32_t ADC_Read(void)
{
HAL_ADC_Start(&hadc1); // 启动ADC转换
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY); // 等待转换完成
uint32_t adcValue = HAL_ADC_GetValue(&hadc1); // 获取ADC转换值
return adcValue;
}
根据采样值和ADC的分辨率(12位),可以计算输入电压。STM32F103C8T6的ADC参考电压通常为3.3V。根据以下公式计算输入电压:
电压 = (ADC值 / 4095) * 3.3
2.3.4 完整程序
以下是完整的ADC电压采集程序:
#include "stm32f1xx_hal.h"
#include "main.h"
ADC_HandleTypeDef hadc1;
void ADC_Init(void);
void ADC_Channel_Config(void);
uint32_t ADC_Read(void);
int main(void)
{
HAL_Init();
ADC_Init();
ADC_Channel_Config();
while (1)
{
uint32_t adcValue = ADC_Read(); // 获取ADC值
float voltage = (adcValue / 4095.0) * 3.3; // 转换为电压
printf("ADC Value: %lu, Voltage: %.2fV\n", adcValue, voltage);
HAL_Delay(1000); // 延时1秒
}
}
3. 下载工具
使用ST-Link V2将程序烧录到STM32F103C8T6开发板。通过ST-Link V2调试接口连接到开发板,并使用Keil uVision 5的下载功能将程序烧录到微控制器中。
4. 结语
本博客介绍了如何使用STM32F103C8T6最小系统开发板和HAL固件库,通过ADC模块进行电压采集。通过详细的硬件连接、ADC原理、软件设计和示例代码,您可以轻松实现电压采集功能。希望本博客对您的项目开发有所帮助。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统