<STM32>STM32CubeMX-ADC采集(软件触发单通道)(4)

本节主要讲解ADC采集数据的功能,采集采用软件触发的方式;
ADC的详细解说可参考《STM32F4XXX中文参考手册》,资料有详细的讲解和说明,文档可跟作者联系索取,或百度搜索也可。

本系列教程同类文章包括以下:
1、<STM32>STM32CubeMX-基础工程创建及LED灯控制 (1)
2、<STM32>STM32CubeMX-工程创建及定时器控制LED灯闪烁(2)
3、<STM32>STM32CubeMX-串口收发通信(结束标识“\r\n”)(3)

话不多说,开始写代码吧。。

一、打开STM32CubeMX选择对应的芯片型号,后进入开发界面
1、双击“STM32CubeMX”软件打开,打开后如下图所示,选择红色框1;

选择后可能会更新,等待更新完成即可,如下图:

2、选择开发芯片,作者本例程的芯片是STM32F407ZET6,读者根据自己使用的开发板芯片选择即可。操作如下:
按照下图步骤:
步骤1:输入开发使用的芯片型号,作者这里输入:STM32F407ZE,就会在步骤2显示芯片的具体型号;
步骤2:选择具体使用的芯片型号,选中后会高亮;
步骤3:点击“Start Project”,开始进入工程图形配置界面。

二、图形界面配置
由于采集的ADC数据需要查看,所以本例程采用的是通过串口输出采集的数据,输出到电脑端的串口调试助手。
所以除了基本的时钟、晶振等一些配置,还包含串口配置和ADC配置。
1、配置晶振
步骤1:选择“Pinout&Configuration”;
步骤2:选择“System Core”;
步骤3:选择“RCC”;
步骤4、5:选项下拉选择“Crystal/Ceramic Resonator”
下拉选项说明:
Crystal/Ceramic Resonator:晶体/陶瓷晶振,一般使用的都是这个
BYPASS Clock Source:旁路时钟源

2、配置DEBUG和SYS
步骤1:选择“Pinout&Configuration”;
步骤2:选择“System Core”;
步骤3:选择“SYS”;
步骤4:选择“Serial Wire”;
此选项是下载调试的方式选择,有很多种,包括SWD、JTAG等方式。
步骤5:选择“Sys Tick”;
此选项是HAL时基的选择,有滴答定时器,和其它定时器1、2、3、4、5…,这里选择SysTick滴答定时器。

3、配置调试输出串口1
步骤1:选择“Pinout&Configuration”;
步骤2:选择“Connectivity”;
步骤3:选择“USART1”;
步骤4:选择“Asynchronous”;
此下拉选项有多种选择,分别如下:
Asynchronous:异步通信
Synchronous:同步通信
Single Wire(Half-Duplex):半双工
Multiprocessor Communication:多处理器通信
lrDA:红外数据
LIN:局域网互联
SmartCard:智能卡
步骤5:选择“NVIC Settings”->然后勾选中断使能。
选项卡“Parameter Settings”是设置串口的参数
Basic Parameters->Baud Rate:设置波特率,默认115200,可不修改;
Basic Parameters->Word Length:字长,默认“8Bits”,默认即可;
Basic Parameters->Parity:奇偶校验,默认选择"None"无校验;默认即可;
Basic Parameters->Stop Bits:停止位,默认1,默认即可;
Advanced Parameters->Data Direction:数据方向,默认“Receive and Transmit”可接收发送,默认即可;
Advanced Parameters->Over Sampling:过采样长度,默认“16 Samples”16个采样,默认即可;
选项卡“NVIC Settings”是设置中断使能-勾选对应的中断信号源即可,本工程只勾选“USART1 global interrupt”;
选项卡“DMA Settings”是设置串口DMA通道的,可添加DMA,在本工程,不使用。
其它选项卡无需设置。

4、配置ADC,使用ADC1通道1,即PA1引脚
步骤1:选择“Pinout&Configuration”;
步骤2:选择“Analog”;
步骤3:选择“ADC1”;
步骤4:选择“IN1”,表示选择通道1, 此选项是选项ADC的通道,勾选够在右侧标记“6”可看到对应的IO选中。
步骤5:ADC参数配置,ADC_Settings->Clock Prescaler选择“PCLK2 divided by 4”,如图所示;
选项卡“Parameter Settings”是设置ADC的参数
(1)ADCs_Common_Settings->Mode:ADC的模式,默认选择“Independent mode”,独立模式,默认即可;
(2)ADC_Settings->Clock Prescaler:时钟预分频,默认选择“PCLK2 divided by 2”,2分频,ADC分频后的时钟最好不要高于36MHz;ADC在APB2时钟线上,后面配置时钟树时,会得到APB2是84MHz,所以本工程此选项选择“PCLK2 divided by 4”,4分频
(3)ADC_Settings->Resolution:ADC 分辨率,默认“12Bits",默认即可;
(4)ADC_Settings->Data Alignment:数据对齐对齐方式,默认“Right alignment”,右对齐,默认即可;
(5)ADC_Settings->Scan Conversion Mode:扫描,默认“Disable”,不使能,默认即可,如果多通道可使能;
(6)ADC_Settings->Continuous Conversion Mode:连续转换,默认“Disable”,不使能,默认即可,如果多通道或连续采集信号时可使能;
(7)ADC_Settings->Discontinuous Conversion Mode:不连续转换,和上一条相反;
(8)ADC_Settings->DMA Continuous Requests:DMA 连续请求,默认“Disable”,不使能,使用DMA时可使能;
(9)ADC_Settings->End Of Conversion Selection:转换结束选择,默认“EOC flag at the end of single channel conversion”,单通道转换结束时的 EOC 标志,默认即可;
(10)ADC_Regular_ConversionMode->Number Of Conversion:转换次数,默认“1”,默认即可;
(11)ADC_Regular_ConversionMode->External Trigger Conversion Source,外部触发转换源,默认“Regular Conversion launched by software”由软件启动的定期转换,默认即可;
(12)ADC_Regular_ConversionMode->External Trigger Conversion Edge,外部触发转换边沿,默认“None”,默认即可;
(13)ADC_Regular_ConversionMode->Rank->Channel,选择ADC的通道,在前面则通道后,处选择对应的Channel即可,如果只用到1个通道,一般会默认选中;
(14)ADC_Regular_ConversionMode->Rank->Sampling Time,采样时间,小一些比较快,但是可能采集的信号波动大,大一些时间长一点,采集的波动小;
(15)ADC_Injected_ConversionMode->Number Of ConversionMode,转换模式数,默认即可;
(16)WatchDog->Enable Analog WatchDog Mode,看门口,默认不勾选,默认即可;

选项卡“NVIC Settings”是设置中断使能,本工程不使用;
选项卡“DMA Settings”是设置ADC采集DMA通道的,可添加DMA,在本工程,不使用。
其它选项卡无需设置。


三、配置系统时钟
步骤1:选择“Clock&Configuration”;
步骤2:外部高速晶振的大小,作者用的开发板上,外部高速晶振大小时8MHz,读者根据自己使用的开发板上的晶振大小输入对应的值即可;
步骤3:选择器选择下面园点,即选中外部晶振作为输入源;如果电路没外部晶振,可选择上面圆点,选择芯片内部高速晶振作为输入,本工程选外部输入;
步骤4:选择“PLLCLK”,就是选择倍频器PLL作为输入时钟源,如果没外部高速晶振,则选择HSI(第一个圆点);
步骤5:直接输入“168”,作为系统的主频大小。
以上修改完成后 回车,如果右提示,选择确认即可。

参考下图选择,高亮的位置都可以修改,修改后的值如下图所示:

四、工程输出配置
1、项目文件配置
步骤1:选择“Project Manager”
步骤2:选择“Project”
步骤3:输入工程名称,作者这里输入“ADC”,表示ADC功能的工程,一般名称体现工程的作用,可以自定义;
步骤4:点击“Browse”,选择工程存放的路径,不要包含中文;
步骤5:下拉选择“MDK-ARM”,表示用的IDE是keil;可以根据自己使用的编程软件选择,这里作者选用“MDK-ARM”;后面的“V5.27”则是软件的版本号;
步骤6:芯片的HAL库固件包,勾选后面,会自动选择,一般会自动更新到最新版本;

2、代码生成配置
步骤7:选择“Code Generator”;
步骤8:STM32Cube MCU packages and embedded software packs,STM32Cube MCU 软件包和嵌入式软件包选择,本工程选中第一条;
第一条:Copy all used libraries into the project folder:将所有使用的库复制到项目文件夹中;
第二条:Copy only the necessary library files:只复制必要的库文件;
第三条:Add necessary library files as reference in the toolchain project configuration file:在工具链项目配置文件中添加必要的库文件作为参考;
建议选中第一条,将所以的包含,避免后续开发出现遗漏的文件,方便后续功能增加,就是工程代码量会大一些;

步骤9:Generated files,生成文件,本工程选中,第一、三、四,三个选项;
第一条:Generate pripheral initalization as a pair of ‘.c/.h’ files per peripheral:将外围设备初始化生成为每个外围设备的一对“.c/.h”文件
第二条:Backup previously generated files when re-generating,重新生成时备份以前生成的文件
第三条:Keep User Code when re-generating,重新生成时保留用户代码
第四条:Delete previously generated files when not re-generated ,不重新生成时删除以前生成的文件
步骤10:点击“GENERATE CODE”

点击生成后弹出提示框,点击“Open Project”,即可打开工程。

打开后就是界面如下:

五、代码补充
1、补充串口代码
串口是为了方便测试查看ADC的采集数据,重定向了printf函数,具体操作如下:
打开“usart.c”文件,
在文件头文件引用的“/* USER CODE BEGIN 0 /” 和“ / USER CODE END 1 */ ”之间添加如下代码:

#include "stdio.h"

添加后如下图:

在末尾的“/* USER CODE BEGIN 1 /” 和“ / USER CODE END 1 */ ”之间添加如下代码:

#if 1
//#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{ int handle;
}; FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{ x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{    while((USART1->SR&0X40)==0);//循环发送,直到发送完毕USART1->DR=(uint8_t)ch;      return ch;
}
#endif


2、补充ADC配置代码
打开adc.c,在末尾的“/* USER CODE BEGIN 1 /” 和“ / USER CODE END 1 */ ”之间添加如下代码:

//获得ADC值
//ch: 通道值 0~16,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
//返回值:转换结果
uint16_t Get_Adc(uint32_t ch)
{ADC_ChannelConfTypeDef ADC1_ChanConf;ADC1_ChanConf.Channel=ch;                                   //通道ADC1_ChanConf.Rank=1;                                       //第1个序列,序列1ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES;        //采样时间ADC1_ChanConf.Offset=0;                 HAL_ADC_ConfigChannel(&hadc1,&ADC1_ChanConf);        //通道配置HAL_ADC_Start(&hadc1);                               //开启ADCHAL_ADC_PollForConversion(&hadc1,10);                //轮询转换return (uint16_t)HAL_ADC_GetValue(&hadc1);           //返回最近一次ADC1规则组的转换结果
}
//获取指定通道的转换值,取times次,然后平均
//times:获取次数
//返回值:通道ch的times次转换结果平均值
uint16_t Get_Adc_Average(uint32_t ch,uint8_t times)
{uint32_t temp_val=0;uint8_t t;for(t=0;t<times;t++){temp_val+=Get_Adc(ch);HAL_Delay(5);}return temp_val/times;
}

添加后如下图:

打开adc.h,在末尾的“/* USER CODE BEGIN Prototypes /” 和“ / USER CODE END Prototypes */ ”之间添加如下代码:

uint16_t Get_Adc_Average(uint32_t ch,uint8_t times); //函数声明

添加后如下图:

3、添加主函数代码
打开“main.c”文件
在文件头文件引用的“/* USER CODE BEGIN Includes /” 和“ / USER CODE END Includes */ ”之间添加如下代码:

#include "stdio.h"

添加后如下图:

主函数main添加相应代码,添加后内容如下:

int main(void)
{/* USER CODE BEGIN 1 */uint16_t   adcx=0;                 //定义ADC采集存放的变量float       ADC_V=0;                   //存放电压/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_ADC1_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */HAL_ADC_Start_IT(&hadc1);                                       //开启ADC/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */adcx = Get_Adc_Average(ADC_CHANNEL_1,10); //获取ADC1的通道1,10次的平均值ADC_V=(float)adcx*(3.3/65536);              //获取计算后的带小数的实际电压值,比如3.1111printf("采集的ADC值:%d, 转换后的电压值为:%.3f \r\n",adcx ,ADC_V  );HAL_Delay(1000);                                                   //延时1000ms}/* USER CODE END 3 */
}

添加后如下图:

以上代码添加完成,接下来编译运行测试。

六、编译测试
1、编译,点击编辑,确认编译无错,如果有错误,根据错误提示修改即可;

2、选择下载方式,作者用的是STlink下载器,SWD的方式;配置参考下图选择;


3、将下载器链接开发板,然后点击下载代码;
4、打开串口调试助手,选择开发板的串口号,配置串口参数和STM32配置的参数一致,然后点击“打开串口”,查看输出的内容;输入如下图所示:
将PA1通过杜邦线连接3.3V时:

将PA1通过杜邦线连接GND时:

七、总结
实验通过串口的输出可以看出,ADC采集正常。

以上是STM32F407ZET6开发板,验证STM32CubeMX创建ADC采集的整个流程。如有不足、遗漏之处可联系作者修改。
如有不明白,交流的地方也可联系作者。

联系方式QQ759521350

<STM32>STM32CubeMX-ADC采集(软件触发)(4)相关推荐

  1. STM32Cubemx——ADC采集+DMA传输

    文章目录 一.准备工具 二.前置知识 1.ADC简介 2.DMA简介 2.STM32Cubemx配置 1.新建工程 2.时钟源选择及时钟树配置 3.时基选择调试接口选择 4.配置ADC采集 1.选择要 ...

  2. STM32学习——ADC采集

    注意事项 暂时只做了单通道中断方式的采集 1.选择输入引脚时就已经确定了后面ADC的转换通道ADC_Channel 编程步骤 1.初始化ADC用到的GPIO 2.初始化ADC并设置其工作参数 3.设置 ...

  3. STM32实现ADC采集(待优化)

    1.ADC简介 STM32F103 系列最少都拥有 2 个 ADC ,我们选择的 STM32F103RCT 包含有 3 个 ADC,STM32的最大转换速率为1Mhz,也就是转换时间为1us,除此之外 ...

  4. STM32的ADC采集的引脚汇总

  5. 【STM32】STM32CUBEMX + ADC(单通道,双通道DMA)

    STM32CUBEMX + ADC(单通道,双通道DMA) 案例应用 :使用ADC采集电压(单通道.单通道+DMA.双通道+DMA),并利用串口打印采集转换后的电压值 1.工具 IAR STM32CU ...

  6. STM32 热敏电阻NTC的软件设计(ADC采集)

    目录 前言 一.查表函数 二.ADC采集 三.查表 四.数据滤波 前言 记录一些我在工作和学习过程中遇到的问题. NTC:在淘宝随便买的 单片机型号:STM32G030C8T6 目的:用单片机采集NT ...

  7. STM32 - ADC采集电压 中断处理

    一.参考电压 VDD接入电压为3.3V ADC供电要求:2.4V到3.6V 注意:STM32的100脚以上(含100脚)有参考电压引脚.在没有参考电压引脚的单片机上,可以把基准电压芯片接入VDDA,但 ...

  8. STM32使用ADC+DMA进行多通道模拟量采集 (踩坑及傻瓜式解析)

    STM32使用ADC+DMA进行多通道模拟量采集 (踩坑及通俗解析) ​ 利用STM32的片上外设可采集多个模拟量(如传感器数值),并在嵌入式程序中使用.如果只使用了一个通道,用时令ADC转换而后读取 ...

  9. STM32物联网项目-ADC采集实验板板温度(NTC热敏电阻)

    STM32 ADC采集板载温度 STM32 ADC简介 ​ STM32 拥有 1~3 个 ADC(STM32F101/102 系列只有 1 个 ADC),这些 ADC 可以独立使用, 也可以使用双重模 ...

最新文章

  1. linux pytorch 快速安装
  2. 从茶叶蛋到互联网思维
  3. 【C 语言】指针数据类型 ( 野指针 | 避免野指针推荐方案 )
  4. window 服务(一)
  5. 计算机类会议论文2021截稿,科学网—人工智能 | 国际会议截稿信息3条 - 李昕的博文...
  6. Cocoa Touch国际化
  7. python中魔法函数_02 python中魔法函数
  8. eclipse 启动 tomcat : Multiple Contexts have a path of /SOAProject
  9. display:block jquery.sort()
  10. 快速搭建Python开发环境
  11. AIX文件系统之概述
  12. AGV 减震结构对比分析
  13. 【Linux系列文章】安装与配置(vmware)
  14. 传统消费将被销巴生活全返消费颠覆
  15. 如何优雅的阅读DBNet的训练代码
  16. eclipse平台的手机程序开发步骤整理
  17. 81000306 MSN不能登录
  18. 投放共享单车需要什么批文_浙江绍兴叫停所有共享单车:需审批才能投放
  19. 关于打印出现空白的问题
  20. FlipaClip——人人都是灵魂画师

热门文章

  1. 意大利CEMB一款经济振动现场动平衡仪
  2. ES-endpoint
  3. 【柔性制造】工业机器人实现柔性制造离不开的核心部件
  4. Android素描算法及实现手指在图片上左右滑动调节图片透明度,最终实现类似调节素描浓度的效果
  5. Linux入门小抄-part1-初识Linux
  6. 计算机主板的英文,电脑主板英文标识是什么意思?不同的标识各代表什么功能?...
  7. 安卓手机游戏 纪念碑谷1+2+被遗忘海岸+艾达的梦 解锁码
  8. cad连接不同线段的端点_cad里可不可以自动在多段线的端点上生成点?
  9. Discuz!开发之用户积分数额增减操作updatemembercount()函数解析
  10. Xmind8激活并转换为pdf格式