Autosar框架BSW层Adc模块

📅 发布时间:2026/10/6 8:05:57
Autosar框架BSW层Adc模块
Adc基础知识概念Adc是单片机的片上外设通过将模拟信号转换为数字信号adc信号通过采取通道对应的电压值然后再通过比例的方式将对应电话换算为对应的数字量如果是12bit的采样精度采样公式是4096/10*5然后是对应的数据值。S32K144 内部有 2 个独立的 12 位逐次逼近型 ADCADC0、ADC1 MCAL 驱动文件即Adc_Adc12bsarv2.c 。它本身只负责把电压转成数字而 转换的节拍由 PDBProgrammable 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通道都是一样的。层级容器含义物理转换器AdcHwUnitADC0/ADC1分辨率、参考电压、结果传送方式中断/DMA、转换时钟物理通道AdcChannelAN_0 到 AN_x引脚通道号、限值、可选的每通道采样参数逻辑转换任务AdcGroup要转哪些通道、谁触发、转一次还是连续、结果存哪、完成通知谁需要注意的是group与Channel通过引用AdcGroupDefinition多对关联一个Group引用若干Channel引用顺序就是结果缓冲区的下标顺序一个物理通道可被多个组复用。Adc特殊配置概念AccessMode概念SINGLE每次启动每个通道采一个值STRAMING:连续采N个值NAdcStreamingNumSamples 模式配置采样数据缓冲区可选LINEAR采满即停/CIRCULAR环形覆盖ConversionMode(转换模式)ONESHOT 启动后转完一遍组内通道就停CONTINOUS一遍接一遍直到停止TriggerSource(触发源)SW调用Adc_StartGroupConversion()这个是软件调用api进行触发的HW硬件触发通过在mcal中配置PDB的输入触发源然后ADC侧只选触发沿优先级与队列多组竞争同一 ADC 硬件时可配 NONE / HW / HW_SW 优先级加请求队列深度被高优先级打断的组按 Replacement 策略处理本实现固定 Abort/Restart结果传送转换完成靠 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); // 允许完成回调GrpNotifCapability1 才有 Adc_StartGroupConversion(AdcGroup_0); // SW 触发 // 组转换完成后在 AdcNotification() 回调中或主循环中 Adc_ReadGroup(AdcGroup_0, buf); // 读出结果在代码中必须先配置adc转换的数据存放区然后再软件调用api函数进行调用。Davinci软件中ADC配置参数表格在Davinci软件中配置Adc模块有很多参数选项是Autosar架构中特有的参数选项具体配置表格如下所示。AdcGeneral参数实例值作用与配置影响AdcDevErrorDetect1开发错误检测非法入参调 Det_ReportError()ADC 的 ModuleId123。调试期开、量产关AdcDeInitApi1是否编译 Adc_DeInit()AdcReadGroupApi1是否编译 Adc_ReadGroup()读结果必备AdcEnableStartStopGroupApi1是否编译 Adc_StartGroupConversion()/StopGroupConversion()SW 触发必备AdcHwTriggerApi0是否编译 Adc_EnableHardwareTrigger()/DisableHardwareTrigger()。用硬件触发组时必须置 1AdcGrpNotifCapability1是否提供运行时使能/关闭组通知的 APIAdcEnableLimitCheck0全局限值检查总开关置 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 VrefAdcOffsetCorrectionValue0写入 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实现特定参数硬件触发经由 PDBHW 触发源实际在 Mcl 模块中配置 TRGMUX 到 PDBAdcGroupInBacktoBackMode1多通道组关键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_0Source/EnableADC0_COCO / 1ADC0 转换完成COCO中断是否编入驱动。只要 ADC0 上有中断方式的组就必须使能AdcInterrupt_1Source/EnableADC1_COCO / 0ADC1 COCO 中断本工程未用 ADC1 故关闭同时要记得在 Os 模块里为该中断号配置对应的 ISRCat.2否则进不了回调。PublishedInformation / CommonPublishedInformationAdcMaxChannelResolution 12硬件最大分辨率AdcChannelValueSigned 0结果无符号AdcGroupFirstChannelFixed 0组首通道可自由配置CommonModuleId123、VendorId43NXP、AUTOSAR 4.2.2、驱动 1.0.0。NonAutosar参数作用开启后的影响AdcEnableDmaTrasferMode全局允许 DMA 传送的代码编译关则任何单元都不能配 DMAAdcEnableCalibration提供非标准 Adc_Calibrate()做出厂/上电自校准提升精度AdcEnableSetChannel提供 Adc_SetChannel() 动态改通道配合 AdcEnableInitialNotificationAdcEnableDualClockMode提供 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/HardwareGroup与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模式为LinearDavinci软件配置ECUM添加Adc_Init初始化函数同时因为Adc模块没有在工程中添加当从SIP包中添加了模块之后需要添加Init函数来对模块完成对应的初始化这里在Ecum中的初始化位置。添加一个模块然后配置这个模块对应的初始化参数。对应初始化名字与初始化文件还有初始化参数如下所示。同时需要注意的是如果是Adc配置参数有问题在配置Davinci软件生成代码的时候工程是会报错的但是工程报错是不会报对应问题的错误的。正确配置Davinci软件没有出现报错。错误配置Davinci软件提示EB证书有问题。下面是在IAR中添加对应的编译文件与对应的编译工程。希望对你有所帮助