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

发布者:心若澄明最新更新时间:2023-09-04 来源: elecfans关键字:STM32CUBEIDE  双ADC  轮询模式  通道 手机看文章 扫描二维码
随时随地手机看文章

概述

本章STM32CUBEMX配置STM32F103双ADC轮询模式扫描多个通道,通过串口进行打印。


生成例程

使用STM32CUBEMX生成例程,这里使用NUCLEO-F103RB开发板

在这里插入图片描述

查看原理图,PA2和PA3设置为开发板的串口。

在这里插入图片描述

配置串口。

在这里插入图片描述

开启中断。

在这里插入图片描述

查看原理图,Arduino的接口A0-A5都是AD口。

在这里插入图片描述

ADC通道配置

ADC1IN0(PA0)IN1(PA1)IN4(PA4)
ADC2IN8(PB0)IN10(PC0)IN11(PC1)

ADC1配置。

在这里插入图片描述

  • ADCs_Common_Settings:

    • Mode:Independent mod 独立 ADC 模式,当使用一个 ADC 时是独立模式,使用两个 ADC 时是双模式,在双模式下还有很多细分模式可选,具体配置 ADC_CR1:DUALMOD 位。

  • ADC_Settings:

    • Disabled 禁止间断模式。这个在需要考虑功耗问题的产品中很有必要,也就是在某个事件触发下,开启转换。

    • Enabled 开启间断模式。

    • Disabled 单次转换。转换一次后停止需要手动控制才重新启动转换。

    • Enabled 自动连续转换。

    • Disabled 禁止扫描模式。如果是单通道 AD 转换使用 DISABLE。

    • Enabled 开启扫描模式。如果是多通道 AD 转换使用 ENABLE。

    • Right alignment 转换结果数据右对齐,一般我们选择右对齐模式。

    • Left alignment 转换结果数据左对齐。

    • Data Alignment:

    • Scan Conversion Mode:

    • Continuous Conversion Mode:

    • DiscontinuousConvMode:

  • 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)
输入电压VCC2.0VGND
ADC2IN8(PB0)IN10(PC0)IN11(PC1)
输入电压VCCGND2.0V

测试结果如下。

在这里插入图片描述


关键字:STM32CUBEIDE  双ADC  轮询模式  通道 引用地址:STM32CUBEIDE(9)----双ADC轮询模式扫描多个通道

上一篇:基于STM32的三种库函数代码效率对比解析
下一篇:STM32F40探索者开发板如何实现基础的远程检测以及控制

推荐阅读最新更新时间:2024-11-17 12:40

通道晶体管沟通毫伏表的运用留意事项
① 机械调零。在通电前,先调整电表指示的机械零位。 ② 接通电源。按下电源开关,发光二极管灯亮,仪器马上作业,为确保功用安稳,可预热非常钟后运用。 ③ 将量程开关置于恰当量程,再参与丈量信号。若丈量电压不知道,应将量程开关置于最大档,然后逐步减小量程。 ④ 中选十V,1V,0.1V,十mV,1mV量程时,读数看表头中满刻度为十的表盘;中选30V,3V,0.3V,30mV,3mV量程时,读数看表头中满刻度为3的表盘。例如:中选用0.3V的挡位,读数时看满刻度为3的表盘,若此刻指针指在1的方位上,则实习丈量电压为有用值0.1V。 图 沟通毫伏表 ⑤ 晶体管毫伏表运用时应笔直放置,待测信号经过信号线经输入插座进入
[测试测量]
STM32 F1 TIM2 4通道PWM同时出波配置
void TIM2_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
[单片机]
应用笔记 | 建立基于STM32CubeIDE的ClassB工程
01 前言 大家都知道ST的ClassB功能安全软件设计包是免费的,也有众多客户基于STM32CubeIDE免费的IDE进行开发,本文档将展示如何轻松地实现ClassB在STM32CubeIDE上的移植。 02 准备 硬件:NUCLEO-G070 软件:X-CUBE-CLASSB version 2.3.0 03 创建CubeMX工程 在CubeMX中创建闪灯和串口打印的基础工程,并在实验板上验证工程的正确性。 然后继续配置IWDG、WWDG、CRC外设。为了避免程序在移植和调试时产生复位,可以在CubeMX中配置为不调用。 将X-CUBE-CLASSB V2.3.0中整个Middleware
[单片机]
应用笔记 | 建立基于<font color='red'>STM32CubeIDE</font>的ClassB工程
基于SPCE061A的高精度多通道温度测量系统设计
   0 引 言   温度的测量与控制在工农业生产、日常生活及科学研究中有着广泛的应用。由于常用温度传感器的非线性输出及一致性较差,使温度的测量方法和手段相对较复杂,也给电路的调试增加了难度。为此,设计了以台湾凌阳公司生产的SPCE061A 16位高性能单片机为系统控制核心。采用DALLAS公司的DS18820作为温度传感器的三通道高精度温度测控仪,该测控仪实现了温度数据和日期、时间的显示与保存;可输出显示三组温度和三路控制信号,具有故障和报警状态提示等功能,保证了测试的精度以及系统的可靠性和控制要求。    1 系统硬件设计   多通道智能温度测控仪的硬件电路原理框图如图1所示,测控仪主要由SPCE061A单片机、温度传感
[模拟电子]
浅析多通道接收单元噪声系数的测试
之前一个朋友要测试低噪声放大器(LNA)的噪声系数,但是声称遇到一些麻烦。LNA噪声系数的测试采用Y因子法非常简便,校准完成后直接连接待测件即可测试,可操作性非常强。麻烦在哪里呢? 原来待测件是一个含有四个通道的接收模块,每个通道只含有一个LNA,然后经过合路器合为一路输出,如图1所示。按理说,逐一测试每一通道的噪声系数还是比较简单的,因为通道中没有变频器件。但是麻烦在于,四路LNA的供电是同一路,如果测试其中一路时,很难做到只给一路而不给其它三路供电。因此,为了方便测试,朋友问能否在四路同时供电的情况下测试每一路的噪声系数。如果这样测试,大体上会带来多大的误差? 图1. 四通道接收模块(只包含LNA) 四路LNA同时供电
[测试测量]
陕北—湖北特高压通道配套煤电规划获批,预计配置新能源项目6GW
据报道,近日国家能源局正式下发了《关于陕西陕北煤电基地陕北至湖北输电通道电源建设规划有关事项的复函》(国能电力〔2020〕14号),标志着陕北-湖北±800Kv特高压输电工程电源点方案获国家能源局批复。2月28日,国家电网宣布陕北至湖北±800千伏特高压直流工程正式开工。 此次复函为配套煤电产能的批示,拟规划建设规模796万千瓦。此外,文件明确要求,配套煤电项目要充分发挥调峰能力,为风电、光伏发电等新能源外送提供必要支持,保障新能源消纳能力。 文件还指出,要总结其他通道运行经验,逐渐提高外送电量中新能源占比,相应需新增的风电、光伏等新能源发电项目建设方案另行研究安排。 而据此前榆林日报报道,该项目设计年输送电量400
[新能源]
ARM嵌入式汽车节能控制系统
引言 由于各种原因,公交车总是不断重复加速—减速或停车—再加速的过程。通过加装本节能装置,当汽车需要制动时,在主控单元的控制下,可将汽车行驶时具有的巨大动能通过空气压缩机转化成高压气体的势能并储存起来,从而实现汽车减速或停车。当汽车需要启动或加速时,用储存起来的高压气体势能代替燃油来驱动汽车,从而实现汽车能量的回收再利用,达到节能的效果。同时由于汽车在起动或加速时能耗最大,如果汽车是用燃油驱动,则此时油料燃烧不充分,燃烧效果最差,而且产生的噪音最大。 系统工作原理 本系统主要由三部分组成,即检测部分,控制部分和执行机构。检测部分包括踏板位置传感器、曲轴位置传感器、压缩机活塞位置传感器、汽车运行速度传感器、储气罐压力传感器等信
[应用]
常见视频信号传输特性及转换深度分析
  1. 分量视频(Component Signal)   摄像机的光学系统将景像的光束分解为三种基本的彩色:红色、绿色和蓝色。感光器材再把三种单色图像转换成分离的电信号。为了识别图像的左边沿和顶部,电信号中附加有同步信息。显示终端与摄像机的同步信息可以附加在绿色通道上,有时也附加在所有的三个通道,甚至另作为一个或两个独立的通道进行传输,下面是几种常见的同步信号附加模式和表示方法:   - RGsB:同步信号附加在绿色通道,三根75Ω同轴电缆传输。   - RsGsBs:同步信号附加在红、绿、蓝三个通道,三根75Ω同轴电缆传输。   - RGBS:同步信号作为一个独立通道,四根75Ω同轴电缆传输。   - RGBHV:同步信号
[测试测量]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved