目录
3.1.3 Adc_GetStreamLastPointer的使用方法
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.7 ADC State Diagram for Continuous Conversion Mode, Software Trigger Source, Single Access Mode
6.9 Adc_PriorityImplementationType
6.11 Adc_ChannelRangeSelectType
6.13 Adc_PowerStateRequestResultType
7.6 Adc_DisableHardwareTrigger
7.7 Adc_EnableGroupNotification
7.8 Adc_DisableGroupNotification
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
MCAL处于AUTOSAR架构的最底层,和具体的芯片强绑定,且不同的芯片使用不同的MCAL配置工具,例如英飞凌芯片系列使用EB配置MCAL,瑞萨芯片系列使用Davince配置MCAL。所以,除了AUTOSAR标准定义好的配置项及标准接口外,不同厂商的MCAL还会有独立于MCAL标准之外的配置,所以MCAL的学习最好是结合具体的工具和芯片来学习。本文为模拟-数字信号转换器Analog-to-digital converter模块详解篇。
参考文献:
1.Specification of ADC Driver?4.3.1
https://www.autosar.org/nc/document-search/
ADC模块处于AUTOSAR架构下的MCAL部分,ADC模块初始化并控制微控制器的内部模拟数字转换器单元。ADC模块分别提供启动和停止转换的服务,以启用和禁用转换的触发源。此外,它还提供了启用和禁用通知机制的服务,以及查询转换状态和结果的例程。ADC模块在所谓的ADC通道组上工作,它们是由所谓的ADC通道构建的。ADC通道组结合了模拟输入引脚(ADC通道)、所需的ADC电路本身和将结果寄存器转换为可单独控制和通过ADC模块访问的实体。
?
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。
1)MCU
微控制器单元驱动器(MCU驱动程序)主要负责初始化和控制芯片的内部时钟源和时钟预调节器。时钟频率可能会影响:
--?Trigger frequency
--?Conversion time
--?Sampling time
2)PORT
PORT模块应配置ADC模块使用的端口引脚。必须同时考虑模拟输入引脚和外部触发引脚。
下表显示了ADC用户可能需要的功能的列表,以及ADC模块所提供的功能的方式。此外,该表还描述了这些功能的可能实现。
?
?
示例配置由三个?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。
Std_ReturnType Adc_SetupResultBuffer
(Adc_GroupType Group, const Adc_ValueGroupType* DataBufferPtr)
?
用户必须为ADC Group结果提供应用程序结果缓冲区。每组需要一个缓冲区。如果选择了Streaming Access Mode,缓冲区大小取决于组通道数、Group访问模式和Stream采样数。在开始Group转换之前,用户必须使用API函数Adc_SetupResultBuffer初始化Group结果指针,该函数将Group结果指针初始化为指向指定的应用程序结果缓冲区。
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。
Std_ReturnType Adc_ReadGroup
(Adc_GroupType Group,Adc_ValueGroupType* DataBufferPtr)
?
如果启用了可选的API函数Adc_ReadGroup,则用户必须为所选组提供额外的缓冲区,该缓冲区可以保存一轮组转换的结果。调用Adc_ReadGroup将最新的结果从应用程序结果缓冲区复制到应用程序读取组缓冲区。在该示例中,一个应用程序读取缓冲区?(G2_G3_ReadBuffer)?用于组G2和G3。
以下示例根据组和转换类型指定了信道转换的顺序:
?
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(如果已启用)。
ADC模块具有一个状态机,如下图所示。这些状态是特定于组的,而不是特定于模块的。该图显示了ADC组的所有可能的配置选项。状态转换取决于ADC组的配置。
?
?
?
?
?
?
?
?
?
ADC通道类型,这里的通道是逻辑通道(软件定义),我们可以定义多个逻辑通道映射到同一个物理通道上。在实际项目中,我们一般逻辑通道数和物理通道数意义对应,也就是一个物理通道(外部传感器数据输入)对应一个逻辑通道。
?
ADC组也是逻辑组,我们可以定义多个组,每个组里面分配的Channel通道也是可以自由组合的。实际项目中,一般MCU有多少个ADC HW Unit就配置多少个Group,然后每个Group里面包含队医ADC HW Unit的所有物理Channel。
?
ADC状态指的是每一个Group的状态,而不是整个ADC模块的状态。如果Group Access Mode配置为Single或者Stream但是Stream缓存大小为1的话,Group的ADC_COMPLETE状态等同于ADC_STREAM_COMPLETED状态。
?
ADC转换触发源。
软件触发:
void Adc_StartGroupConversion(Adc_GroupType Group) -->?开始ADC转换
void Adc_StopGroupConversion(Adc_GroupType Group) -->?停止ADC转换
硬件触发:例如配置为PWM输入的双边沿触发ADC转换。
?
ADC_CONV_MODE_ONESHOT:在配置的触发事件之后,ADC通道组中的每个通道只执行一次转换。Group配置为软件触发的情况下,已启动的一次性转换可以通过软件API调用停止。Group配置为硬件触发的情况下,可以通过禁用触发事件(如果硬件支持)来停止已启动的一次性转换。
ADC_CONV_MODE_CONTINUOUS:对一个ADC信道组中的每个ADC信道进行重复转换。连续转换模式仅适用于配置为软件触发的Group。已启动的“连续转换”可以通过软件API调用停止。
?
ADC_STREAM_BUFFER_LINEAR:一旦流缓冲区已满(已到达的样本数量),ADC驱动程序就会立即停止转换。
ADC_STREAM_BUFFER_CIRCULAR:即使流缓冲区已满(到达的样本数量),ADC驱动程序也会继续转换。
?
ADC_ACCESS_MODE_SINGLE:每个通道Channel只缓存一个采样Sample数据。
ADC_ACCESS_MODE_STREAMING:每个通道(Channel)可以缓存多个采样(Sample)数据。
?
用于配置驱动程序应该在硬件触发信号的哪个边缘上进行反应的类型,即启动转换(仅在由ADC硬件支持的情况下)。
?
用于配置优先级化机制的类型。
?
如果组转换被具有更高优先级的组中断,则在ADC组级别上使用的替换机制。
ADC_GROUP_REPL_ABORT_RESTART:如果组被优先级更高的组中断,则在组级别上使用中止/重新启动机制。在更高优先级的组转换完成后,重启中断组(所有组通道)的完整转换轮。如果将组配置为流访问模式,则只丢弃中断的转换轮的结果。已写入结果缓冲区的先前转换轮的结果不受影响。
ADC_GROUP_REPL_SUSPEND_RESUME:如果一个组被优先级更高的组中断,则在组级别上使用暂停/恢复机制。在更高优先级的组转换完成后,中断组的转换回合将完成。已写入结果缓冲区的先前转换轮的结果不受影响。
?
?
在主动限制检查的情况下:定义哪些与通道低限制和通道高度限制定义的板相关的转换值。
?
?
?
使用存储转换结果的组缓冲区启动地址初始化ADC驱动程序。应用程序必须确保DataBufferPtr所指向的应用程序缓冲区能够保存指定组的所有转换结果。在重置后,需要使用Adc_SetupResultBuffer进行初始化,然后才能启动组转换。
?
启动所请求的ADC通道组的所有通道的转换。在开始调用Adc_StartGroupConversion函数开始ADC数据转换之前应该先调用Adc_SetupResultBuffer设置转换结果缓冲区。
?
停止所请求的ADC通道组的转换.。
?
?
读取请求组最后完成的转换轮的组转换结果,并从数据bufferPtr地址开始存储通道值。组通道值按通道编号递增顺序存储(如果配置了流媒体访问,则与结果缓冲区的存储布局相反)。
?
为所请求的ADC通道组启用硬件触发器。
?
?
?
为所请求的ADC通道组启用通知机制。
?
?
?
?
返回存储在结果缓冲区中的每个通道的有效样本数。读取一个指向组结果缓冲区中的一个位置的指针。使用指针位置,可以访问最后一次完成的转换轮的所有组通道的结果。使用指针和返回值,就可以访问所有有效的组转换结果(用户必须考虑结果缓冲区的布局)。
?
ADC_USER使用Adc_GetGroupStatus()函数轮询每一组(Group)的状态,直到Group状态为ADCU_STREAM_COMPLETED后调用Adc_ReadGroup()函数获取ADC转换结果。
?
使用ADC的Notification机制(ADC组完成数据转换后产生中断-->调用Notification函数-->调用Adc_ReadGroup)来读取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
?
本文详细介绍了AUTOSAR架构下的MCAL_ADC模块,着重需要理解ADC Channel,ADC Group,ADC Result Buffer等概念,以及各种Group Access Mode,Group Conversion Mode的特点。。实际项目中,需要更具具体项目的需求来配置MCAL_ADC模块,然后设计一个IoHwAb_ADC的模块来封装ADC的具体配置和使用细节,给应用层SWC提供统一的ADC数据访问接口。