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侧只选触发沿
- 优先级与队列:多组竞争同一 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); // 允许完成回调(GrpNotifCapability=1 才有) Adc_StartGroupConversion(AdcGroup_0); // SW 触发 // 组转换完成后,在 AdcNotification() 回调中或主循环中: Adc_ReadGroup(AdcGroup_0, buf); // 读出结果在代码中必须先配置adc转换的数据存放区,然后再软件调用api函数进行调用。
Davinci软件中ADC配置参数表格
在Davinci软件中配置Adc模块有很多参数选项是Autosar架构中特有的参数选项,具体配置表格如下所示。
AdcGeneral
| 参数 | 实例值 | 作用与配置影响 |
|---|---|---|
| AdcDevErrorDetect | 1 | 开发错误检测,非法入参调 Det_ReportError()(ADC 的 ModuleId=123)。调试期开、量产关 |
| AdcDeInitApi | 1 | 是否编译 Adc_DeInit() |
| AdcReadGroupApi | 1 | 是否编译 Adc_ReadGroup(),读结果必备 |
| AdcEnableStartStopGroupApi | 1 | 是否编译 Adc_StartGroupConversion()/StopGroupConversion(),SW 触发必备 |
| AdcHwTriggerApi | 0 | 是否编译 Adc_EnableHardwareTrigger()/DisableHardwareTrigger()。用硬件触发组时必须置 1 |
| AdcGrpNotifCapability | 1 | 是否提供运行时使能/关闭组通知的 API |
| AdcEnableLimitCheck | 0 | 全局限值检查总开关;置 1 后各通道的 High/LowLimit 才生效 |
| AdcEnableQueuing | 1 | 硬件忙时转换请求是否进队列排队 |
| AdcPriorityImplementation | ADC_PRIORITY_NONE | 优先级机制:NONE / HW / HW_SW。NONE 时各组不抢占 |
| AdcPriorityQueueMaxDepth | 1 | 请求队列最大深度 |
| AdcResultAlignment | ADC_ALIGN_RIGHT | 原始结果在 16 位寄存器中右对齐/左对齐。直接决定数值换算(12 位右对齐满量程=4095,左对齐要右移 4 位) |
| AdcTimeout | 65535 | 关硬件/校准时等待状态位的超时,超时上报 ADC_E_TIMEOUT 生产错误 |
| AdcDmaTimeout | 65535 | 等待 DMA 传送完成的超时(DMA 方式下用) |
| AdcVersionInfoApi | 1 | 是否编译 Adc_GetVersionInfo() |
AdcHwUnit_0
| 参数 | 实例值 | 作用与影响 |
|---|---|---|
| AdcHwUnitId | ADC0 | 绑定物理转换器 ADC0(另可配 ADC1)。决定写哪组 ADCx_SC1/CR/PDB 寄存器 |
| AdcLogicalUnitId | 0 | 逻辑编号,API 内部用 |
| AdcResolution | BITS_12 | 转换精度:8/10/12 位。影响分辨率、转换时间和结果数值范围 |
| AdcTransferType | ADC_INTERRUPT | 结果传送方式:中断 / DMA。DMA 限制见注意事项 |
| AdcVoltageReferenceSelection | VREFH_VREFL | 参考电压对:VREFH/VREFL(外部基准脚)或 VALTH/VREFL(芯片供电)。换算公式:Vin = raw/4095 x Vref |
| AdcOffsetCorrectionValue | 0 | 写入 ADC_OFS 偏移校正寄存器的数值,与转换结果相加后载入 R[n],用于消除零点偏移 |
AdcChannel_0
| 参数 | 实例值 | 作用 |
|---|---|---|
| AdcChannelId | AN_0 | 物理通道号(对应 ADC0_SE0/外部模拟引脚;可选项数量随封装不同,由 Adc_s32k144_lqfp100.epd 决定)。该引脚还必须在 Port 模块配为模拟功能 |
| AdcLogicalChannelId | 0 | 通道逻辑编号 |
AdcGroup_0
| 参数 | 实例值 | 作用与影响 |
|---|---|---|
| AdcGroupId | 0 | 组逻辑编号,API 入参句柄(生成符号名) |
| AdcGroupAccessMode | ADC_ACCESS_MODE_SINGLE | 单次/流式访问,决定缓冲区结构 |
| AdcGroupConversionMode | ADC_CONV_MODE_ONESHOT | 单次扫描/连续扫描 |
| AdcGroupConversionType | ADC_CONV_TYPE_NORMAL | 普通/注入(注入本实现不用) |
| AdcGroupTriggSrc | ADC_TRIGG_SRC_SW | 软件/硬件触发 |
| AdcHwTrigSrc | PDB | 实现特定参数:硬件触发经由 PDB(HW 触发源实际在 Mcl 模块中配置 TRGMUX 到 PDB) |
| AdcGroupInBacktoBackMode | 1 | 多通道组关键:PDB pretrigger 背靠背,前一通道转完自动启动下一通道,无需软件干预 |
| AdcGroupUsesChannelDelays | 0 | 是否给每个 PDB pretrigger 配独立延时(用各通道 AdcChannelDelay)。本工程用背靠背,故关闭 |
| AdcDelayNextPdb | 0 | 组内通道超过 8 个、需用多个 PDB 通道时,PDB 通道之间的启动延时(须大于 8 通道转换总时间) |
| AdcStreamingBufferMode | ADC_STREAM_BUFFER_LINEAR | 流式缓冲区:线性(采满停止)/ 环形(覆盖旧值) |
| AdcStreamingNumSamples | 1 | 流式模式下每通道采样数。缓冲区大小 = 通道数 x 此值 |
| AdcEnableDoubleBuffering | 0 | 双缓冲(仅硬件触发+流式+DMA 组可用),配合半满中断实现无抖动采集 |
| AdcWithoutInterrupts | 0 | 无中断模式(仅限单通道组):不产生中断、不使用结果缓冲区,需应用直接 Adc_ReadGroup() 读寄存器 |
| AdcPdbPeriodContinuousMode | 0 | 连续+无中断模式下 PDB 的重启周期,须保证所有通道在下轮启动前转完 |
| AdcExtraNotification | NULL_PTR | 中断服务程序最开始调用的额外回调(在驱动更新硬件/状态前),可用于紧急动作 |
| AdcNotification(本实例未配) | NULL | 组转换正常完成回调,实际工程通常在这里置标志/唤醒任务 |
| AdcGroupDefinition | 引用 AdcChannel_0 | 本组包含哪些通道及其顺序(结果缓冲区下标顺序) |
AdcInterrupt
| 参数 | 实例值 | 作用 |
|---|---|---|
| AdcInterrupt_0:Source/Enable | ADC0_COCO / 1 | ADC0 转换完成(COCO)中断是否编入驱动。只要 ADC0 上有中断方式的组,就必须使能 |
| AdcInterrupt_1:Source/Enable | ADC1_COCO / 0 | ADC1 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 时写一次(省运行时开销) |
| AdcOptimizeOneShotHwTriggerConversions | HW 触发+单次+单访组的专用优化(限全工程组类型单一、不超过 8 通道) |
| AdcEnableDoubleBufferingOptimization | HW+单次+流式+环形组的双缓冲优化(每组仅 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中添加对应的编译文件,与对应的编译工程。
希望对你,有所帮助!!!