STM32F103+CubeMX+ADC采集直流
Posted 四臂西瓜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的通道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
开启间断模式。
- Data Alignment:
- 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功能。
引脚 | 连接对象 | 释义 |
---|---|---|
PA9 | CH340的RX | 单片机的TX连接CH340的RX |
PA10 | CH340的TX | 单片机的RX连接CH340的TX |
PA0 | 3.3V | 直接让ADC去测量板子上的3.3V |
运行结果
烧录代码后如果没有设置下载后自动复位,记得给单片机硬件复位
ADC返回给单片机的数值是4095,我们转换到实际的电压值,对应着 4095 4095 ∗ 3.3 = 3.3 V \\frac40954095*3.3=3.3V 40954095∗3.3=3.3V
后记
本文章收录于:
本文为系列文章中的冰山一角,欢迎进入小站查看。
配套程序:
以上是关于STM32F103+CubeMX+ADC采集直流的主要内容,如果未能解决你的问题,请参考以下文章
STM32HAL ADC+TIM+DMA采集交流信号 基于cubemx
STM32HAL ADC+TIM+DMA采集交流信号 基于cubemx
STM32HAL ADC+TIM+DMA采集交流信号 基于cubemx