STM32定时触发ADC3进行采集
时间: 2025-05-28 17:05:09 浏览: 15
### STM32 定时器触发 ADC3 数据采集配置方法
为了实现 STM32 的定时器触发 ADC3 进行数据采集的功能,需要完成以下几个方面的配置:
#### 1. 定时器配置
定时器用于生成周期性的触发信号来启动 ADC 转换。假设使用 TIM3 作为触发源,并将其配置为 1 kHz 触发频率。
- **初始化定时器**
设置自动重装载寄存器(ARR)和预分频器寄存器(PSC),计算公式如下:
\[
f_{\text{TIM}} = \frac{f_{\text{CLK}}}{(\text{PSC} + 1) \times (\text{ARR} + 1)}
\]
假设系统时钟 \( f_{\text{CLK}} = 64 MHz \),目标触发频率为 1 kHz,则有:
\[
PSC = 63,\quad ARR = 999
\]
此外,还需要启用定时器的输出比较功能并选择合适的极性[^1]。
```c
// 初始化 TIM3
void MX_TIM3_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig;
TIM_OC_InitTypeDef sConfigOC;
htim3.Instance = TIM3;
htim3.Init.Prescaler = 63; // 预分频器设置
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 999; // 自动重载值
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&htim3);
sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1REF; // 使用 OC1REF 输出触发
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig);
sConfigOC.OCMode = TIM_OCMODE_TOGGLE; // 切换模式
sConfigOC.Pulse = 0; // PWM 占空比初始值
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;// 极性高有效
HAL_TIM_OC_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
}
```
---
#### 2. ADC 配置
ADC3 应被配置为由外部触发源启动转换。这里以 TIM3 的 TRGO 信号作为触发源。
- **初始化 ADC**
需要指定采样时间、分辨率以及触发方式等参数。以下是具体配置过程:
```c
// 初始化 ADC3
void MX_ADC3_Init(void)
{
ADC_ChannelConfTypeDef sConfig;
hadc3.Instance = ADC3;
hadc3.Init.Resolution = ADC_RESOLUTION_12B; // 分辨率 12bit
hadc3.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 右对齐
hadc3.Init.ScanConvMode = ENABLE; // 扫描模式使能
hadc3.Init.EOCSelection = ADC_EOC_SEQ_CONV; // 结束标志选择序列结束
hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING; // 上升沿触发
hadc3.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T3_TRGO; // 外部触发来自 TIM3 TRGO
hadc3.Init.ContinuousConvMode = DISABLE; // 禁用连续转换模式
hadc3.Init.DMAContinuousRequests = ENABLE; // DMA 请求持续开启
hadc3.Init.NbrOfConversion = 2; // 转换次数
HAL_ADC_Init(&hadc3);
// 配置通道
sConfig.Channel = ADC_CHANNEL_1; // 通道 1
sConfig.Rank = 1; // 排序优先级
sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES; // 采样时间为 2 个周期
HAL_ADC_ConfigChannel(&hadc3, &sConfig);
sConfig.Channel = ADC_CHANNEL_2; // 通道 2
sConfig.Rank = 2; // 排序优先级
HAL_ADC_ConfigChannel(&hadc3, &sConfig);
}
```
---
#### 3. DMA 配置
DMA 是用来传输 ADC 转换后的数据到内存中的工具。它能够减少 CPU 干预从而提高效率。
- **初始化 DMA**
将 DMA 控制器绑定至 ADC3 的数据流路径上,并分配缓冲区地址。
```c
// 初始化 DMA
void MX_DMA_Init(void)
{
hdma_adc3.Instance = DMA1_Channel1;
hdma_adc3.Init.Request = DMA_REQUEST_0;
hdma_adc3.Init.Direction = DMA_PERIPH_TO_MEMORY; // 外设到存储器方向
hdma_adc3.Init.PeriphInc = DMA_PINC_DISABLE; // 不增加外设指针
hdma_adc3.Init.MemInc = DMA_MINC_ENABLE; // 存储器指针自增
hdma_adc3.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; // 对齐半字
hdma_adc3.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; // 对齐半字
hdma_adc3.Init.Mode = DMA_CIRCULAR; // 循环模式
hdma_adc3.Init.Priority = DMA_PRIORITY_HIGH; // 高优先级
HAL_DMA_Init(&hdma_adc3);
__HAL_LINKDMA(&hadc3, DMA_Handle, hdma_adc3); // 绑定 DMA 至 ADC
}
uint16_t buffer[2]; // 缓冲区定义
HAL_ADC_Start_DMA(&hadc3, (uint32_t*)buffer, 2); // 开始 DMA 传输
```
---
#### 4. 中断与回调函数
如果希望进一步处理采集的数据,可以在中断服务程序或者回调函数中操作这些数值。
```c
// ADC 中断回调函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if (hadc->Instance == ADC3) {
float voltage_ch1 = buffer[0] * 3.3 / 4096; // 计算电压 CH1
float voltage_ch2 = buffer[1] * 3.3 / 4096; // 计算电压 CH2
// 在此处加入其他逻辑...
}
}
```
---
### 总结
上述代码展示了如何利用 STM32 的硬件资源——定时器、ADC 和 DMA 来构建一个高效的多通道数据采集系统。通过合理配置各个模块之间的交互关系,最终实现了每秒一次千次采样的需求[^2].
阅读全文
相关推荐


















