stm32定时器触发 ADC 采样
时间: 2025-01-09 15:55:15 浏览: 95
STM32定时器触发ADC采样
初始化配置
为了实现STM32定时器触发ADC采样,需先初始化定时器和ADC模块。这里以通用定时器(TIM2)为例来说明具体操作。
// 定义全局变量用于存储ADC转换结果
uint16_t ADC_result[3];
void TIM2_Init(void){
__HAL_RCC_TIM2_CLK_ENABLE(); // 使能TIM2时钟
TIM_HandleTypeDef TimHandle;
TimHandle.Instance = TIM2;
// 配置定时器参数
TimHandle.Init.Prescaler = 79; // 设置预分频值,假设系统时钟为80MHz,则此设定下计数频率为1Mhz
TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
TimHandle.Init.Period = 999; // 自动重装载值设为999,即每秒钟产生一次更新事件
TimHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if(HAL_TIM_Base_Init(&TimHandle) != HAL_OK){
Error_Handler();
}
}
void ADC_Configuration(void){
__HAL_RCC_ADC1_CLK_ENABLE();
ADC_ChannelConfTypeDef sConfig = {0};
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = DISABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T2_TRGO;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
if (HAL_ADC_Init(&hadc1) != HAL_OK){
Error_Handler();
}
/**Configure for the selected channels the group conversions */
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK){
Error_Handler();
}
}
上述代码完成了基本的硬件资源分配以及初步设置[^1]。
启用定时器并关联ADC触发源
接下来,在main()
函数或其他适当位置调用如下语句:
/* 开启DMA请求映射到指定通道 */
__HAL_LINKDMA(&hadc1,DMA_Handle,hdma_adc1);
/* 将定时器产生的TRGO信号作为ADC外触发源 */
__HAL_TIM_SET_OUTPUT_COMPARE_MODE(&htim2,TIM_CHANNEL_2,TIM_OCMODE_PWM1);
__HAL_TIM_GENERATE_EVENT(&htim2,TIM_FLAG_UPDATE);
if(HAL_TIM_OC_Start_IT(&htim2,TIM_CHANNEL_2)!= HAL_OK){
/* 启动失败处理 */
Error_Handler();
}
/* 开始ADC校准 */
if(HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK){
/* 校准失败处理 */
Error_Handler();
}
/* 开始常规组中的单元转换 */
if(HAL_ADC_Start_DMA(&hadc1,(uint32_t*)ADC_result,3) != HAL_OK){
/* 转换启动失败处理 */
Error_Handler();
}
这段程序片段实现了将定时器输出比较功能与ADC外部触发相连接,并开启了相应的中断服务例程以便于后续的数据读取和处理工作[^3]。
中断回调函数定义
最后一步是在ADC完成一组完整的数据采集之后执行特定的任务逻辑,比如计算实际测量得到的物理量大小等。
float adc_voltage[3];
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){
if(hadc->Instance == ADC1){
for(uint8_t i=0;i<3;i++){
if(ADC_result[i]>=2048)
ADC_result[i]-=2048;
else
ADC_result[i]=2048-ADC_result[i];
adc_voltage[i]=(float)(ADC_result[i])*3.3f/(4096.0f)/0.02f;
}
// 进行其他必要的数值运算或状态判断...
}
}
以上便是利用STM32定时器触发ADC进行连续采样的完整流程介绍及其对应的软件框架设计思路[^2]。
相关推荐
















