基于stm32+HAL库的ADC电压采集实验

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

实验目的,使用stm32的adc采集stm32开发板的3v3、GND电压,验证adc采集功能。


废话必说

只会用if的大神提醒您,敌军还有30秒到达战场,碾碎他们!白银局不要怕!

一、准备工作

软件:keil5、stm32cubemx、串口调试助手

硬件:stm32f103系列的开发板、杜邦线*1、串口工具

仅此而已!!!正好6神

二、配置步骤

1、cubemx配置端口生成代码(就像我们打游戏设置一样这里不过多解释了!)

1、打开cubemx 选择完你用的芯片就到了这里啦这里我以stm32c8t6为例:

    选择serial wire模式

 2、时钟配置(这里先不配置参数,因为选完adc通道还需要配置)

 3、当然需要万能的串口打印啦(用于我们调试完查看实验结果的功能)选择异步通讯,其他参数默认即可;

 4、重头戏来啦!这就是我们用的外设接口啦这里我们选择ADC1、通道1其他参数默认即可;

 5、前面讲到因为又adc的加入时钟频率我们最后配置成72mhz,adc就自动分频了。

 6、上面已经配置完成了所有初始化需要的文件那么现在我们写个英文的工程名称、选择开发环境mdk也就是我们用的keil啦!

 7、让生成的代码中包含。.c、.h文件然后生成代码! 点open project自动打开keil

2.添加代码

1.首先main.c中添加获取函数

  while (1)
  {  
		
	  adc_get_vcc();
      delay_ms(1000);//可以换成HAL_Delay
	 
  } 

2.adc.c中添加包含头文件和变量以及函数

#include "stdio.h"           //  添加头文件用于打印
	
	float adcy;              //定义变量
	uint16_t adcx=0;
/* 
   函数定义:获取实际电压

   返回值:无
*/
uint32_t adc_get_vcc(void)
 {
	 adcx =  adc_get();              //获取到ad转换后的数字量
	 printf("数字量:%d",adcx );        //打印出数字量
	 adcy = (float)adcx*3.3/4096;    //将数字量转化成实际电压
	 printf("实际电压:%f",adcy );
	 delay_ms(100);                  //可以换成HAL_Delay(100);	 
 }

/* 
   函数定义:获取adc转换完成后的数据

   返回值:uint32_t型的模拟数值
*/
uint32_t adc_get(void){

    HAL_ADC_Start(&hadc1);                        //启动adc
  	HAL_ADC_PollForConversion(&hadc1,10);         //等待adc转换完成
   	return ((uint16_t)HAL_ADC_GetValue(&hadc1));  //返回ad转化后的数字量
	
}

 3.adc.h添加函数声明

void adc_get_vcc(void);
uint32_t adc_get(void);

4.urat.c里面包含头文件和重写打印函数

#include "stdio.h"

int fputc(int ch, FILE *f) {
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
	return ch;
}

 3、烧录并查看结果

烧录要提一嘴的是:需要勾选USE MICROLIB!不然串口会不打印!

查看实验结果:

实验条件条件1:杜邦线将引脚PA1接GND,实验结果:实际电压0.000000。

 

实验条件条件2:杜邦线将引脚PA1接3v3, 实验结果:实际电压3.2……v左右。

结论:实验结果显然符合实验目的。


 

总结

本文主要简单讲解了ADC的配置步骤当然,ADC也可以通过中断方式、DMA模式传输。这里没有做更多的说明,后面在陆续出文章。我深知这些虽然很简单但当初也是这么一步步艰难走来的所以不要放弃、一点点学。

物联沃分享整理
物联沃-IOTWORD物联网 » 基于stm32+HAL库的ADC电压采集实验

发表评论