STM32F103+CubeMX+ADC采集直流

STM32F103+CubeMX+ADC采集直流

前言

本文主要讲解如何使用单片机的内部ADC去采集直流量。需要对ADC和cubemx有一定的使用经历。

所需工具:

  • 开发板:STM32F103C8T6
  • STM32CubeMX
  • IDE: Keil-MDK

ADC简介

ADC(Analog-to-Digital Converter),即模拟-数字转换器,可以将连续变化的模拟信号转换为离散的数字信号,进而使用数字电路进行处理,称之为数字信号处理。

STM32F103C8T6拥有2个内部ADC,分辨位数12位。单个ADC采样率最高可以达到1M,双ADC交错模式下可以达到2M。每个ADC共用多达16路通道。在电赛中,一般一个ADC开一个通道,两个通道的采样可以应对大部分的问题。一般开发板的内部ADC可以测量0-3.3V。

工程建立

时钟配置

请添加图片描述

配置ADC

在这里插入图片描述

使能ADC

可以从图中看出,ADC的通道0引脚是PA0。

下面的配置默认即可。目前不涉及他们的使用。每个选项的具体含义如下,后面用到后,会过来方便查找。

  • ADCs_Common_Settings:
    • Independent mod 独立 ADC 模式,当使用一个 ADC 时是独立模式,使用两个 ADC 时是双模式。
  • ADC_Settings
    • Data Alignment
      Right alignment 转换结果数据右对齐,一般我们选择右对齐模式。
      Left alignment 转换结果数据左对齐。
    • Scan Conversion Mode
      Disabled 禁止扫描模式。如果是单通道 AD 转换使用 DISABLE。
      Enabled 开启扫描模式。如果是多通道 AD 转换使用 ENABLE。
    • Continuous Conversion Mode
      Disabled 单次转换。转换一次后停止需要手动控制才重新启动转换。
      Enabled 自动连续转换。
    • DiscontinuousConvMode
      Disabled 禁止间断模式。这个在需要考虑功耗问题的产品中很有必要,也就是在某个事件触发下,开启转换。
      Enabled 开启间断模式。
  • ADC_Regular_ConversionMode
    • Enable Regular Conversions 是否使能规则转换。
    • Number Of Conversion ADC转换通道数目,有几个写几个就行。
    • External Trigger Conversion Source 外部触发选择。这个有多个选择,支持定时器和软件触发。
  • Rank
    • Channel ADC转换通道
    • Sampling Time 采样周期选择,采样周期越短,ADC 转换数据输出周期就越短但数据精度也越低,采样周期越长,ADC 转换数据输出周期就越长同时数据精度越高。
  • ADC_Injected_ConversionMode
    • Enable Injected Conversions 是否使能注入转换。注入通道只有在规则通道存在时才会出现。目前用不到。
  • WatchDog
  • Enable Analog WatchDog Mode 是否使能模拟看门狗中断。当被 ADC 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断。
时钟树报错

没有碰到可以忽略

点开时钟树可以看到是ADC的时钟配置不对,产生这个的原因是我们最一开始配置时钟时,ADC的时钟没有开启。当开启ADC后,时钟分频过后ADC的时钟超过14M(这个14M上限可以在STM32中文参考手册里查到)。

我们这里只需要更改分频系数即可,把4改成6或者8就可以。

在这里插入图片描述

时钟树报错

在这里插入图片描述

改正后的时钟树

配置串口

在这里插入图片描述

代码生成

命名工程,指明位置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码编写

首先配置串口重定向

#include <stdio.h>

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

int fgetc(FILE *f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
  return ch;
}

在这里插入图片描述

在mian.c里面包含stdio.h头文件,mian.c里面就可以printf了。

#include <stdio.h>

在这里插入图片描述

先定义一个无符号16位变量

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
uint16_t ADC_Value; //定义一个变量,存放ADC返回的值
/* USER CODE END PV */

在这里插入图片描述

接着书写单次采集程序

  HAL_ADCEx_Calibration_Start(&hadc1);   //ADC校准
  HAL_ADC_Start(&hadc1);                 //启动ADC转换
  HAL_ADC_PollForConversion(&hadc1, 50); //等待ADC1转换完毕,这里最多等待50ms
  ADC_Value = HAL_ADC_GetValue(&hadc1);  //获取ADC的值,结果存放在ADC_Value里面
  printf("ADC value is %d\n", ADC_Value);
  printf("ADC actural value is %.2f\n", ADC_Value * 3.3 / 4095);

硬件连接

请添加图片描述

示例工程里,我加入了UART的初始化以及对应的串口重定向和DEBUG功能。

引脚连接对象释义
PA9CH340的RX单片机的TX连接CH340的RX
PA10CH340的TX单片机的RX连接CH340的TX
PA03.3V直接让ADC去测量板子上的3.3V

在这里插入图片描述
在这里插入图片描述

运行结果

烧录代码后如果没有设置下载后自动复位,记得给单片机硬件复位

请添加图片描述

ADC返回给单片机的数值是4095,我们转换到实际的电压值,对应着 4095 4095 ∗ 3.3 = 3.3 V \frac{4095}{4095}*3.3=3.3V 409540953.3=3.3V

练习

  1. 我们知道ADC精度有限,实际采集到的直流值会有波动,尝试使用取均值来提高测量精度,。对比10个数取平均,和1000个数取平均,测到的直流值之间的差别。

    加深对均值滤波和精度的概念

  2. 如果你会定时器中断,尝试配合定时器中断实现一个100hz采样率的采样,也就是定义一个100hz的定时器中断,在每一次中断里面采集一次数据,这样去测量1hz的正弦信号,当测满100个点后,把数据打印出来,查看波形。

    对采样率有一定的理解

  3. 在练习2的基础上,将采样率从100hz提高到1k,在提高到10k,观察效果。如果发现采样率比实际的低,思考为什么。答案会在后续采集交流的文章中揭晓。

    对中断方式控制的采样率上限有一定的感受。对处理的速度有一定的概念,做了这个练习,相信你在学习采集交流部分的DMA操作,会有比别人更加深刻的感悟,领略硬件的速度与软件的灵活。

后记

本文章收录于:

唐承乾的电赛小站

本文为系列文章中的冰山一角,欢迎进入小站查看。

配套程序:

STM32cubemx配置ADC采集直流

  • 23
    点赞
  • 131
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: STM32F103是意法半导体(STMicroelectronics)公司推出的一款基于ARM Cortex-M3内核的32位微控制器。它具有丰富的外设和高性能,常用于各种应用领域。 其中的DMA(Direct Memory Access)是一种高速数据传输方式,它可以在不经过CPU的干预下,直接将数据从外设传输到内存,或者从内存传输到外设。这种方式可以显著提高数据传输的效率。STM32F103中的DMA控制器可以与多个外设进行数据传输,包括ADC和TIM。 ADC(Analog-to-Digital Converter)是模数转换器,用于将模拟信号转换为数字信号。STM32F103ADC模块具有多个通道,可以同时采集多个模拟信号,并将其转换为相应的数字值。通过DMA控制器,ADC模块可以将采集到的数据直接传输到内存,而无需CPU的干预。这样可以实现高效的模拟信号采集。 TIM(Timer)是定时器,可以用于生成各种定时、计数和PWM信号。STM32F103的定时器模块具有多个通道和多种功能,可以用于测量时间间隔、产生定时中断、实现PWM输出等。通过DMA控制器,定时器模块可以将产生的定时或PWM数据直接传输到外设,如LED驱动器等,大大减轻CPU的负担。 综上所述,STM32F103中的DMA、ADC和TIM模块具有协同工作的能力,可以实现高效的数据传输和信号采集。通过合理配置和使用这些模块,可以大大提升系统的性能和效率。 ### 回答2: STM32F103是一款基于ARM Cortex-M3内核的微控制器,具有丰富的外设资源。DMA(Direct Memory Access)是一种直接内存访问技术,可以实现外设与内存之间的数据传输,提高系统的数据传输效率。ADC(Analog-to-Digital Converter)是模数转换器,用于将模拟信号转换为数字信号。TIM(Timer)则是定时器,用于产生定时和计数操作。 STM32F103支持DMA控制器和多个ADC通道,这使得在数据采集过程中可以使用DMA来直接将ADC采样的数据传输到内存中,而无需CPU参与,从而提高了系统的效率。通过配置DMA通道和ADC的DMA请求,可以实现自动转换和传输。在传输完成之后,可以通过DMA传输完成中断来进行相应的处理。 另外,STM32F103还具备多个定时器(TIM),其中包括基本定时器和通用定时器。可以使用定时器来产生特定的时间间隔,并触发相应的事件。通过配置定时器的预分频器、计数器和各种模式,可以满足不同的定时和计数需求。 综上所述,使用STM32F103的DMA、ADC和TIM外设可以实现高效的数据采集和定时操作。通过合理配置和编程,可以满足不同应用场景下的实时数据采集和事件触发需求。 ### 回答3: STM32F103是意法半导体(STMicroelectronics)生产的一款32位单片机,它具有强大的性能和丰富的外设功能。其中DMA(Direct Memory Access,直接内存访问)是一种数据传输技术,ADC(Analog-to-Digital Converter,模数转换器)是一种模拟信号转换为数字信号的设备,而TIM(Timer/Counter,定时器/计数器)是用于计时和计数的设备。 在STM32F103中,DMA用于优化数据传输,通过在外设和存储器之间建立直接通道,实现数据的高速传输,减轻了单片机的处理负担。ADC是用于将模拟信号转换为数字信号的重要功能模块,可以采集外部传感器的模拟信号,并将其转换为数字形式供单片机处理。而TIM用来实现各种计时和计数功能,例如控制器模块中的PWM(Pulse Width Modulation,脉冲宽度调制)输出、测量时间间隔等。 在应用中,可以使用DMA来优化ADC的数据传输。通过配置DMA控制器,可以在ADC转换值就绪后,自动将转换结果复制到指定的存储位置,实现高效的数据传输。另外,TIM可以与ADC结合使用,通过定时触发ADC的转换,实现周期性采样。这样可以实现周期性信号的连续采样,满足一些实时性要求较高的应用场景。 总之,STM32F103的DMA、ADC和TIM等功能模块的结合应用可以实现高效的数据传输和处理,满足各种应用需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值