HAL库配置ADC_1_单通道配置

这篇具有很好参考价值的文章主要介绍了HAL库配置ADC_1_单通道配置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、ADC概念

1.ADC特点—以STM32F4x系列为例

💦在使用ADC外设前,先查看下芯片手册,看下ADC的特点。

hal adc,stm32,单片机,stm32

2.ADC引脚介绍—以STM32F4x系列为例

💦ADC的使用,一定是有参考电压的,在使用时要注意,芯片手册上关于ADC参考电压的范围。
通常正参考电压VREF+连接到VCC,负参考电压VREF-连接到GND

hal adc,stm32,单片机,stm32

3.ADC框图简介—以STM32F4x系列为例

💦通过框图可以了解ADC的工作流程。

hal adc,stm32,单片机,stm32

4.ADC参数的简介

  下面是ADC比较常用的参数说明:

💦(1)测量范围:对于 ADC 来说测量范围就好比尺子的量程,需要采集的信号范围,不能超过 ADC 的测量范围(比如,STM32系列的 ADC 正常就不能超过3.3V)。
💦(2)分辨率:假如 ADC 的测量范围为 0-3.3V,分辨率设置为12位,分辨率就是最 > 💦低有效位(LSB)的对应输入电压值,分辨率 =3300/4095 ≈ 0.806mV。12位的2进制数最大可以表示4096,ADC采集就是将模拟信号量化为数字信号的过程,3300/4096就是将3.3V分成4096个份,每份电压为0.000805V。所以,分辨率越高,采集到的信号越精确,因此分辨率是衡量 ADC 的一个重要指标。
💦(3)采样时间:当 ADC 在某时刻采集外部电压信号的时候,此时外部的信号应该保持不变,但实际上外部的信号是不停变化的。所以在 ADC 内部有一个保持电路,保持某一时刻的外部信号,这样 ADC 就可以稳定采集了,保持这个信号的时间就是采样时间。
💦(4)采样率:也就是在一秒的时间内采集多少次。很明显,采样率越高越好,当采样率不够的时候可能会丢失部分信息,所以 ADC 采样率是衡量 ADC 性能的另一个重要指标。

5.采样时间和采样率的说明

💦ADC采样两点间隔的时间一定要大于ADC的采样时间

💦举例说明:
STM32F103一般将时钟配置主频为72M、APB2为72M。ADC挂在APB2时钟总线上,且ADC的时钟不能超过14M。所以一般将ADC的分频设置为6,ADC的时钟主频就为72/6=12MHz。那么一个周期就是:1/12MHz=0.0833us。

💦ADC转换时间 = 采样时间 + 12.5个周期

💦示例:
💦当ADC时钟主频为14MHz并且采样时间为1.5个周期时:采样时间 = 1.5 + 12.5 = 14个周期;一个周期的时间为1/14MHz,一共14个周期,1 / 14MHz * 14个周期 = 1us,
那么此时ADC的采样频率就是1/1us=1000KHz=1MHz,这也是理论上ADC的最大采样频率。

STM32F1系列的时钟主频一般设置为了12M,采样时间的设置所对应采样频率如下图所示:
hal adc,stm32,单片机,stm32

💦从上图可以知道ADC的最小采样时间,当ADC时钟主频为12M并且采样时间为1.5个周期时,ADC采样两点的时间必须大于1.17us。
💦而STM32F031系列的ADC时钟主频为14MHz,采样时间的设置所对应采样频率如下图所示:

hal adc,stm32,单片机,stm32

💦当ADC时钟主频为14M并且采样时间为1.5个周期时,ADC采样两点的时间必须大于1us。

💦举例说明:
💦确定采样率
  (1)如果我们的输入信号是 20KHz (周期为 50us),若要将它恢复出来,一个周期最少采样20个点,此时采样率要达到400KHz(两个点的时间间隔为2.5us),所以ADC的采样率必须在400KHz 以上。为了达到最好的精度,我们选取ADC时钟为12MHz,即6分频。在12MHz 以及保证采样率的情况下,采样时间越长其,准确性就越好。
  (2)可以计算 2.5us = (12.5 + 采样时间)/ 12MHz ,可以求得采样时间为17.5;所以采样时间的选择必须小于等于17.5个周期,才能保证采样率在400KHz 以上。所以我们可以选择1.5、7.5、13.5,为获得更高的精准度,我们可以选择13.5个周期。
切记采样点数必须达到要求。

二、ADC工作模式

💦1. 轮询模式
💦2. 中断模式
💦3. DMA模式

1.轮询模式

HAL库函数如下:

HAL_ADC_Start(ADC_HandleTypeDef* hadc);//轮询模式,需放在循环中不断开启
HAL_ADC_Stop(ADC_HandleTypeDef* hadc);
HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout); //等待转换结束,只适用于轮询,注意配置转换时间

2.中断模式

HAL库函数如下:


HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);//中断模式
HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc);
HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc);//中断

3.DMA模式

HAL库函数如下:

HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);//DMA模式
HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc); 
HAL_ADC_GetValue(ADC_HandleTypeDef* hadc); //读取ADC的值
HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc);//结束后回调
HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc);//转换过程中回调

三、ADC单通道采集-stm32Fx系列为例

1.轮询模式下单通道采集

STM32CubeMX配置
hal adc,stm32,单片机,stm32
💦ADC模式选择
通常选择独立模式,在此模式下,ADC相互独立工作。在ADC_CDR寄存器中配置ADC的模式,详情如下。
hal adc,stm32,单片机,stm32
💦ADC分频
用于设置ADC的工作频率。注意ADC的工作频率不能太高,根据实际情况进行选择。

💦ADC分辨率
hal adc,stm32,单片机,stm32
💦ADC对齐方式
一般选择右对齐方式
💦ADC的扫描模式
扫描模式用于多通道转换,单通道的时候不适用。
hal adc,stm32,单片机,stm32
💦ADC的连续转换模式
在连续转换模式下,ADC 结束一个转换后立即启动一个新的转换。
   在CUBE中选中ENABLE就是连续模式,DISABLE就是单次模式。开启连续模式后,ADC的转换不由其他控制。例如将ADC设置为了定时器的TGRO触发采样,如果开启连续模式,ADC将忽略定时器的触发采样。(连续转换模式开启后其实就是满频率的采样)。
💦ADC的间接转换模式(不连续模式)
通俗来讲_间断模式: 可以将多个通道进行分组采集,例如你开启了CH0~3这4个通道,假如你设置了间断次数为4,就相当于将4个通道分成了4组,每组1个通道,那么要想采集完这4个通道就需要手动触发4次ADC采集;如果设置了间断次数为2,那么采集完4个通道就需要手动触发2次ADC采集
hal adc,stm32,单片机,stm32
💦ADC的DMA
用于开启DMA模式

2.轮询模式-单通道下采集代码示例

单通道-单次采集模式

hal adc,stm32,单片机,stm32

//获得ADC值
//ch: 通道值 0~16,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
//返回值:转换结果
uint16_t Get_Adc(uint32_t ch)   
{
    ADC_ChannelConfTypeDef ADC1_ChanConf;    
    ADC1_ChanConf.Channel=ch;                                   //通道
    ADC1_ChanConf.Rank=1;                                       //第1个序列,序列1
    ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES;        //采样时间
    ADC1_ChanConf.Offset=0;                 
    HAL_ADC_ConfigChannel(&hadc1,&ADC1_ChanConf);        //通道配置
    HAL_ADC_Start(&hadc1);                               //开启ADC	
    HAL_ADC_PollForConversion(&hadc1,10);                //轮询转换 
	return (uint16_t)HAL_ADC_GetValue(&hadc1);	        //返回最近一次ADC1规则组的转换结果
}
//获取指定通道的转换值,取times次,然后平均 
//times:获取次数
//返回值:通道ch的times次转换结果平均值
uint16_t Get_Adc_Average(uint32_t ch,uint8_t times)
{
	uint32_t temp_val=0;
	uint8_t t;
	for(t=0;t<times;t++)
	{
		temp_val+=Get_Adc(ch);
		HAL_Delay(5);
	}
	return temp_val/times;
}

int main(void)
{
  uint16_t adc_temp=0;
    float voltage_temp=0;
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();
  while (1)
  {    
      adc_temp=Get_Adc_Average(ADC_CHANNEL_0,20);
      voltage_temp=(float)adc_temp*(3.3/4096);
      printf("V:%f\n",voltage_temp);
  }
}

输入正弦信号,采集结果如下:
hal adc,stm32,单片机,stm32

轮询模式,要在循环连续采集

单通道-连续采集模式

暂未实现,原因未知

3.中断模式-单通道下采集代码示例

单通道-单次采集模式

产生中断后回进入公共的中断服务函数,完成中断处理,中断服务函数最终会调用ADC转换完成回调函数,所以采集完成后在回调函数中处理。
hal adc,stm32,单片机,stm32
在回调函数中,设置一个状态量,在主函数中对此状态量进行查询,当变量为1时,在进行数据的获取和处理。

uint8_t adc_state=0;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    if(hadc==&hadc1)
    {
     adc_state=1;     
    }
}

下面代码是单次采集模式,转换一次就结束转换,所以要在循环中,开启下一次转换。
所以要在循环中,开启下一次转换。

int main(void)
{
    uint16_t adc_temp=0,adc_cnt=0,temp=0;;
    float voltage_temp=0;
    uint32_t temp_val=0;
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();
   HAL_ADC_Start_IT(&hadc1);
  while (1)
  { 
      extern uint8_t adc_state;
      if(adc_state==1)
      {
         adc_state=0;
          temp=HAL_ADC_GetValue(&hadc1);         
          temp_val+=temp;
          HAL_Delay(1);          
          adc_cnt++; 
          HAL_ADC_Start_IT(&hadc1); //开启下一次转换
            if(adc_cnt>=30)
          {  
              adc_temp=(uint16_t)(temp_val/adc_cnt);
              adc_cnt=0;
              temp_val=0;
              voltage_temp=(float)adc_temp*(3.3/4096);
              printf("V:%f\n",voltage_temp);
          }                          
      }            
  }
}

输入正弦信号,采集结果如下:
hal adc,stm32,单片机,stm32

单通道-连续采集模式

将连续转换模式使能,即可开启连续采集模式。
hal adc,stm32,单片机,stm32
与单次采集的区别是,开始转换函数HAL_ADC_Start_IT(&hadc1),在主函数初始化时,调用一次即可,开启连续转换。

int main(void)
{
    uint16_t adc_temp=0,adc_cnt=0,temp=0;;
    float voltage_temp=0;
    uint32_t temp_val=0;
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();
   HAL_ADC_Start_IT(&hadc1);
  while (1)
  { 
      extern uint8_t adc_state;
      if(adc_state==1)
      {
         adc_state=0;
          temp=HAL_ADC_GetValue(&hadc1);         
          temp_val+=temp;
          HAL_Delay(1);          
          adc_cnt++; 
         // HAL_ADC_Start_IT(&hadc1); //开启下一次转换
            if(adc_cnt>=30)
          {  
              adc_temp=(uint16_t)(temp_val/adc_cnt);
              adc_cnt=0;
              temp_val=0;
              voltage_temp=(float)adc_temp*(3.3/4096);
              printf("V:%f\n",voltage_temp);
          }                          
      }            
  }
}

4.DMA模式-单通道下采集代码示例

单通道-单次采集模式

产生中断后回进入公共的中断服务函数,完成中断处理,中断服务函数最终会调用ADC转换完成回调函数,所以采集完成后在回调函数中处理。
在回调函数中,获取数据,可以在回调函数里将数据进行赋值,处理数据可以在主函数中处理,也可以在回调中处理。

   uint16_t adc_dma_temp=0;
    uint8_t adc_dma_cnt=0;
    uint32_t adc_dma_sum=0;
   float voltage_temp=0;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    if(hadc==&hadc1)
    {       
          adc_dma_sum+=adc_dma_temp;
          HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&adc_dma_temp, 1);//获取数据后,开启下次转换
          adc_dma_cnt++;
          if(adc_dma_cnt>=20)
          {
              adc_dma_temp=(uint16_t)(adc_dma_sum/adc_dma_cnt);
              voltage_temp=(float)adc_dma_temp*(3.3/4096);
              printf("V:%f\n",voltage_temp);
              adc_dma_cnt=0;
              adc_dma_sum=0;             
           }    
    }
}
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  extern uint16_t adc_dma_temp;
  HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&adc_dma_temp, 1);//开启一次,让其进入中断

  while (1)
  {
      HAL_Delay(5);
  }

}

单通道-连续采集模式

暂未成功文章来源地址https://www.toymoban.com/news/detail-765738.html

到了这里,关于HAL库配置ADC_1_单通道配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32入门笔记08_ADC模数转换器+案例: ADC单通道&ADC多通道

    ADC(Analog-Digtal Converter) 模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量, 建立模拟电路到数字电路的桥梁 12位逐次逼近型ADC, 1us转换时间 输入电压范围: 0~3.3V, 转换结果范围: 0~4095 18个输入通道, 可测量16个外部和2个内部信号源 规则组和注入组

    2024年02月04日
    浏览(42)
  • STM32CubeMX教程13 ADC - 单通道转换

    开发板(正点原子stm32f407探索者开发板V2.4) STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 野火DAP仿真器 XCOM V2.6串口助手 1个滑动变阻器 使用STM32CubeMX软件配置STM32F407开发板的 ADC实现单通道ADC采集 ,具体为使用ADC1_IN5通道通过软件/定时器触发采集滑动变阻

    2024年02月02日
    浏览(45)
  • STM32-单通道ADC采集(DMA读取)实验

    关于ADC的一些原理和实验我们已经有了2篇笔记,链接如下: 关于ADC的笔记1_Mr_rustylake的博客-CSDN博客 STM32-ADC单通道采集实验_Mr_rustylake的博客-CSDN博客 实验要求:通过ADC1通道1(PA1)采集电位器的电压,并显示ADC转换的数字量和换算后的电压值。 我们通过下表可以知道DMA1通道

    2024年02月16日
    浏览(43)
  • 【正点原子STM32连载】第三十三章 单通道ADC采集实验 摘自【正点原子】APM32E103最小系统板使用指南

    1)实验平台:正点原子APM32E103最小系统板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban 本章介绍使用APM32E103模数转换器(ADC)进行带通道的电压采集。通过本章的学习,读者将学习到单通

    2024年02月19日
    浏览(48)
  • STM32CubeMX配置STM32G031多通道ADC采集(HAL库开发)

    时钟配置HSI主频配置64M  勾选打开8个通道的ADC  使能连续转换模式  配置好串口,选择异步模式 配置好需要的开发环境并获取代码  修改main.c 串口重定向  串口重定向一定要勾选Use Micro LIB  获取ADC通道值 主函数   串口输出

    2024年02月15日
    浏览(44)
  • STM32CubeMx配置ADC(多通道采集+DMA读取数据)(HAL库开发)

    目录 1、函数配置过程(这是标准库配置过程): 2、STM32CubeMx配置过程  3、main函数源文件 采集5路ADC数据,并用串口printf()函数打印出来。 实验现象:  ADC转换的初始条件: 1、使能 2、触发源条件完成(这个需要自己配置)利用:HAL_ADC_Start_DMA()函数; ADC中HAL开发优势就是,

    2023年04月08日
    浏览(61)
  • STM32CubeMX配置STM32G031多通道ADC + DMA采集(HAL库开发)

     时钟配置HSI主频配置64M  勾选打开8个通道的ADC  使能连续转换模式  添加DMA  DMA模式选择循环模式  使能DMA连续请求 采样时间配置160.5 转换次数为8  配置好8次转换的顺序  配置好串口,选择异步模式 配置好需要的开发环境并获取代码  修改main.c 串口重定向  串口重定向

    2024年02月08日
    浏览(47)
  • STM32CubeMx实现ADC多通道+DMA读取(HAL库)

    目录 一、实验结果  二、STM32CubeMx配置 三、main.c测试代码 1、RCC配置 (外部晶振选择8MHz。设置相应的分频器M=8,倍频器倍频系数N=336,分频器分频系数P=2,那么主PLL生成的第一个输出高速时钟PLLP为:168MHz)  2、SYS配置  3、ADC(规则)通道配置(独立模式,预分频4分频,1

    2024年02月15日
    浏览(44)
  • 实验(六):ADC应用:独立模式单通道采集实验

    实验目的: 1. 学习对ADC基础功能的使用; 2. 掌握KEIL5的仿真与调试。 任务: 1.   根据要求编写程序,并写出原理性注释; 2. 将检查程序运行的结果,分析一下是否正确; 3. 完成所建工程的验证调试。 贴片滑动变阻器的动触点通过连接至STM32 芯片的ADC 通道引脚。当我们使

    2024年02月15日
    浏览(43)
  • STM32基于hal库的adc以DMA的多通道采样以及所遇问题解决

    目录 准备 配置 步骤  总结   正点原子的STM32F103ZET6开发板(精英版) CUBEMX配置软件 KEIL5  右对齐就是正常的数据格式。左对齐除以16后得正常数据。(当输出非常大时考虑是否改了对齐方式,默认都是右对齐)  扫描模式,连续转换模式使能。(多通道下扫描模式自动使能

    2024年02月04日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包