STM32G474采用“多个单通道ADC转换”读取3个ADC引脚的电压

STM32G474采用“多个单通道ADC转换”读取3个ADC引脚的电压:PC0、PA1和PA2。本测试将ADC1_IN6映射到PC0引脚,ADC12_IN2映射到PA1引脚,ADC1_IN3映射到PA2引脚。

 1、ADC输入

ADC输入电压范围:Vref– ≤ VIN ≤ Vref+


ADC支持“单端输入”:
在“单端输入模式”下,“通道i”的模拟电压等于VINP[i]和VREF-之间的差值


ADC支持“差动输入”:
在“差动输入模式”下,“通道i”的模拟电压等于VINP[i]和VINN[i]之间的差值
1)、当VINP[i]等于VREF-时,VINN[i]等于VREF+,最大负输入差分电压(VREF-)对应于0x000 ADC输出;
2)、当VINP[i]等于VREF+时,VINN[i]等于VREF-,最大正输入差分电压(VREF+)对应于0xFFF ADC输出;
3)、当VINP[i]和VINN[i]连接在一起时,零输入差分电压对应于0x800 ADC输出;

2、测试程序

ADC_HandleTypeDef   hadc1;
__IO uint16_t ADC1_RESULT[3];

void ADC1_Init(void);
void Read_ADC_Value_Use_SoftwareTriger(void);

void ADC1_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* Peripheral clock enable */
  __HAL_RCC_ADC12_CLK_ENABLE(); //使能“ADC1和ADC2时钟”
    __HAL_RCC_GPIOC_CLK_ENABLE(); //使能“PC口时钟”

  GPIO_InitStruct.Pin = GPIO_PIN_0;        //选择编号为0的引脚
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; //模拟模式
  GPIO_InitStruct.Pull = GPIO_NOPULL;      //引脚上拉和下拉都没有被激活
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    //根据GPIO_InitStruct结构变量指定的参数初始化GPIOC的外设寄存器
    //将ADC1_IN6映射到PC0引脚

    __HAL_RCC_GPIOA_CLK_ENABLE();              //使能“PA口时钟”
  GPIO_InitStruct.Pin=GPIO_PIN_1|GPIO_PIN_2; //选择编号为1和2的引脚
  GPIO_InitStruct.Mode=GPIO_MODE_ANALOG;          //模拟模式
  GPIO_InitStruct.Pull=GPIO_NOPULL;                  //引脚上拉和下拉都没有被激活
  HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);
    //根据GPIO_InitStruct结构变量指定的参数初始化GPIOA的外设寄存器
    //将ADC12_IN2映射到PA1引脚,将ADC1_IN3映射到PA2引脚

/***********************************************/
    hadc1.Instance = ADC1;   //选择ADC1
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
    //分频系数:4分频,ADCCLK=PCLK2/4=170/4=42.5MHZ
    //设置ADCx_CCR寄存器bit17:16(CKMODE[1:0]]),CKMODE[1:0]=11,adc_hclk/4

  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
    //分辨率:12位模式
    //设置ADC_CFGR寄存器bit4:3(RES[1:0]),令RES[1:0]=00b,AD转换结果为12位

  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    //对齐方式:右对齐
    //设置ADC_CFGR寄存器bit15(ALIGN位),令ALIGN=0,AD转换结果为“右对齐”

  hadc1.Init.GainCompensation = 0;
    //ADC增益设置为0
    //设置ADC_CFGR2寄存器bit16(GCOMP),令GCOMP=0,常规ADC工作模式

  hadc1.Init.NbrOfConversion = 1;
    //“正则通道序列长度”为1,只有有1个AD转换
    //设置ADC_SQR1寄存器的bit3:0(L[3:0]),令L[3:0]=1-1,表示“正则通道序列长度”为1,有1个AD转换

    hadc1.Init.NbrOfDiscConversion=0;//不连续采样通道数为0
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
    //因为hadc1.Init.NbrOfConversion = 1,所以要使用“单通道转换”
    //如果是单通道转换使用ADC_SCAN_DISABLE
    //如果是多通道转换使用ADC_SCAN_ENABLE。

  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    //ADC触发源选择“软件触发AD转换”
    //设置HRTIM->ADC1R寄存器bit5(ADC1EEV1位),ADC1EEV1=0,使用“内部软件”触发一次ADC转换

  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
    //上升沿触发
    //设置ADC->CFGR寄存器bit11:10(EXTEN[1:0]),EXTEN[1:0]=01b,硬件触发检测为上升沿

  hadc1.Init.ContinuousConvMode = DISABLE;
    //因为要采用“软件触发AD转换”,所以要用“单次转换”
    //使用ENABLE配置为使能自动连续转换;
    //使用DISABLE配置为单次转换,转换一次后停止,需要手动控制才重新启动转换
    //设置ADC_CFGR寄存器bit13(CONT位),令CONT=1,ADC采用“连续转换模式”

    hadc1.Init.SamplingMode=ADC_SAMPLING_MODE_NORMAL;
    //设置ADC_CFGR2寄存器bit27(SMPTRIG),令SMPTRIG=0,禁用“ADC轮询采样模式”
    //ADC转换采样相位持续时间

  hadc1.Init.DiscontinuousConvMode = DISABLE;
    //设置ADC_CFGR寄存器bit16(DISCEN位),令DISCEN=0,对于常规通道,禁止“不连续采样模式”

  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
    //ADC_EOC_SINGLE_CONV和 ADC_EOC_SEQ_CONV,指定转换结束时是否产生EOS中断或事件标志
    //配置ADC_IER寄存器bit2(EOCIE位),EOCIE=1,使能ADC转换完成产生中断

  hadc1.Init.LowPowerAutoWait = DISABLE;
    //配置是否使用低功耗自动延迟等待模式:关闭低功耗模式
    //配置ADC_CR寄存器bit29(DEEPPWD位),令DEEPPWD=0,ADC not in Deep-power down
    //可选参数为 ENABLE 和DISABLE,当使能时,仅当一组内所有之前的数据已处理完毕时
    //才开始新的转换,适用于低频应用。该模式仅用于 ADC 的轮询模式,不可用于 DMA 以及中断

  hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
    //数据溢出覆盖;当过载发生时,使用ADC_DR的新值覆盖
    //设置ADC_CFGR寄存器bit12(OVRMOD),令OVRMOD=1,当检测到溢出时,将用最后一个转换结果覆盖ADC_DR寄存器

  hadc1.Init.OversamplingMode = DISABLE;
    //设置ADC_CFGR2寄存器bit27(SMPTRIG),令SMPTRIG=1,启用过采样功能
    //这里需要设置为DISABLE,否则数据会发生错误,不清楚HAL库这么做,有什么用

  hadc1.Init.DMAContinuousRequests = DISABLE;
    //不开启DMA请求连续模式或者单独模式
    //设置ADC_CFGR寄存器bit0(DMAEN),令DMAEN=0,不使能DMA

    HAL_ADC_Init(&hadc1);
}

void Read_ADC_Value_Use_SoftwareTriger(void)
{
    float f;
    ADC_ChannelConfTypeDef sConfig = {0};

    LED1_Toggle();

  sConfig.Channel = ADC_CHANNEL_6;//ADC通道6,前面已将ADC1_IN6映射到PC0引脚
  sConfig.Rank = ADC_REGULAR_RANK_1;
    //设置ADC_SQR1寄存器bit10:6(SQ1[4:0]),SQ1[4:0]=6,即AD通道6的序号为1
    //AD转换顺序排列:配置通道3位于“第1个序列”

  sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
    //采样时间
    //设置ADC_SMPR1寄存器bit8:6(SMP2[2:0]),SMP2[2:0]=000b,2.5 ADC clock cycles

  sConfig.SingleDiff = ADC_SINGLE_ENDED;
    //配置ADC通道输入为“单端模式”,非“差动输入模式”
  sConfig.OffsetNumber = ADC_OFFSET_NONE;//无偏移数量
  sConfig.Offset = 0;//偏移量=0
    HAL_ADC_ConfigChannel(&hadc1, &sConfig);//配置AD通道6的序号为1
    HAL_ADC_Start(&hadc1);//启动一次AD转换
    HAL_ADC_PollForConversion(&hadc1,10);
    //等待“常规组”转换完成
    //Wait for regular group conversion to be completed

  ADC1_RESULT[0]=HAL_ADC_GetValue(&hadc1);
    //获取ADC“常规组”转换结果
    //Get ADC regular group conversion result.
//    HAL_ADC_Stop(&hadc1);
    //停止常规组的ADC转换,禁用ADC外设。
    //Stop ADC conversion of regular group,disable ADC peripheral.


  sConfig.Channel = ADC_CHANNEL_2;//ADC通道6,前面已将ADC12_IN2映射到PA1引脚
  sConfig.Rank = ADC_REGULAR_RANK_1;
    //设置ADC_SQR1寄存器bit10:6(SQ1[4:0]),SQ1[4:0]=2,即AD通道2的序号为2
    //AD转换顺序排列:配置通道3位于“第1个序列”

  sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
    //采样时间
    //设置ADC_SMPR1寄存器bit8:6(SMP2[2:0]),SMP2[2:0]=000b,2.5 ADC clock cycles

  sConfig.SingleDiff = ADC_SINGLE_ENDED;
    //配置ADC通道输入为“单端模式”,非“差动输入模式”
  sConfig.OffsetNumber = ADC_OFFSET_NONE;//无偏移数量
  sConfig.Offset = 0;//偏移量=0
    HAL_ADC_ConfigChannel(&hadc1, &sConfig);//配置AD通道2的序号为2
    HAL_ADC_Start(&hadc1);//启动一次AD转换
    HAL_ADC_PollForConversion(&hadc1,10);
    //等待“常规组”转换完成
    //Wait for regular group conversion to be completed

  ADC1_RESULT[1]=HAL_ADC_GetValue(&hadc1);
    //获取ADC“常规组”转换结果
    //Get ADC regular group conversion result.


  sConfig.Channel = ADC_CHANNEL_3;//ADC通道3,前面已将ADC1_IN3映射到PA2引脚
  sConfig.Rank = ADC_REGULAR_RANK_1;
    //设置ADC_SQR1寄存器bit10:6(SQ1[4:0]),SQ1[4:0]=3,即AD通道3的序号为3
    //AD转换顺序排列:配置通道3位于“第1个序列”

  sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
    //采样时间
    //设置ADC_SMPR1寄存器bit8:6(SMP2[2:0]),SMP2[2:0]=000b,2.5 ADC clock cycles

  sConfig.SingleDiff = ADC_SINGLE_ENDED;
    //配置ADC通道输入为“单端模式”,非“差动输入模式”
  sConfig.OffsetNumber = ADC_OFFSET_NONE;//无偏移数量
  sConfig.Offset = 0;//偏移量=0
    HAL_ADC_ConfigChannel(&hadc1, &sConfig);//配置AD通道3的序号为3
  HAL_ADC_Start(&hadc1);//启动一次AD转换
    HAL_ADC_PollForConversion(&hadc1,10);
    //等待“常规组”转换完成
    //Wait for regular group conversion to be completed

  ADC1_RESULT[2]=HAL_ADC_GetValue(&hadc1);
    //获取ADC“常规组”转换结果
    //Get ADC regular group conversion result.

    printf("ADC1_RESULT[0]=0x%X\r\n",ADC1_RESULT[0]);
    printf("ADC1_RESULT[1]=0x%X\r\n",ADC1_RESULT[1]);
    printf("ADC1_RESULT[2]=0x%X\r\n",ADC1_RESULT[2]);

    f=ADC1_RESULT[0];f=f/4096;f=f*3300;
    printf("PC0=%0.1fmV\r\n",f);

    f=ADC1_RESULT[1];f=f/4096;f=f*3300;
    printf("PA1=%0.1fmV\r\n",f);

    f=ADC1_RESULT[2];f=f/4096;f=f*3300;
    printf("PA2=%0.1fmV\r\n",f);
}

3、测试结果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/412722.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 集合Collection(List、Set)Map

集合的理解和优点 1)可以动态保存任意多个对象,使用比较方便!2)提供了一系列方便的操作对象的方法: add、remove、 set、 get等3)使用集合添加,删除新元素的示意代码- Java集合的分类 Java的集合类很多,主要分为两大类,如图: 1…

iPhone备忘录不小心删除了怎么办?

在日常使用iPhone的过程中,备忘录作为我们记录重要信息、灵感闪现和日常琐事的小帮手,其重要性不言而喻。然而,有时候因为操作失误或是不小心点击,我们可能会将珍贵的备忘录内容删除,这无疑会让人感到焦虑与不安。但请…

深入垃圾回收:理解GC的核心算法与实现

垃圾回收(Garbage Collection,GC)是现代编程语言中一项关键技术。它不仅解决了内存管理中的诸多问题,还为开发者提供了一个更高效、更安全的编程环境。本文将深入探讨GC的起源、主要算法以及这些算法在不同编程语言中的具体实现。…

考试:计算机网络(01)

网络功能和分类 计算机网络是计算机技术与通信技术相结合的产物,它实现了远程通信、远程信息处理和资源共享。 计算机网络的功能:数据通信、资源共享、管理集中化、实现分布式处理、负载均衡。 网络性能指标:速率、带宽(频带宽度或传送线路…

嵌入式数据库

概述 1.作用:存储大量数据,专业存储数据 存储在内存(数组,变量,链表)上的特点:程序运行结束,或者掉电,数据会丢失。 存储在硬盘(文件)上的特点…

vue3+ts+vite项目代码检查报错(vue-tsc)

报错原因:vue-tsc与typescrip版本不兼容 排查流程: 1、开始以为vue-tsc或者typescript版本太低,通过npm update更新,更新后还是报错 2、项目中package.json文件中typescript、vue-tsc版本并无兼容问题 3、控制台执行npm list发…

【HarmonyOS】模仿个人中心头像图片,调用系统相机拍照,从系统相册选择图片和圆形裁剪显示 (一)

【HarmonyOS】头像图片,调用系统相机拍照,从系统相册选择图片和圆形裁剪显示 (一) Demo效果展示: 方案思路: 使用photoAccessHelper实现系统相册选择图片的功能。此API可在无需用户授权的情况下&#xff…

万亿生成式AI市场,商汤迎来“长坡厚雪”

AI掀起了全球科技玩家的军备竞赛,然而声浪越强噪音越多,这个领域的混乱程度也变得远超以往。就连刚刚公布财报的英伟达,市场也没有买账,因为担心AI驱动的增长高峰已过,接下来,下游会更看重实际成果。 “囤…

javaee、ssm(maven)、springboot(maven)项目目录结构以及编译后文件目录存放路径

javaee项目目录结构: src下的文件或者是源码编译后都会放在WebRoot(项目根目录)文件夹\WebRoot\WEB-INF\classes目录中。 编译后的文件夹目录如下: 以上为普通的javaee项目目录结构,同maven工程目录结构是不一样的。…

07-图5 Saving James Bond - Hard Version(C)

哈哈,我是真的服了,写了好几天结果给我个这,气死我了,果然还有很大的进步空间。如果有c测试点4,就好了。 又写了一天,是真解决不了了,这个问题等我明白一定来解答 哈哈, 测试点提示内…

【SQL】餐馆营业额七日均线数据

目录 题目 分析 代码 题目 表: Customer ------------------------ | Column Name | Type | ------------------------ | customer_id | int | | name | varchar | | visited_on | date | | amount | int | -----------------------…

Docker 数据卷管理及优化

目录 1 数据卷实现的目的 2 为什么要用数据卷 3 docker的两种数据卷 3.1 bind mount 数据卷 实践实例: 3.2 docker managed 数据卷 实验实例: 3.3 bind mount 数据卷和docker managed 数据卷的对比 3.3.1 相同点: 3.3.2 不同点: …

【网络安全】服务基础第一阶段——第二节:Windows系统管理基础----虚拟化IP地址以及用户与组管理

目录 一、Windows网络测试工具 1.1.ping命令 1.2.tracert命令 二、IP实验内容 2.1 实验一 2.2 实验二 三、用户与组管理 3.1 用户与账户概述 3.2 用户管理 3.3 用户增删改查 3.4 增加用户 3.5 修改用户属性 3.6 删除用户 3.7 组账户概述 3.8 组账户增删改查 四、…

没有编程基础?这款数据分析工具也能轻松上手

在当前快节奏的工业环境中,工厂管理者越来越依赖数据分析来优化生产流程、提升效率、降低成本。然而,很多传统的数据分析工具不仅操作复杂,而且费用高昂,让不少工厂望而却步。最近,我发现了一款非常实用的报表工具&…

安卓主板_MTK安卓主板定制_联发科主板/开发板方案

这款安卓主板采用了联发科的MTK8788、MTK8768及MTK8766系列芯片平台,运用了64位四核/八核 Cortex-A53/A73架构,主频高达2.0 GHz。主板配置了4GB LPDDR3内存和64GB eMMC存储,同时配备了ARM Mail-T450 MP2图形处理单元(GPU),使其在4…

Java性能优化传奇之旅--Java万亿级性能优化之电商平台高峰时段性能大作战:策略与趋势洞察

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【Linux】共享内存

目录 原理 代码 在之前,无论是匿名管道还是命名管道,说到底都是基于文件的通信,也就意味着没有为了通信让OS单独设计一套通信模块代码,而是直接复用内核中文件相关的数据结构、缓冲区、代码来实现通信的,这在一定程度…

ET6框架(七)Excel配置工具

文章目录 一、Excel表的基本规则:二、特殊特殊标记三、编译路径说明四、动态获取数据五、可导表类型查看: 一、Excel表的基本规则: 在框架中我们的Excel配置表在ET > Excel文件夹中 1.在表结构中需要注意的是起始点必须在第三行第三列,且…

鸿蒙开发 数组改变,ui渲染没有刷新

问题描述: 数组push, 数组长度改变,ui也没有刷新 打印出了数组 console.log(this.toDoData.map(item > ${item.name}).join(, ), this.toDoData.length) 原代码: Text().fontSize(36).margin({ right: 40 }).onClick(() > {TextPicker…

mysql学习教程,从入门到精通,MySQL介绍(1)

1、MySQL 教程 本教程是为初学者准备的,以帮助他们理解与MySQL语言相关的基础知识和高级概念。 mysql MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系…