打印
[STM32F1]

STM32F103+CubeMX+ADC采集直流

[复制链接]
2383|65
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
4y1b3|  楼主 | 2023-7-28 16:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
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。


使用特权

评论回复
评论
4y1b3 2023-7-28 16:21 回复TA
———————————————— 版权声明:本文为CSDN博主「四臂西瓜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_34022877/article/details/121863450 
沙发
4y1b3|  楼主 | 2023-7-28 16:29 | 只看该作者
工程建立
时钟配置

使用特权

评论回复
板凳
4y1b3|  楼主 | 2023-7-28 16:29 | 只看该作者
配置ADC


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

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

ADCs_Common_Settings:
Independent mod 独立 ADC 模式,当使用一个 ADC 时是独立模式,使用两个 ADC 时是双模式。

使用特权

评论回复
地板
4y1b3|  楼主 | 2023-7-28 16:30 | 只看该作者
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 开启间断模式。

使用特权

评论回复
5
4y1b3|  楼主 | 2023-7-28 16:31 | 只看该作者
ADC_Regular_ConversionMode:
Enable Regular Conversions 是否使能规则转换。
Number Of Conversion ADC转换通道数目,有几个写几个就行。
External Trigger Conversion Source 外部触发选择。这个有多个选择,支持定时器和软件触发。

使用特权

评论回复
6
4y1b3|  楼主 | 2023-7-28 16:32 | 只看该作者
Rank
Channel ADC转换通道
Sampling Time 采样周期选择,采样周期越短,ADC 转换数据输出周期就越短但数据精度也越低,采样周期越长,ADC 转换数据输出周期就越长同时数据精度越高。

使用特权

评论回复
7
4y1b3|  楼主 | 2023-7-28 16:32 | 只看该作者
ADC_Injected_ConversionMode:
Enable Injected Conversions 是否使能注入转换。注入通道只有在规则通道存在时才会出现。目前用不到。

使用特权

评论回复
8
4y1b3|  楼主 | 2023-7-28 16:33 | 只看该作者
WatchDog:
Enable Analog WatchDog Mode 是否使能模拟看门狗中断。当被 ADC 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断。
时钟树报错
没有碰到可以忽略

使用特权

评论回复
9
4y1b3|  楼主 | 2023-7-28 16:33 | 只看该作者
点开时钟树可以看到是ADC的时钟配置不对,产生这个的原因是我们最一开始配置时钟时,ADC的时钟没有开启。当开启ADC后,时钟分频过后ADC的时钟超过14M(这个14M上限可以在STM32中文参考手册里查到)。

使用特权

评论回复
10
4y1b3|  楼主 | 2023-7-28 16:34 | 只看该作者
我们这里只需要更改分频系数即可,把4改成6或者8就可以。

使用特权

评论回复
11
4y1b3|  楼主 | 2023-7-28 16:34 | 只看该作者
时钟树报错

使用特权

评论回复
12
4y1b3|  楼主 | 2023-7-28 16:35 | 只看该作者
改正后的时钟树
配置串口

使用特权

评论回复
13
4y1b3|  楼主 | 2023-7-28 16:35 | 只看该作者
代码生成
命名工程,指明位置

使用特权

评论回复
14
4y1b3|  楼主 | 2023-7-28 16:36 | 只看该作者

使用特权

评论回复
15
4y1b3|  楼主 | 2023-7-28 16:37 | 只看该作者

使用特权

评论回复
16
4y1b3|  楼主 | 2023-7-28 16:37 | 只看该作者
代码编写
首先配置串口重定向

#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;
}

使用特权

评论回复
17
4y1b3|  楼主 | 2023-7-28 16:39 | 只看该作者

使用特权

评论回复
18
4y1b3|  楼主 | 2023-7-28 16:39 | 只看该作者
在mian.c里面包含stdio.h头文件,mian.c里面就可以printf了。

#include <stdio.h>

使用特权

评论回复
19
4y1b3|  楼主 | 2023-7-28 16:40 | 只看该作者

使用特权

评论回复
20
4y1b3|  楼主 | 2023-7-28 16:40 | 只看该作者
先定义一个无符号16位变量

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

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

245

帖子

0

粉丝