突然想起自己接触ADC采样比较之少,这里记录一下怎么配置使用AD采样
用的stm32cubemx 加HAL库
文章提供测试代码、截图、工程下载

目录
RCC时钟配置:
一般c8t6最小系统板都有一个8Mhz的外部晶振,这里就给他把频率拉满:


ADC配置:
这里配置ADC1 通道IN1 对应引脚PA1

测试应用程序:
ADC中断最好不要写什么函数,就基础的数据搬运就行了:
#include "adc.h" #include "stdio.h" ADC_HandleTypeDef hadc1; // 配置 #define ADC_SAMPLE_COUNT_MAX 200 // 最大缓存 #define SEND_INTERVAL 100 // 00ms 发一次 // 全局变量 uint32_t adc_buf[ADC_SAMPLE_COUNT_MAX]; uint32_t adc_cnt = 0; // 实际采了多少个(重点!) uint32_t adc_avg_val = 0; uint32_t last_time = 0; // ========================= ADC 中断回调 ========================= void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { if(hadc->Instance == ADC1) { // 只在【没满】的时候存数据 if(adc_cnt < ADC_SAMPLE_COUNT_MAX) { adc_buf[adc_cnt] = HAL_ADC_GetValue(&hadc1); adc_cnt++; // 实际采样数 +1 } HAL_ADC_Start_IT(&hadc1); } } void ADC_Task_(void) { if(HAL_GetTick() - last_time >= SEND_INTERVAL) { last_time = HAL_GetTick(); if(adc_cnt > 0) // 必须有数据才计算,防止除0 { uint32_t sum = 0; for(uint8_t i=0; i<adc_cnt; i++) { sum += adc_buf[i]; } adc_avg_val = sum / adc_cnt; } // 打印 printf_uart1("100ms 采样数量:%d,平均值:%d\r\n", adc_cnt, adc_avg_val); // 清空计数,准备下一轮采集 adc_cnt = 0; } }
测试结果:
转动电位器可以提供串口1 打印每100ms采样最大200点的平均值
