(批量项目实测)STM32CubeMX之多路DMA ADC(包括内部温度与电压检测)

开发环境:

单片机: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、编译下载即可。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值