☰
Autosar框架BSW层Adc模块
2026/10/6 8:05:36 网站建设 项目流程

Adc基础知识概念

Adc是单片机的片上外设,通过将模拟信号转换为数字信号,adc信号通过采取通道对应的电压值,然后再通过比例的方式将对应电话换算为对应的数字量,如果是12bit的采样精度,采样公式是4096/10*5然后是对应的数据值。
S32K144 内部有 2 个独立的 12 位逐次逼近型 ADC(ADC0、ADC1) ,MCAL 驱动文件即`Adc_Adc12bsarv2.c` 。它本身只负责"把电压转成数字",而 转换的节拍由 PDB(Programmable Delay Block,可编程延时模块,`Adc_Pdb.c` )触发 ,这是 S32K 系列 AUTOSAR ADC 架构最需要先理解的一点:

触发源(软件 / TRGMUX外部事件:FTM/PDB/LPTMR/RTC…) │ ▼ PDB 计数器/通道(每个 PDB 通道 8 个 pretrigger,可延时、可背靠背) │ pretrigger 依次启动 ▼ ADC0/1 的 SC1[n] 通道转换 → 结果进 R[n] → COCO 置位 │ ▼ COCO 中断(AdcInterrupt)或 DMA 搬入结果缓冲区 │ ▼ 组完成通知 AdcNotification() → 应用调 Adc_ReadGroup() 取值

adc中PDB模块类似与定时器当MOD设定值与CNT当前计数值累积到设定值,会对ADHWT输出脉冲,然后这个时候会触发ADC模块进行转换,当ADC中断触发转换完成之后,中断服务函数对PDB模块计数器值清零,然后开始下一次触发。

Autosar架构中Adc对应配置

在Autosar架构下,具体配置不同的是多了一个AdcGroup,其他物理adc配置外设,adc通道都是一样的。

层级容器含义
物理转换器AdcHwUnit(ADC0/ADC1)分辨率、参考电压、结果传送方式(中断/DMA)、转换时钟
物理通道AdcChannel(AN_0 到 AN_x)引脚通道号、限值、可选的每通道采样参数
逻辑转换任务AdcGroup要转哪些通道、谁触发、转一次还是连续、结果存哪、完成通知谁

需要注意的是group与Channel通过引用AdcGroupDefinition多对关联:一个Group引用若干Channel,引用顺序就是结果缓冲区的下标顺序,一个物理通道可被多个组复用。

Adc特殊配置概念

AccessMode概念:

SINGLE:每次启动每个通道采一个值

STRAMING:连续采N个值,N=AdcStreamingNumSamples 模式配置采样数据,缓冲区可选LINEAR采满即停/CIRCULAR环形覆盖

ConversionMode(转换模式)

ONESHOT :启动后转完一遍组内通道就停

CONTINOUS:一遍接一遍直到停止

TriggerSource(触发源)

SW:调用Adc_StartGroupConversion()这个是软件调用api进行触发的

HW:硬件触发,通过在mcal中配置PDB的输入触发源,然后ADC侧只选触发沿

  1. 优先级与队列:多组竞争同一 ADC 硬件时,可配 NONE / HW / HW_SW 优先级加请求队列深度;被高优先级打断的组按 Replacement 策略处理(本实现固定 Abort/Restart);
  2. 结果传送:转换完成靠 COCO 中断或 DMA 把 R[n] 搬到用户结果缓冲区;AdcWithoutInterrupts 是特例(仅单通道组,无中断、直接读寄存器)。

Adc触发流程图

Adc软件触发转换时,可以通过软件触发或者硬件触发,触发之后有单次转换模式与支持转化模式,具体如下流程图所示。

在转换完成之后,会将Adc数据存放到Buff中去,如果是Single模式只转换为一个数据,如果是Streaming模式下的Linear模式只转化AdcStreamingNumSamples对应的数据就会停止转换,然后如果是Cricular模式则会一直转换,转换中的数据如果满了之后会一直会从头开始进行覆盖。

同时需要注意的是,Buffer Size大小需要设置正确如果设置不正确会导致溢出,同时计算方法为Buff size = Channel * StreamSampleNum。

Adc调用配置软件流程

软件Adc调用配置api函数具体如下所示,

Adc_Init(&AdcConfigSet); // 初始化 ADC0/1、PDB Adc_SetupResultBuffer(AdcGroup_0, buf); // 必须先挂结果缓冲区 Adc_EnableGroupNotification(AdcGroup_0); // 允许完成回调(GrpNotifCapability=1 才有) Adc_StartGroupConversion(AdcGroup_0); // SW 触发 // 组转换完成后,在 AdcNotification() 回调中或主循环中: Adc_ReadGroup(AdcGroup_0, buf); // 读出结果

在代码中必须先配置adc转换的数据存放区,然后再软件调用api函数进行调用。

Davinci软件中ADC配置参数表格

在Davinci软件中配置Adc模块有很多参数选项是Autosar架构中特有的参数选项,具体配置表格如下所示。

AdcGeneral

参数实例值作用与配置影响
AdcDevErrorDetect1开发错误检测,非法入参调 Det_ReportError()(ADC 的 ModuleId=123)。调试期开、量产关
AdcDeInitApi1是否编译 Adc_DeInit()
AdcReadGroupApi1是否编译 Adc_ReadGroup(),读结果必备
AdcEnableStartStopGroupApi1是否编译 Adc_StartGroupConversion()/StopGroupConversion(),SW 触发必备
AdcHwTriggerApi0是否编译 Adc_EnableHardwareTrigger()/DisableHardwareTrigger()。用硬件触发组时必须置 1
AdcGrpNotifCapability1是否提供运行时使能/关闭组通知的 API
AdcEnableLimitCheck0全局限值检查总开关;置 1 后各通道的 High/LowLimit 才生效
AdcEnableQueuing1硬件忙时转换请求是否进队列排队
AdcPriorityImplementationADC_PRIORITY_NONE优先级机制:NONE / HW / HW_SW。NONE 时各组不抢占
AdcPriorityQueueMaxDepth1请求队列最大深度
AdcResultAlignmentADC_ALIGN_RIGHT原始结果在 16 位寄存器中右对齐/左对齐。直接决定数值换算(12 位右对齐满量程=4095,左对齐要右移 4 位)
AdcTimeout65535关硬件/校准时等待状态位的超时,超时上报 ADC_E_TIMEOUT 生产错误
AdcDmaTimeout65535等待 DMA 传送完成的超时(DMA 方式下用)
AdcVersionInfoApi1是否编译 Adc_GetVersionInfo()

AdcHwUnit_0

参数实例值作用与影响
AdcHwUnitIdADC0绑定物理转换器 ADC0(另可配 ADC1)。决定写哪组 ADCx_SC1/CR/PDB 寄存器
AdcLogicalUnitId0逻辑编号,API 内部用
AdcResolutionBITS_12转换精度:8/10/12 位。影响分辨率、转换时间和结果数值范围
AdcTransferTypeADC_INTERRUPT结果传送方式:中断 / DMA。DMA 限制见注意事项
AdcVoltageReferenceSelectionVREFH_VREFL参考电压对:VREFH/VREFL(外部基准脚)或 VALTH/VREFL(芯片供电)。换算公式:Vin = raw/4095 x Vref
AdcOffsetCorrectionValue0写入 ADC_OFS 偏移校正寄存器的数值,与转换结果相加后载入 R[n],用于消除零点偏移

AdcChannel_0

参数实例值作用
AdcChannelIdAN_0物理通道号(对应 ADC0_SE0/外部模拟引脚;可选项数量随封装不同,由 Adc_s32k144_lqfp100.epd 决定)。该引脚还必须在 Port 模块配为模拟功能
AdcLogicalChannelId0通道逻辑编号

AdcGroup_0

参数实例值作用与影响
AdcGroupId0组逻辑编号,API 入参句柄(生成符号名)
AdcGroupAccessModeADC_ACCESS_MODE_SINGLE单次/流式访问,决定缓冲区结构
AdcGroupConversionModeADC_CONV_MODE_ONESHOT单次扫描/连续扫描
AdcGroupConversionTypeADC_CONV_TYPE_NORMAL普通/注入(注入本实现不用)
AdcGroupTriggSrcADC_TRIGG_SRC_SW软件/硬件触发
AdcHwTrigSrcPDB实现特定参数:硬件触发经由 PDB(HW 触发源实际在 Mcl 模块中配置 TRGMUX 到 PDB)
AdcGroupInBacktoBackMode1多通道组关键:PDB pretrigger 背靠背,前一通道转完自动启动下一通道,无需软件干预
AdcGroupUsesChannelDelays0是否给每个 PDB pretrigger 配独立延时(用各通道 AdcChannelDelay)。本工程用背靠背,故关闭
AdcDelayNextPdb0组内通道超过 8 个、需用多个 PDB 通道时,PDB 通道之间的启动延时(须大于 8 通道转换总时间)
AdcStreamingBufferModeADC_STREAM_BUFFER_LINEAR流式缓冲区:线性(采满停止)/ 环形(覆盖旧值)
AdcStreamingNumSamples1流式模式下每通道采样数。缓冲区大小 = 通道数 x 此值
AdcEnableDoubleBuffering0双缓冲(仅硬件触发+流式+DMA 组可用),配合半满中断实现无抖动采集
AdcWithoutInterrupts0无中断模式(仅限单通道组):不产生中断、不使用结果缓冲区,需应用直接 Adc_ReadGroup() 读寄存器
AdcPdbPeriodContinuousMode0连续+无中断模式下 PDB 的重启周期,须保证所有通道在下轮启动前转完
AdcExtraNotificationNULL_PTR中断服务程序最开始调用的额外回调(在驱动更新硬件/状态前),可用于紧急动作
AdcNotification(本实例未配)NULL组转换正常完成回调,实际工程通常在这里置标志/唤醒任务
AdcGroupDefinition引用 AdcChannel_0本组包含哪些通道及其顺序(结果缓冲区下标顺序)

AdcInterrupt

参数实例值作用
AdcInterrupt_0:Source/EnableADC0_COCO / 1ADC0 转换完成(COCO)中断是否编入驱动。只要 ADC0 上有中断方式的组,就必须使能
AdcInterrupt_1:Source/EnableADC1_COCO / 0ADC1 COCO 中断,本工程未用 ADC1 故关闭

同时要记得在 Os 模块里为该中断号配置对应的 ISR(Cat.2),否则进不了回调。

PublishedInformation / CommonPublishedInformation

  • AdcMaxChannelResolution = 12:硬件最大分辨率;
  • AdcChannelValueSigned = 0:结果无符号;
  • AdcGroupFirstChannelFixed = 0:组首通道可自由配置;
  • Common:ModuleId=123、VendorId=43(NXP)、AUTOSAR 4.2.2、驱动 1.0.0。

NonAutosar

参数作用(开启后的影响)
AdcEnableDmaTrasferMode全局允许 DMA 传送的代码编译;关则任何单元都不能配 DMA
AdcEnableCalibration提供非标准 Adc_Calibrate(),做出厂/上电自校准提升精度
AdcEnableSetChannel提供 Adc_SetChannel() 动态改通道(配合 AdcEnableInitialNotification)
AdcEnableDualClockMode提供 Adc_SetClockMode(),双时钟模式(正常/低速)切换
AdcContinuousWithoutInterrupt全局允许连续+无中断模式
AdcBypassConsistencyLoop跳过硬件-软件状态一致性检查以提升性能,时序正确性由用户保证
AdcConvTimeOnce转换时间寄存器只在 Init 时写一次(省运行时开销)
AdcOptimizeOneShotHwTriggerConversionsHW 触发+单次+单访组的专用优化(限全工程组类型单一、不超过 8 通道)
AdcEnableDoubleBufferingOptimizationHW+单次+流式+环形组的双缓冲优化(每组仅 1 通道)
AdcUseHardwareNormalGroups使用硬件普通组时代码保留开关
AdcEnableGroupDependentChannelNames生成"组名_通道名"形式的符号下标宏
AdcEnableInitialNotification每次转换前的额外通知(配合 SetChannel 动态换通道)
AdcEnableUserModeSupport / AdcDisableDemReportErrorStatus用户模式支持 / 禁止向 Dem 上报错误

Adc对应Port配置

同时需要注意的是如果是配置Adc通道引脚,也需要配置对应的Port配置为输入,输入对应的参数也嘚进行配置,对应的Dio就不用进行配置了。

Davinci软件中Group/Channel/Hardware

Group与Channel是软件层面抽象出来的概念,这里的Channel可以说是不是逻辑通道,需要注意的是逻辑通道0不是只能与硬件通道0进行对应关联,而是可以进行任意映射,但是需要注意的是、

1、一个Channel必须挂靠在Group下,应用层与API都是操作Group,不能直接操作Ghannel,所以需要硬件Channel与Group进行关联

Davinci软件配置Adc模块

Davinci从Sip包中导入Adc模块

如果当前工程的Davinci配置软件中BSW层没有想要配置的外设模块能够从标准SIP包中导入对应配置的模块。

首先点击工程,然后工程设置。

然后在Moules中点击+号,然后选择从标准SIP包中进行导入。

然后在标准SIP包模块中选择自己需要的模块进行勾选,然后Finish进行导入。

然后配置Adc模块对应的参数配置。

Davinci软件ADC模块基础配置介绍

这里ADC配置选择对应的中断。

然后Adc1选择对应的COCO1

同时硬件配置选择对应的时钟,然后对应的硬件Adc外设,然后选择对应的分频系数,然后是对应的Adc分辨率,以及对应的参考电压。

然后配置选择对应的模拟输入通道。

配置对应的模式,同时在Group中选择对应的通道,需要注意的是这里Single模式,需要配置对应的Buff模式为Linear

Davinci软件配置ECUM添加Adc_Init初始化函数

同时因为Adc模块没有在工程中添加,当从SIP包中添加了模块之后,需要添加Init函数,来对模块完成对应的初始化,这里在Ecum中的初始化位置。

添加一个模块,然后配置这个模块对应的初始化参数。

对应初始化名字,与初始化文件,还有初始化参数如下所示。

同时需要注意的是,如果是Adc配置参数有问题,在配置Davinci软件生成代码的时候,工程是会报错的,但是工程报错是不会报对应问题的错误的。

正确配置Davinci软件没有出现报错。

错误配置Davinci软件提示,EB证书有问题。

下面是在IAR中添加对应的编译文件,与对应的编译工程。

希望对你,有所帮助!!!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询