STM32CUBEIDE(9)----双ADC轮询模式扫描多个通道

概述本章stm32cubemx配置stm32f103双adc轮询模式扫描多个通道,通过串口进行打印。
生成例程使用stm32cubemx生成例程,这里使用nucleo-f103rb开发板
查看原理图,pa2和pa3设置为开发板的串口。
配置串口。
开启中断。
查看原理图,arduino的接口a0-a5都是ad口。
adc通道配置
adc1in0(pa0)in1(pa1)in4(pa4)
adc2 in8(pb0) in10(pc0) in11(pc1)
adc1配置。
adcs_common_settings:mode:independent mod 独立 adc 模式,当使用一个 adc 时是独立模式,使用两个 adc 时是双模式,在双模式下还有很多细分模式可选,具体配置 adc_cr1:dualmod 位。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 开启间断模式。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 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断。adc2配置。
生成独立的文件。
stm32cubeide配置
若需要打印浮点型,需要勾选下面的选项。
串口重定向在main.c中,添加头文件,若不添加会出现 identifier file is undefined报错。
/* user code begin includes */#include stdio.h/* user code end includes */函数声明和串口重定向:
/* user code begin pfp */#ifdef __gnuc__ //串口重定向#define putchar_prototype int __io_putchar(int ch)#else#define putchar_prototype int fputc(int ch, file *f)#endif putchar_prototype{ hal_uart_transmit(&huart2 , (uint8_t *)&ch, 1, 0xffff); return ch;}/* user code end pfp */代码定义变量,存放采集到的数据。
/* user code begin 0 */uint8_t i;uint16_t adc1buf[3];//adc1数组uint16_t adc2buf[3];//adc2数组/* user code end 0 */adc校准。
/* user code begin 2 */ hal_adcex_calibration_start(&hadc1); //adc校准 hal_adcex_calibration_start(&hadc2); //adc校准 printf(adc demo!\\r\\n); /* user code end 2 */采集数据。
/* user code begin while */ while (1) { /* user code end while */ /* user code begin 3 */ i=0; while(i<3) { hal_adc_start(&hadc1);//启动adc hal_adc_pollforconversion(&hadc1,0xffff);//表示等待转换完成,第二个参数表示超时时间,单位ms. //hal_adc_getstate(&hadc1)为换取adc状态,hal_adc_state_reg_eoc表示转换完成标志位,转换数据可用。 if(hal_is_bit_set(hal_adc_getstate(&hadc1),hal_adc_state_reg_eoc))//就是判断转换完成标志位是否设置,hal_adc_state_reg_eoc表示转换完成标志位,转换数据可用 { //读取adc转换数据,数据为12位。查看数据手册可知,寄存器为16位存储转换数据,数据右对齐,则转换的数据范围为0~2^12-1,即0~4095. adc1buf[i]=hal_adc_getvalue(&hadc1); i++; } } printf(\\nadc1_in0(pa0)=%4.0d,voltage=%1.4f,adc1buf[0],adc1buf[0]*3.3f/4095); printf(\\nadc1_in1(pa1)=%4.0d,voltage=%1.4f,adc1buf[1],adc1buf[1]*3.3f/4095); printf(\\nadc1_in4(pa4)=%4.0d,voltage=%1.4f,adc1buf[2],adc1buf[2]*3.3f/4095); hal_adc_stop(&hadc1); hal_delay(500); i=0; while(i<3) { hal_adc_start(&hadc2);//启动adc hal_adc_pollforconversion(&hadc2,0xffff);//表示等待转换完成,第二个参数表示超时时间,单位ms. //hal_adc_getstate(&hadc1)为换取adc状态,hal_adc_state_reg_eoc表示转换完成标志位,转换数据可用。 if(hal_is_bit_set(hal_adc_getstate(&hadc2),hal_adc_state_reg_eoc))//就是判断转换完成标志位是否设置,hal_adc_state_reg_eoc表示转换完成标志位,转换数据可用 { //读取adc转换数据,数据为12位。查看数据手册可知,寄存器为16位存储转换数据,数据右对齐,则转换的数据范围为0~2^12-1,即0~4095. adc2buf[i]=hal_adc_getvalue(&hadc2); i++; } } printf(\\nadc2_in8(pb0)=%4.0d,voltage=%1.4f,adc2buf[0],adc2buf[0]*3.3f/4095); printf(\\nadc2_in10(pc0)=%4.0d,voltage=%1.4f,adc2buf[1],adc2buf[1]*3.3f/4095); printf(\\nadc2_in11(pc1)=%4.0d,voltage=%1.4f,adc2buf[2],adc2buf[2]*3.3f/4095); hal_adc_stop(&hadc2); hal_delay(500); } /* user code end 3 */测试结果输入固定电压进行测试。
adc1in0(pa0)in1(pa1)in4(pa4)
输入电压 vcc 2.0v gnd
adc2 in8(pb0) in10(pc0) in11(pc1)
输入电压 vcc gnd 2.0v
测试结果如下。


BAT的车联网新战事,百度小度车载OS能占据关键地位吗?
雷神推出全新顶级游戏本 搭载NVIDIARTX20系列显卡
如何实现CDMA移动台的生产功率校正算法
四层板应用
盘点最奇葩手机:脑洞之王诺基亚有很多不错的创意
STM32CUBEIDE(9)----双ADC轮询模式扫描多个通道
什么是机械式视觉系统?机械式视觉系统相关子系统介绍
平价挂脖式蓝牙耳机有什么推荐?便宜好用的挂脖式蓝牙耳机榜单
小米成立三大部门 构建全新生态链
常用电子仪器使用练习
连续的停电减产,内存厂商将迎来价格上涨期
德国进口义齿切削机主轴对氧化锆钛合金高速精密切削加工
倾倒开关应用在电风扇上有哪些优势
光电隔离耦合6L6单端放大器的制作
深圳市航通智能技术有限公司企业详情
五分钟看懂混合动力汽车结构
北京新能源汽车指标申请再创新高,部分申请人甚至要等到2025年
什么是FFT分析的负频率
结构简单但拆解不易的韶音骨传导耳机
量子纠缠是实现量子通信的重要基础