STM32 HAL库学习(三)ADC采样以及printf的使用

ADC输出的电压值经转换后一般为一个浮点数,要将其打印到串口则需要对串口输出函数做一个调整。

首先是printf函数的重定向,将一下代码加入到usart.c中,完成后便可以用printf函数输出字符串到串口中,而要输出浮点数,则还需在“项目/建立设置/C Linker/Miscellaneous/Other options”中添加“-u _printf_float”

#include <stdio.h>
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
PUTCHAR_PROTOTYPE
{
	HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,HAL_MAX_DELAY);
	return ch;
}
#endif
int _write(int file,char*ptr,int len)
{
	int Dataldx;
	for(Dataldx = 0;Dataldx < len;Dataldx++)
	{
		__io_putchar(*ptr++);
	}
	return len;
}

接下来是配置ADC采样,ADC采样可以配置为单通道、多通道,连续、非连续等采样模式,传输获取采样值的方式也有查询获取、中断获取以及DMA获取等方式,都有提供相应的HAL库函数。

STM32F070的ADC时钟来源主要有两种方式:

  • 直接来源于HSI 14MHZ,也是可配置的最大时钟频率,对应在CubeMX中的Clock Prescaler配置为Asynchronous clock mode
  • 来源于APB时钟的2分频或者4分频(但最大都不能超过14MHZ)

获取ADC采样值的方式

1、查询方式获取ADC采样值

  查询方式主要用到的函数是HAL_ADC_Start()、HAL_ADC_PollForConversion()以及HAL_ADC_GetValue(),其中,HAL_ADC_Start是软件开始ADC转换,PollForConversion则等待ADC转换完成,当转换完成后,既可在主函数中调用HAL_ADC_GetValue获取采样值,进行相应的转换和输出。

uint32_t value = 0;
float vol = 0;
while(1)
{
   /*USER CODE BEGIN WHILE*/
   HAL_ADC_Start(&hadc);
   HAL_ADC_PollForConversion(&hadc,HAL_DELAY_MAX);
   value = HAL_ADC_GetValue(&hadc);
   vol = (float)(value *3.3/4096);
   printf("%.2f",vol);
   HAL_Delay(1000);
   /*USER CODE END WHILE*/
}

2、DMA中断方式 

当ADC采样方式配置为连续采样时,可以借助DMA对采样值进行存储,当DMA传输完成时产生中断,再在中断函数中对采样到的数据进行处理。具体步骤是:在CubeMX中配置DMA Request为ADC,对应的选择通道DMA1 Channel1,数据宽度选择word(因为ADC采样值类型为uint32_t),generate code。在main函数中调用HAL_ADC_Start_DMA(),配置DMA数据存储的位置以及传输的数据个数。假设设置数据个数为100,则当ADC采样并转换100个数据后,DMA这边接收到100个数据后则会产生DMA中断。而当DMA中断产生时,HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma)先是判断是传输一半数据中断标志还是传输完成中断标志,再根据绑定的句柄调用相应的回调函数。而当选择ADC DMA传输时,DMA传输完成后其回调函数会调用 HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc),因此只需重写该函数进行数据处理即可。(对于这一点,查看DMA_IRQHandler可以发现其根据句柄调用相应的回调函数。但是目前我还没找到在哪里调用了HAL_ADC_ConvCpltCallback........存疑)

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
   uint32_t value = 0;
   float vol = 0;
   value = ADC_Data[0];
   vol = (float)(3.3*value);
   vol = (float)vol/4096;
   printf("%.3f",vol);
   printf("\r\n");
}

猜你喜欢

转载自blog.csdn.net/yhl_sophia/article/details/83744666