开发环境:
单片机:STM32F103VET6
STM32CubeMX版本:6.6.1
Keil版本:V5.27
1、新建基础工程
(请查看(批量项目实测)STM32CubeMX之新建基础工程_执懿的博客-CSDN博客)
2、设置ADC普通采集通道
3、 设置DMA
4、使能中断
5、设置Rank
6、adc_app.h
#include "stm32f1xx_hal.h"
/ ADC 5· DMA
#define ADC_CHANNEL_NUMBER 5
#define ADC_SAMPLE_SIZE 5000
#pragma pack(1)
typedef struct
{
uint32_t DMA_ADC_Count;
uint32_t ADC_ConvertedValue[ADC_CHANNEL_NUMBER];
uint32_t ADC_Average[ADC_CHANNEL_NUMBER];
uint64_t ADCSUM[ADC_CHANNEL_NUMBER];
float ADCV[ADC_CHANNEL_NUMBER];
}adc_TypeDef;
#pragma pack()
extern adc_TypeDef adc;
7、adc_app.c
#include "adc_app.h"
adc_TypeDef adc;
8、main中adc使能
//ADC使能
HAL_ADCEx_Calibration_Start(&hadc1);//函数作用为进行adc的自校准,消除每个电容上的误差,用在adc_start之前。
HAL_ADC_Start_DMA(&hadc1,adc.ADC_ConvertedValue,5);
9、添加adc回调函数,需要的采集的值详见注释
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
for(uint8_t z=0;z<ADC_CHANNEL_NUMBER;z++)
adc.ADCSUM[z] += adc.ADC_ConvertedValue[z];
adc.DMA_ADC_Count++;
if(adc.DMA_ADC_Count>=ADC_SAMPLE_SIZE)
{
adc.DMA_ADC_Count=0;
for(uint8_t z=0;z<ADC_CHANNEL_NUMBER;z++)
{
adc.ADC_Average[z]=adc.ADCSUM[z]/ADC_SAMPLE_SIZE;
adc.ADCSUM[z] = 0;
}
//adc.ADC_Average[0]--读取到IN12 的0~4095的值 需要电压值=adc.ADC_Average[0]*3.3/4096
//adc.ADC_Average[1]--读取到IN13 的0~4095的值 需要电压值=adc.ADC_Average[1]*3.3/4096
//adc.ADC_Average[2]--读取到IN14 的0~4095的值 需要电压值=adc.ADC_Average[2]*3.3/4096
float cpu_temperate = (1.43-(float)adc.ADC_Average[3]*(3.3/4096))/0.0043+25; //转换为内部温度值
float cpu_v = (float)adc.ADC_Average[4]*(3.3/4096); //转换为内部温度值
}
}
10、编译下载即可。