实验器材:野火STM32 MINI开发板
任务目标:利用ADC采集电位器的电压,并通过串口调试助手输出变化的电压值
任务内容:调整开发板上的滑动变阻器,将电压值通过开发板到PC进行显示
开发板原理图:
1. 滑动变阻器电路图
2. USB转串口电路图
3. 外部晶振电路图
外部输入晶振为8MHz
一、CubeMX配置
1. 目标选择(芯片信号为STM32F103RCT6)
2. 引脚配置
PC1(见滑动变阻器电路图)设置为ADC_IN11
3.外设配置
3.1 复位及时钟控制
按照下图设置RCC(图1)中的HSE为BYPASS Clock Source(图2)
3.2 调试接口
按照下图设置SYS(图1)中的Serial Wire(图2)
3.3 Analog 设置
ADC1设置参数如下
3.4 Connectivity设置
USART1串口设置参数如下
4.时钟配置(如图所示)
输入频率为8MHz,最高为72MHz
5.工程配置(建议勾选如下图所示选项)
二 Cube IDE程序编写
1. 添加头文件
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "string.h"
/* USER CODE END Includes */
2.进行宏定义、
/* USER CODE BEGIN PD */
/* 串口重定向宏定义开始 */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#define GETCHAR_PROTOTYPE int __io_getchar(FILE *f)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch,FILE *f)
#define GETCHAR_PROTOTYPE int fgetc(FILE *f)
#endif
/* 串口重定向宏定义结束 */
/* USER CODE END PD */
3.自定义变量
/* USER CODE BEGIN PV */
uint32_t val; //存储转换结果的变量
uint32_t Volt;
/* USER CODE END PV */
4.打印提示语句
/* USER CODE BEGIN 2 */
printf("******ADC Function*********\n");
/* USER CODE END 2 */
5.主函数中的while()循环
关于电压值的计算
ADC转换后的结果是一个数字量,与实际模拟电压之间的计算关系由VREF+和转换精度位数确定。STM32F103系列MCU的ADC转换精度为12位(ADC转换分辨率为12位),如测量的电压范围是0~3.3V(见滑动变阻器电路图),转换后的二进制数是x,因为12位ADC在转换时将电压的范围大小(也就是3.3)分为4096(2^12)份,所以转换后的二进制数X代表的真实电压的计算方法是:V=3300*val/4096 (单位mv);
/* USER CODE BEGIN 3 */
HAL_ADC_Start(&hadc1); //ADC轮询方式启动,必须每次转换前启动
if(HAL_ADC_PollForConversion(&hadc1, 200)==HAL_OK) //等待转换完成,&hadc1应于引脚配置中的选择一致
{
val=HAL_ADC_GetValue(&hadc1) ; //读取转换结果
Volt=3300*val/4096; //以mV为单位
printf("Volt: %ldmV\r\n",Volt); //通过串口打印输出
}
HAL_Delay(500);
}
/* USER CODE END 3 */
6.串口重定向函数
/* USER CODE BEGIN 4 */
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
return ch;
}
GETCHAR_PROTOTYPE
{
uint8_t ch;
HAL_UART_Receive(&huart1,(uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
/* USER CODE END 4 */
7. 运行函数,下载到开发板,显示结果