stm32adc采样正弦波电压
时间: 2025-05-18 14:35:51 浏览: 41
### STM32 ADC 采样正弦波电压的实现方法
STM32 的 ADC 功能可以用于采集外部输入信号,例如正弦波电压。通过合理配置 ADC 和 DMA 模块,可以高效地完成数据采集并绘制波形图。以下是具体的实现方法以及示例代码。
#### 配置要点
1. **ADC 初始化**: 设置 ADC 分辨率为 12 位,并启用连续转换模式。
2. **DMA 配置**: 使用 DMA 将 ADC 转换后的数据自动存储到内存缓冲区中,减少 CPU 占用率。
3. **定时器触发 (可选)**: 如果需要固定采样率,可以通过 TIMx 定时器触发 ADC 转换来控制采样间隔。
4. **采样速率**: 根据目标信号频率设置合适的 ADC 工作时钟和采样时间[^3]。
#### 示例代码
以下是一个基于 HAL 库的 STM32F103ZET6 平台上的 ADC 数据采集程序:
```c
#include "stm32f1xx_hal.h"
// 全局变量定义
uint16_t adc_buffer[1024]; // 存储 ADC 值的数组
TIM_HandleTypeDef htim2; // 定时器句柄
ADC_HandleTypeDef hadc1; // ADC 句柄
DMA_HandleTypeDef hdma_adc1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_ADC1_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init(); // 初始化 DMA
MX_ADC1_Init(); // 初始化 ADC
// 启动 ADC 连续转换模式
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, 1024);
while (1)
{
// 主循环中可以处理其他任务
}
}
/**
* @brief ADC1 Initialization Function
*/
static void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = DISABLE; // 禁用扫描模式
hadc1.Init.ContinuousConvMode = ENABLE; // 开启连续转换模式
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; // 软件启动
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 数据右对齐
hadc1.Init.NbrOfConversion = 1; // 转换通道数为 1
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
sConfig.Channel = ADC_CHANNEL_0; // 配置通道 0
sConfig.Rank = 1; // 排序等级为 1
sConfig.SamplingTime = ADC_SAMPLETIME_7CYCLES5;// 采样时间为 7.5 个周期
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief DMA Initialization Function
*/
static void MX_DMA_Init(void)
{
__HAL_RCC_DMA1_CLK_ENABLE();
hdma_adc1.Instance = DMA1_Channel1;
hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY; // 外设到内存传输
hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE; // 不增加外设地址
hdma_adc1.Init.MemInc = DMA_MINC_ENABLE; // 增加内存地址
hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; // 半字节对齐
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; // 半字节对齐
hdma_adc1.Init.Mode = DMA_CIRCULAR; // 循环模式
hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH; // 高优先级
if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(&hadc1, DMA_Handle, hdma_adc1); // 关联 ADC 和 DMA
}
```
上述代码实现了如下功能:
- 利用 `HAL_ADC_Start_DMA` 函数开启 DMA 自动采集模式。
- 配置了 ADC 的工作参数,包括分辨率、采样时间和通道选择。
- 使用 DMA 提高效率,避免频繁中断操作。
#### 注意事项
1. **采样率调整**: 若需提高采样率,则应适当降低 ADC 的采样时间或提升系统时钟频率。
2. **抗混叠滤波**: 对于高频信号,建议在外围电路加入低通滤波器以防止混叠效应[^1]。
3. **FFT 计算**: 若要进一步分析正弦波失真情况,可通过 DSP 库执行 FFT 变换获得频域特征[^2]。
---
###
阅读全文
相关推荐


















