问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

基于STM32 CubeMX配置ADC的详细教程

创作时间:
作者:
@小白创作中心

基于STM32 CubeMX配置ADC的详细教程

引用
1
来源
1.
https://www.cnblogs.com/siyun/p/14835662.html

本文将详细介绍如何使用STM32 CubeMX配置ADC,包括时钟配置、ADC配置、DMA配置以及定时器配置等内容。通过本文,读者将能够掌握如何使用STM32F103C8芯片进行ADC配置,实现对0-3.3V电压信号的循环接收和处理。

目标与材料

目标:循环接收一路0-3.3V电压信号,使用独立模式,使用DMA搬运至寄存器,采集触发使用TIM3定时器。

材料:STM32F103C8

STM32 ADC简介

STM32的 ADC是 12位模拟数字转换器。STM32的 ADC最大的转换速率为 1Mhz,也就是转换时间为 1us(在 ADCCLK=14M,采样周期为 1.5个 ADC时钟下得到),不要让 ADC的时钟超过 14M,否则将导致结果准确度下降。STM32将 ADC的转换分为 2个通道组:规则通道组和注入通道组。规则通道相当于正常运行的程序,而注入通道相当于中断。在程序正常执行的时候,中断是可以打断正常程序进行执行。同这个类似,注入通道的转换可以打断规则通道的转换,在注入通道被转换完成之后,规则通道才得以继续转换。

时钟配置

对应STM32F103 ADC时钟不能超过12MHZ那么采样时间和转换时间怎么计算呢?如果采样时间设定为1.5个周期,ADC时钟的预分频设置为6,那么采样时间计算如下:

APB2/4=ADC Clocks
ADC Clocks/6=Fs
Fs=采样频率
72/6=12MHZ

采样周期设置为1.5时,另外因为采样到值以后进行转换需要12.5周期,那么实际转换时间为:

12MHZ /1.5 /12.5 = 640KHZ

频率换算周期等于1的倒数:

1s/640KHZ=1000 000us /640 000HZ =1.5625us

实际采样转换时间为1.5625us

配置ADC

对应上图配置如下:

ADCs_Common_Settings

  • Mode: 设置ADC 工作模式(独立模式或多重模式)
  • 独立模式
  • <1> Independent mode:ADC1 和ADC2 工作在独立模式
  • 双重模式
  • <2> Dual regular simultaneous + injected simultaneous mode:ADC1 和ADC2 工作在同步规则模式和同步注入模式
  • <3> regular regular simultaneous + alternate trigger mode:ADC1 和ADC2 工作在同步规则模式和交替触发模式
  • <4> Dual injected simultaneous mode only:ADC1 和ADC2 工作在同步注入模式
  • <5> Dual regular simultaneous mode only:ADC1 和ADC2 工作在同步规则模式
  • <6> Dual interleaved mode only:ADC1 和ADC2 工作在交叉模式
  • <7> Dual alternate trigger mode only:ADC1 和ADC2 工作在交替触发模式
  • 三重模式
  • <8> Triple combined regular simultaneous + injected simultaneous mode:工作在同步规则模式和同步注入模式
  • <9> Triple combined regular simultaneous + alternate trigger mode:工作在同步规则模式和交替触发模式
  • <10> Triple injected simultaneous mode only:ADC1 和ADC2 工作在同步注入模式
  • <11> Triple regular simultaneous mode only:ADC1 和ADC2 工作在同步规则模式
  • <12> Triple interleaved mode only:ADC1 和ADC2 工作在交叉模式
  • <13> Triple alternate trigger mode only:ADC1 和ADC2 工作在交替触发模式
  • DMA Access Mode:(DMA)直接存储器存取访问模式(在多重模式下才有此项)
  • Delay between 2 sampling phases:2个抽样阶段的延迟(在多重模式下才有此项)

ADCs_Settings

  • <1> Clock Prescaler:ADC的时钟分频数
  • <2> Resolution:分辨率(意思是AD位数)
  • <3> Data Alignment:ADC 数据向左边对齐还是向右边对齐
  • <4> Scan Conversion Mode:ADC工作在扫描模式(多通道)还是单次(单通道)模式。可以设置这个参数为ENABLE 或者DISABLE。
  • <5> Continuous Conversion Mode:ADC模数转换工作在连续模式。可以设置这个参数为 ENABLE或者DISABLE。
  • <6> Discontinuous Conversion Mode:ADC模数转换工作在不连续模式(单次模式)。可以设置这个参数为 ENABLE或者DISABLE。
  • <7> DMA Continuous Requests:DMA连续请求
  • <8> End of Conversion Selection:转换选择结束

ADCs_Regular_ConversionMode(规则通道转换模式)

  • <1> Enable Regular Conversions:启用定期转换 ENABLE或者DISABLE
  • <2> Number of Conversion:ADC转换的通道数量 1
  • <3> External Trigger Conversion Source:ADC外部触发转换源 TIM3 更新事件
  • <4> External Trigger Conversion Edge:ADC外部触发转换边沿(意思是上升沿/下降沿触发)

Rank

  • <1> Channel:ADC转换通道1
  • <2> Sampling Time:ADC转换时间 1.5cyces

ADC_Injected_ConversionMode(注入通道转换模式)

  • <1> Number of Conversion:ADC转换的注入通道数
  • 注入通道数不为0时,才有下面的配置项
  • <2> External Trigger Source:ADC外部触发转换源
  • <3> External Trigger Edge:ADC外部触发转换边沿(意思是上升沿/下降沿触发)
  • <4> Injected Conversion Mode:ADC注入转换通道模式

Rank(ADC_Injected_ConversionMode的(Number of Conversion)ADC转换的注入通道数不为0时,才能配置注入通道的其他参数)

  • <1> Channel:ADC转换通道
  • <2> Sampling Time:ADC转换时间
  • <3> Injected Offset:ADC注入通道的偏值

WatchDog

  • <1> Enable Analog WatchDog Mode

以上蓝字为默认配置,红色在STM32 CuebeMX选择相关选项。

ACD的DMA配置

选择循环采集,地址不偏移,寄存器移位偏移。一个字节大小。

配置TIM3 ADC触发转换定时器

配置好ADC后还需要给ADC一个触发事件信号,这里通过定时器的上升沿触发转换,配置开启更新事件,相关分频设置转换速度为10KHZ,配置如下。

至此ADC的单通道独立默认就配置好了,生成工程代码。

使用

创建一个数组用于存储ADC数据

/* USER CODE BEGIN 0 */
#define NPT 256 //样本数量
uint32_t adc_buf[NPT]={0}; //用于存储ADC转换结果的数组
/* USER CODE END 0 */

使能定时器触发转换,并用串口打印

/* USER CODE BEGIN 2 */
HAL_ADC_Start_DMA(&hadc1, adc_buf, NPT); /*启动ADC的DMA传输,配合定时器触发ADC转换 12位的ADC对应0-4095 */
HAL_TIM_Base_Start(&htim3); /*开启定时器,用溢出时间来触发ADC*/
//HAL_ADC_Stop_DMA(&hadc1); /*停止ADC的DMA传输*/
//HAL_TIM_Base_Stop(&htim3); /*停止定时器*/
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
    printSwo("",adc_buf[0],LINE_FEED_EN);
    HAL_Delay(500);
}
/* USER CODE END 3 */

增加一个DMA的回调函数用于转换完成后处理一些其它操作。

/** 函数名称:void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
 * 功能描述:ADC的DMA回调函数
 * 参数:hadc --- adc结构体指针
 * 返回值:无
 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    uint16_t flag;
    // HAL_ADC_Stop_DMA(&hadc1); //停止ADC的DMA传输
    flag = 1; //标记ADC_DMA传输完成
}

参考链接

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号