【MCAL】ADC模块详解

2024-01-19 03:04
文章标签 模块 详解 adc mcal

本文主要是介绍【MCAL】ADC模块详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前言

正文

1.ADC模块介绍

2.关键概念及依赖的模块

2.1 ADC依赖的模块

3.ADC功能示例

3.1 ADC Buffer Access Mode示例

3.1.1配置(Configuration)

3.1.2 初始化(Initialization)

3.1.3 Adc_GetStreamLastPointer的使用方法

3.1.4 Adc_ReadGroup用法

4.ADC转换和交互

5.ADC状态机

5.1 ADC State Diagram for One-Shot/Continuous Group Conversion Mode

5.2 ADC State Diagram for HW/SW Trigger in One-Shot Group Conversion Mode

5.3 ADC State Diagram for SW Trigger in Continuous Conversion Mode

5.4 ADC State Diagram for One-Shot Conversion Mode, Software Trigger Source, Single Access Mode

5.5 ADC State Diagram for One-Shot Conversion, Hardware Trigger Source, Single Access Mode

5.6 ADC State Diagram for One-Shot Conversion Mode, Hardware Trigger Source, Linear and Circular Streaming Access Mode

5.7 ADC State Diagram for Continuous Conversion Mode, Software Trigger Source, Single Access Mode

5.8 ADC State Diagram for Continuous Conversion Mode, Software Trigger Source, Linear and Circular Streaming Access Mode

6.ADC重要数据类型

6.1 Adc_ChannelType

6.2 Adc_GroupType

6.3 Adc_StatusType

6.4 Adc_TriggerSourceType

6.5 Adc_GroupConvModeType

6.6 Adc_StreamBufferModeType

6.7 Adc_GroupAccessModeType

6.8 Adc_HwTriggerSignalType

6.9 Adc_PriorityImplementationType

6.10Adc_GroupReplacementType

6.11 Adc_ChannelRangeSelectType

6.12 Adc_ResultAlignmentType

6.13 Adc_PowerStateRequestResultType

7.ADC重要API

7.1 Adc_SetupResultBuffer

7.2 Adc_StartGroupConversion

7.3 Adc_StopGroupConversion

7.4 Adc_ReadGroup

7.5 Adc_EnableHardwareTrigger

7.6 Adc_DisableHardwareTrigger

7.7 Adc_EnableGroupNotification

7.8 Adc_DisableGroupNotification

7.9 Adc_GetGroupStatus

7.10 Adc_GetStreamLastPointer

8.ADC重要时序

8.1 Software triggered One-Shot conversion without notification

8.2 Software triggered continuous conversion with notification

8.3 Hardware triggered One-Shot conversion with notification

8.4One-Shot conversion - Linear Streaming

9.ADC配置实例

10.ADC使用示例

11.总结


前言

MCAL处于AUTOSAR架构的最底层,和具体的芯片强绑定,且不同的芯片使用不同的MCAL配置工具,例如英飞凌芯片系列使用EB配置MCAL,瑞萨芯片系列使用Davince配置MCAL。所以,除了AUTOSAR标准定义好的配置项及标准接口外,不同厂商的MCAL还会有独立于MCAL标准之外的配置,所以MCAL的学习最好是结合具体的工具和芯片来学习。本文为模拟-数字信号转换器Analog-to-digital converter模块详解篇

【MCAL】MCU模块详解

参考文献:

1.Specification of ADC Driver 4.3.1

https://www.autosar.org/nc/document-search/

正文

1.ADC模块介绍

ADC模块处于AUTOSAR架构下的MCAL部分,ADC模块初始化并控制微控制器的内部模拟数字转换器单元。ADC模块分别提供启动和停止转换的服务,以启用和禁用转换的触发源。此外,它还提供了启用和禁用通知机制的服务,以及查询转换状态和结果的例程。ADC模块在所谓的ADC通道组上工作,它们是由所谓的ADC通道构建的。ADC通道组结合了模拟输入引脚(ADC通道)、所需的ADC电路本身和将结果寄存器转换为可单独控制和通过ADC模块访问的实体。

图片

2.关键概念及依赖的模块

2.1 关键概念

ADC HW Unit: ADC硬件单元,表示一种微控制器输入电子设备,它包括执行“模拟到数字转换”所需的所有部件。简单理解就是,ADC硬件单元是集成在MCU内部的ADC控制器,MCU可以集成多个ADC硬件单元(ADC控制器)。

ADC Module:ADC模块,软件概念,ADC基本软件模块也就是ADC驱动程序,也缩写为ADC驱动程序。

ADC Channel:ADC通道,表示绑定到一个端口引脚的逻辑ADC实体。多个ADC实体可以映射到同一个端口引脚。实际配置中如果一个Pin映射一个ADC Channel,那么也就是一路外部ADC的数据由一路ADC Channel来获取。

ADC Channel Group:连接到同一ADC硬件单元的一组ADC通道(例如,一个采样和保持转换器和一个A/D转换器)。整个组的转换是由一个触发源触发的。简单理解,一个ADC HW Unit上的所有ADC Channel就属于哥ADC Group。

ADC Result Buffer:ADC驱动程序的用户必须为每个组提供一个缓冲区。如果选择了流媒体访问模式,该缓冲区可以保存同一组通道的多个样本。如果选择了单一访问模式,则在缓冲区中保留每个组通道的一个样本。

Software Trigger:启动一个ADC通道组或连续一系列ADC通道组转换的软件API调用。

Hardware Trigger:启动ADC通道组的一次转换的ADC内部触发信号。ADC硬件触发器在ADC硬件内部生成,例如基于ADC计时器或触发器边缘信号。触发器硬件是紧密耦合的或集成在ADC硬件中的。在检测到硬件触发器后,无需使用任何软件即可启动ADC通道组转换。

注意:如果ADC硬件不支持硬件触发器,则将软件触发器与GPT/ICU驱动程序结合使用,可以实现类似的行为。例如,在GPT计时器通知功能中,可以启动软件触发的ADC通道组转换

Conversion Mode:One-Shot:ADC通道组的转换在触发后执行一次,并将结果写入分配的结果缓冲区。触发器可以是软件API调用或硬件事件。Continuous:ADC通道组的转换在软件API调用(开始)后连续执行,并将结果写入分配的结果缓冲区。转换本身正在自动运行(受硬件/中断控制)。连续转换可以通过软件API调用(停止)来停止。

Sample Time:模拟值被采样的时间。

Conversion Time:将采样的模拟值转换为数字表示的时间。

Acquisition Time:Sample Time + Conversion Time。

2.1 ADC依赖的模块

1)MCU

微控制器单元驱动器(MCU驱动程序)主要负责初始化和控制芯片的内部时钟源和时钟预调节器。时钟频率可能会影响:

-- Trigger frequency

-- Conversion time

-- Sampling time

2)PORT

PORT模块应配置ADC模块使用的端口引脚。必须同时考虑模拟输入引脚和外部触发引脚。

3.ADC功能示例

下表显示了ADC用户可能需要的功能的列表,以及ADC模块所提供的功能的方式。此外,该表还描述了这些功能的可能实现。

图片

3.1 ADC Buffer Access Mode示例

3.1.1配置(Configuration)

图片

示例配置由三个 ADC Group组成。Group G1包含2个通道,Group G2和Group G3各包含一个通道。对于G1 和G2,Group访问模式 配置为ADC_ACCESS_MODE_STREAMING。G3的Group访问模式为ADC_ACCESS_MODE_SINGLE。ADC 驱动程序将Group 1-3 的转换结果存储在三个应用程序缓冲区中,通过三个配置的 ADC_RESULT_POINTER 访问:G1_ResultPtr、G2_ResultPtr 和 G3_ResultPtr。

3.1.2 初始化(Initialization)

Std_ReturnType Adc_SetupResultBuffer

(Adc_GroupType Group, const Adc_ValueGroupType* DataBufferPtr)

图片

用户必须为ADC Group结果提供应用程序结果缓冲区。每组需要一个缓冲区。如果选择了Streaming Access Mode,缓冲区大小取决于组通道数、Group访问模式和Stream采样数。在开始Group转换之前,用户必须使用API函数Adc_SetupResultBuffer初始化Group结果指针,该函数将Group结果指针初始化为指向指定的应用程序结果缓冲区。

3.1.3 Adc_GetStreamLastPointer的使用方法

Adc_StreamNumSampleType	  Adc_GetStreamLastPointer

(Adc_GroupType  Group,  Adc_ValueGroupType**  PtrToSamplePtr)

图片

ADC 驱动程序将G1、G2 和 G3组的转换结果存储在相应的结果缓冲区 G1_ResultBuffer[]、G2_ResultBuffer[] 和 G3_ResultBuffer[]中。ADC驱动程序不支持从ADC API函数直接访问ADC硬件结果寄存器。

用户提供三个指针 G1_SamplePtr、G2_SamplePtr 和 G3_SamplePtr调用Adc_GetStreamLastPointer后会指向ADC申请结果缓冲区。精确的指针G1_SamplePtr在调用Adc_GetStreamLastPointer后指向最近完成的转换回合的最新G1_CH0结果(G1_CH0是G1组定义中的第一个通道)。group 1的应用结果缓冲区保存了 G1_CH0 的3份Stream结果,以及G1_CH1的3份Stream结果。了解应用程序结果缓冲区布局,用户可以访问最新一轮转换的所有组通道结果。G2_SamplePtr和G3_SamplePtr也对齐,调用Adc_GetStreamLastPointer后,指向对应组的第一个组通道的最新结果。两组都只有一个频道。G2_SamplePtr 指向G2_CH2结果之一(最新结果)。由于G3配置为Single Access Mode,因此G3_SamplePtr始终指向G3_CH3。

3.1.4 Adc_ReadGroup用法

Std_ReturnType Adc_ReadGroup

(Adc_GroupType Group,Adc_ValueGroupType* DataBufferPtr)

图片

如果启用了可选的API函数Adc_ReadGroup,则用户必须为所选组提供额外的缓冲区,该缓冲区可以保存一轮组转换的结果。调用Adc_ReadGroup将最新的结果从应用程序结果缓冲区复制到应用程序读取组缓冲区。在该示例中,一个应用程序读取缓冲区 (G2_G3_ReadBuffer) 用于组G2和G3。

4.ADC转换和交互

以下示例根据组和转换类型指定了信道转换的顺序:

Example 1:包含通道[CH0、CH1、CH2、CH3 和 CH4]的通道组配置为连续转换模式。完成每次扫描后,将调用Notification(如果已启用)。然后自动开始新的扫描。

Example 2:包含通道[CH0、CH1、CH2、CH3 和 CH4]的通道组配置为One-Shot转换模式。完成扫描后,将调用Notification(如果已启用)。

Example 3:包含通道[CH3]的通道组配置为连续转换模式。完成每次扫描后,将调用Notification(如果已启用)。然后自动开始新的扫描。

Example 4:包含通道[CH4]的通道组配置为One-Shot转换模式。完成扫描后,将调用Notification(如果已启用)。

5.ADC状态机

ADC模块具有一个状态机,如下图所示。这些状态是特定于组的,而不是特定于模块的。该图显示了ADC组的所有可能的配置选项。状态转换取决于ADC组的配置。

5.1 ADC State Diagram for One-Shot/Continuous Group Conversion Mode

5.2 ADC State Diagram for HW/SW Trigger in One-Shot Group Conversion Mode

5.3 ADC State Diagram for SW Trigger in Continuous Conversion Mode

5.4 ADC State Diagram for One-Shot Conversion Mode, Software Trigger Source, Single Access Mode

5.5 ADC State Diagram for One-Shot Conversion, Hardware Trigger Source, Single Access Mode

5.6 ADC State Diagram for One-Shot Conversion Mode, Hardware Trigger Source, Linear and Circular Streaming Access Mode

5.7 ADC State Diagram for Continuous Conversion Mode, Software Trigger Source, Single Access Mode

5.8 ADC State Diagram for Continuous Conversion Mode, Software Trigger Source, Linear and Circular Streaming Access Mode

6.ADC重要数据类型

6.1 Adc_ChannelType

图片

ADC通道类型,这里的通道是逻辑通道(软件定义),我们可以定义多个逻辑通道映射到同一个物理通道上。在实际项目中,我们一般逻辑通道数和物理通道数意义对应,也就是一个物理通道(外部传感器数据输入)对应一个逻辑通道。

6.2 Adc_GroupType

图片

ADC组也是逻辑组,我们可以定义多个组,每个组里面分配的Channel通道也是可以自由组合的。实际项目中,一般MCU有多少个ADC HW Unit就配置多少个Group,然后每个Group里面包含队医ADC HW Unit的所有物理Channel。

6.3 Adc_StatusType

图片

ADC状态指的是每一个Group的状态,而不是整个ADC模块的状态。如果Group Access Mode配置为Single或者Stream但是Stream缓存大小为1的话,Group的ADC_COMPLETE状态等同于ADC_STREAM_COMPLETED状态。

6.4 Adc_TriggerSourceType

图片

ADC转换触发源。

软件触发:

void Adc_StartGroupConversion(Adc_GroupType Group) --> 开始ADC转换

void Adc_StopGroupConversion(Adc_GroupType Group) --> 停止ADC转换

硬件触发:例如配置为PWM输入的双边沿触发ADC转换。

6.5 Adc_GroupConvModeType

图片

ADC_CONV_MODE_ONESHOT:在配置的触发事件之后,ADC通道组中的每个通道只执行一次转换。Group配置为软件触发的情况下,已启动的一次性转换可以通过软件API调用停止。Group配置为硬件触发的情况下,可以通过禁用触发事件(如果硬件支持)来停止已启动的一次性转换。

ADC_CONV_MODE_CONTINUOUS:对一个ADC信道组中的每个ADC信道进行重复转换。连续转换模式仅适用于配置为软件触发的Group。已启动的“连续转换”可以通过软件API调用停止。

6.6 Adc_StreamBufferModeType

图片

ADC_STREAM_BUFFER_LINEAR:一旦流缓冲区已满(已到达的样本数量),ADC驱动程序就会立即停止转换。

ADC_STREAM_BUFFER_CIRCULAR:即使流缓冲区已满(到达的样本数量),ADC驱动程序也会继续转换。

6.7 Adc_GroupAccessModeType

图片

ADC_ACCESS_MODE_SINGLE:每个通道Channel只缓存一个采样Sample数据。

ADC_ACCESS_MODE_STREAMING:每个通道(Channel)可以缓存多个采样(Sample)数据。

6.8 Adc_HwTriggerSignalType

图片

用于配置驱动程序应该在硬件触发信号的哪个边缘上进行反应的类型,即启动转换(仅在由ADC硬件支持的情况下)。

6.9 Adc_PriorityImplementationType

图片

用于配置优先级化机制的类型。

6.10Adc_GroupReplacementType

图片

如果组转换被具有更高优先级的组中断,则在ADC组级别上使用的替换机制。

ADC_GROUP_REPL_ABORT_RESTART:如果组被优先级更高的组中断,则在组级别上使用中止/重新启动机制。在更高优先级的组转换完成后,重启中断组(所有组通道)的完整转换轮。如果将组配置为流访问模式,则只丢弃中断的转换轮的结果。已写入结果缓冲区的先前转换轮的结果不受影响。

ADC_GROUP_REPL_SUSPEND_RESUME:如果一个组被优先级更高的组中断,则在组级别上使用暂停/恢复机制。在更高优先级的组转换完成后,中断组的转换回合将完成。已写入结果缓冲区的先前转换轮的结果不受影响。

6.11 Adc_ChannelRangeSelectType

图片

图片

在主动限制检查的情况下:定义哪些与通道低限制和通道高度限制定义的板相关的转换值。

6.12 Adc_ResultAlignmentType

图片

6.13 Adc_PowerStateRequestResultType

图片

7.ADC重要API

7.1 Adc_SetupResultBuffer

图片

使用存储转换结果的组缓冲区启动地址初始化ADC驱动程序。应用程序必须确保DataBufferPtr所指向的应用程序缓冲区能够保存指定组的所有转换结果。在重置后,需要使用Adc_SetupResultBuffer进行初始化,然后才能启动组转换。

7.2 Adc_StartGroupConversion

图片

启动所请求的ADC通道组的所有通道的转换。在开始调用Adc_StartGroupConversion函数开始ADC数据转换之前应该先调用Adc_SetupResultBuffer设置转换结果缓冲区。

7.3 Adc_StopGroupConversion

图片

停止所请求的ADC通道组的转换.。

7.4 Adc_ReadGroup

图片

图片

读取请求组最后完成的转换轮的组转换结果,并从数据bufferPtr地址开始存储通道值。组通道值按通道编号递增顺序存储(如果配置了流媒体访问,则与结果缓冲区的存储布局相反)。

7.5 Adc_EnableHardwareTrigger

图片

为所请求的ADC通道组启用硬件触发器。

7.6 Adc_DisableHardwareTrigger

图片

7.7 Adc_EnableGroupNotification

图片

图片

为所请求的ADC通道组启用通知机制。

7.8 Adc_DisableGroupNotification

图片

图片

7.9 Adc_GetGroupStatus

图片

7.10 Adc_GetStreamLastPointer

图片

返回存储在结果缓冲区中的每个通道的有效样本数。读取一个指向组结果缓冲区中的一个位置的指针。使用指针位置,可以访问最后一次完成的转换轮的所有组通道的结果。使用指针和返回值,就可以访问所有有效的组转换结果(用户必须考虑结果缓冲区的布局)。

8.ADC重要时序

8.1 Software triggered One-Shot conversion without notification

ADC_USER使用Adc_GetGroupStatus()函数轮询每一组(Group)的状态,直到Group状态为ADCU_STREAM_COMPLETED后调用Adc_ReadGroup()函数获取ADC转换结果。

8.2 Software triggered continuous conversion with notification

使用ADC的Notification机制(ADC组完成数据转换后产生中断-->调用Notification函数-->调用Adc_ReadGroup)来读取ADC转换数据。

8.3 Hardware triggered One-Shot conversion with notification

8.4One-Shot conversion - Linear Streaming

9.ADC配置实例

关注本公众号,后面具体项目实战会详细介绍。

10.ADC使用示例

实际项目开发中我们一般会设计一个IoHwAb_Adc模块,ADC功能的使用模块就可以封装ADC模块提供的AUTOSAR标准接口来实现特定的需求。一般我们会在IoHwAb模块分装ADC模块的使用细节,让ASW直接使用IoHwAb模块分装后的接口。

如下图所示:

模块名:IoHwAb_Adc

模块的Runnable:IoHwAb_Init,IoHwAb_Mainfunction

模块提供的接口:IoHwAb_Adc_GetAdcValue,IoHwAb_Adc_GetBaseVoltage,IoHwAb_Adc_GetRawSignal,IoHwAb_Adc_GetFilterSignal

模块使用的接口:Adc_SetupResultBuffer,Adc_StartGroupConversion,Adc_ReadGroup

11.总结

本文详细介绍了AUTOSAR架构下的MCAL_ADC模块,着重需要理解ADC Channel,ADC Group,ADC Result Buffer等概念,以及各种Group Access Mode,Group Conversion Mode的特点。。实际项目中,需要更具具体项目的需求来配置MCAL_ADC模块,然后设计一个IoHwAb_ADC的模块来封装ADC的具体配置和使用细节,给应用层SWC提供统一的ADC数据访问接口。

这篇关于【MCAL】ADC模块详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/621082

相关文章

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

CSS3中的字体及相关属性详解

《CSS3中的字体及相关属性详解》:本文主要介绍了CSS3中的字体及相关属性,详细内容请阅读本文,希望能对你有所帮助... 字体网页字体的三个来源:用户机器上安装的字体,放心使用。保存在第三方网站上的字体,例如Typekit和Google,可以link标签链接到你的页面上。保存在你自己Web服务器上的字

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

Mybatis Plus Join使用方法示例详解

《MybatisPlusJoin使用方法示例详解》:本文主要介绍MybatisPlusJoin使用方法示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录1、pom文件2、yaml配置文件3、分页插件4、示例代码:5、测试代码6、和PageHelper结合6

一文全面详解Python变量作用域

《一文全面详解Python变量作用域》变量作用域是Python中非常重要的概念,它决定了在哪里可以访问变量,下面我将用通俗易懂的方式,结合代码示例和图表,带你全面了解Python变量作用域,需要的朋友... 目录一、什么是变量作用域?二、python的四种作用域作用域查找顺序图示三、各作用域详解1. 局部作