续ADC+DAM实验

四,续前章

点击这里链接前章

五,ADC温度采集

STM32Cubemx配置

温度计算公式及参数

核心代码:

/*-----------------------------------相关变量-------------------------------------------*/

uint16_t TS_CAL1;
uint16_t TS_CAL2;
float McuTemp=0;

/*-----------------------------------相关函数-------------------------------------------*/

/*
函数名 :MyAdcInit
作用 :进行ADC校准
参数 :无
返回值 :无
*/
void MyAdcInit(void)
{
	HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
}


/*
函数名 :AdcGetValue
作用 :获得芯片内部温度
参数 :无
返回值 :无
*/
void AdcGetValue(void)
{
	HAL_ADC_Start(&hadc1);
	HAL_ADC_PollForConversion(&hadc1,10);	
	McuTemp= HAL_ADC_GetValue(&hadc1);
	TS_CAL1=*(__IO uint16_t *)(0x1FFF75A8);
	TS_CAL2=*(__IO uint16_t *)(0x1FFF75CA);
    //温度结果
	McuTemp= ((110.0f - 30.0f) / (TS_CAL2 - TS_CAL1)) * (McuTemp- TS_CAL1) + 30.0f;
}

 六,软件实现单通道DMA过采样12位变16位

STM32Cubemx配置

 核心代码:

​
/*-----------------------------------------相关变量------------------------------------*/

//单通道DMA模式一定要开启ADC连续转换模式
#define ADC_OVERSAMPLE_TIMES    256  
#define AVERAGE_TIMES           10
#define BUF_SIZE                ADC_OVERSAMPLE_TIMES * AVERAGE_TIMES
uint16_t buf[BUF_SIZE]={0};
uint32_t Value=0;
float endValue=0;

/*-----------------------------------------相关函数------------------------------------*/

/*
函数名 :AdcToDmaGetValue
作用 :得到分辨率为16的电压值
参数 :无
返回值 :测得的电压值
*/
float AdcToDmaGetValue(void)
{
	HAL_ADC_Start_DMA(&hadc1,(uint32_t*)buf,BUF_SIZE);
	while(__HAL_DMA_GET_FLAG(&hdma_adc1,DMA_FLAG_TC1))
	{
		__HAL_DMA_CLEAR_FLAG(&hdma_adc1,DMA_FLAG_TC1);
		HAL_ADC_Stop_DMA(&hadc1);
	}
	for(int i=0;i<BUF_SIZE;++i)
	{
		Value+=buf[i];
	}
	Value/=AVERAGE_TIMES;
	Value>>=4;
	endValue=(float)Value*(3.3f/65536.0f);
	return endValue;
}


/*
函数名 :myAdcToDmaInit
作用 :进行ADC校准
参数 :无
返回值 :无
*/
void myAdcToDmaInit(void)
{
	HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
}

​

七,硬件实现单通道DMA过采样12位变16位

STM32Cubemx配置

核心代码:

/*------------------------------------------相关变量---------------------------------*/

#define bufSize   100
uint16_t buf[bufSize]={0};
uint32_t Value=0;
float endValue=0;

/*------------------------------------------相关函数---------------------------------*/

/*
函数名 :AdcToDmaGetValue
作用 :得到16位分辨率的电压值
参数 :无
返回值 :电压值
*/
float AdcToDmaGetValue(void)
{
	HAL_ADC_Start_DMA(&hadc1,(uint32_t*)buf,bufSize);
	while(__HAL_DMA_GET_FLAG(&hdma_adc1,DMA_FLAG_TC1))
	{
		__HAL_DMA_CLEAR_FLAG(&hdma_adc1,DMA_FLAG_TC1);
		HAL_ADC_Stop_DMA(&hadc1);
	}
	for(int i=0;i<bufSize;++i)
	{
		Value+=buf[i];
	}
	Value/=bufSize;
	endValue=(float)Value*(3.3f/65536.0f);
	return endValue;
}


/*
函数名 :myAdcToDmaInit
作用 :进行ADC校准
参数 :无
返回值 :无
*/
void myAdcToDmaInit(void)
{
	HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
}

八,UART的发送DMA实验实现我的printf()函数

STM32Cubemx配置  

 核心代码:

​
/*------------------------------------相关头文件---------------------------------------*/

/*记得开usart的中断,不然__HAL_DMA_GET_FLAG无法正常使用*/
#include "stdio.h"
#include "string.h"
#include "stdarg.h"

/*------------------------------------相关函数---------------------------------------*/

/*
函数名 :MyPrintf
作用 :实现像使用ptintf()函数一样使用usart的发送
参数 :可格式化的字符串
返回值 :字符串长度
*/
int MyPrintf(const char *format,...)
{
  va_list arg;
  static char SendBuff[200] = {0};
  int rv;
  va_start(arg,format);
  rv = vsnprintf((char*)SendBuff,sizeof(SendBuff)+1,(char*)format,arg);
  va_end(arg);
  HAL_UART_Transmit_DMA(&huart1,(uint8_t *)SendBuff,rv);
  while(__HAL_DMA_GET_FLAG(&hdma_usart1_tx,DMA_FLAG_TC1))
  {
     __HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx,DMA_FLAG_TC1);
     HAL_UART_DMAStop(&huart1);
  }
  return rv;
}

​

九,结语

创做不易,一键三连!!!!!!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值