一、硬件配置
本实验采用STM32F103RB nao开发板  使用PA0/1/2 引脚,即ADC1的IN0/1/2三个通道,分别测量GND/VCC/VR三处电压。 接线为: PA0 → GND PA1 → VCC PA2 → VR
二、CubeMX配置
1.配置时钟
  打开HSE、LSE,配置为内外部时钟,主频配置为72MHz,ADC时钟默认为12MHz。
2.配置串口
这里使用USART1,等会重定向Printf用于打印测量信息。  选择USART1,配置为异步模式,参数无需调整。
3. 配置ADC

- 在模拟器件中选择ADC1
- 使能ADC1的三路通道 IN0/1/2 ,右侧可见 PA0/1/2 引脚被配置
- 在下面ADC参数配置中选择独立模式
- 使用3个规则通道
- 三路通道 IN0/1/2 分别配置为规则通道的序列1/2/3
- ADC配置为数据右对齐(16位寄存器位,12位有效),扫描模式(会依次检测三个通道),连续转换(ADC会一直工作)
4.配置DMA

- 选择DMA Settings进入DMA配置界面
- 点击Add添加ADC1 DMA功能,方向为外设到内存
- 模式为Circluar循环模式,外设不自增,内存自增
- 外设和内存的传输数据类型均为半字(12位ADC)
5. 生成工程
三、程序编写
1. printf重定向
勾选Use MicroLIB  在usart.c 文件中加入以下代码,并在usart.h 文件中添加include <stdio.h>
#include <stdio.h>
int fputc(int ch, FILE *stream)
{
while((USART1->SR & 0X40) == 0);
USART1->DR = (uint8_t) ch;
return ch;
}
2. 主函数
 注意检查CubeMX生成的初始化代码,部分版本的CubeMX初始化顺序不对。正确初始化顺序应为GPIO→DMA→ADC1。

- 启动ADC,已DMA模式工作,根据前面的配置,ADC将 连续 扫描 检测PA0/1/2的电压值。并将其存在二维数组 ADC_ConvertedValue [100], [3]中;
- 调用函数GetAverage() 计算各通道的100个电压数据的平均值;
- 打印各通道电压平均值
3. GetAverage函数

- 定义三个float量存放计算出的三通道平均值
- 对DMA存放数组中每个通道的100个数据求和,取平均值,再转换为模拟电压值。
四、实验效果
 通道0输出始终为0; 通道1输出始终为3.3V; 通道2输出随电位器调节而变化
|