一、概述
本文将会介绍 SemiDrive E3 MCAL Adc 模块的简介以及基本配置。此外会结合实际操作的介绍,帮助新手快速了解并掌握这个模块的使用,文中的 MCAL 是基于 PTG3.0 的版本,开发板是官方的 E3640 网关板。
二、Adc 模块简介
首先了解下 Autosar 中关于 Adc 模块的一些概念,以下结合图 2.1 进行说明。
图 2.1 Autosar Adc 模块
- ADC Channel:表示绑定到一个端口引脚的 ADC 实体。
- ADC Channel Group:一组 ADC 通道链接到同一个 ADC 硬件单元,整个组的转换由一个触发源触发。
- ADC Result Buffer: ADC 驱动程序中用户必须为每一个组提供一个缓冲区,如果选择了流访问模式,该缓冲区可以保存同一组通道的多个样本,如果选择单一访问模式,每个组通道的一个样本将保存在缓冲区中。
- Conversion Mode:包括两种转换模式:① One-Shot 模式:ADC 通道组的转换在触发后执行一次,并将结果写入分配的结果缓冲区,可以是软件触发或硬件事件触发。② ADC 通道组的转换在软件 API 调用后连续执行,并将结果写入分配的结果缓冲区,连续转换可以通过软件 API 调用停止。
- Sampling Time/Sample Time:采样模拟信号的时间,可以在 EB 中进行配置。
- Conversion Time:采样模拟信号转换成数字信号的时间。
- Acquisition Time:等于 Sampling time 加上 Conversion time。
从图 2.1 可以看出,ADC Group 下必须要绑定 Channel,不然没有意义,Group 下的 Channel 必须属于同一个 ADC 硬件单元。另外同一个 Channel 可以绑定到不同的 Group 中。
三、Adc 模块的主要配置
下面介绍 Adc 模块的配置,这里会以 GPIO_B5和 GPIO_B6 两个引脚为例子介绍,首先需要再 Mcu 模块中使能 Adc 模块。具体操作如图 3.1 所示。
3.1 Mcu 模块配置
接着在 Port 模块中配置 Adc 引脚,如图 3.2 所示。
图 3.2 模块配置
然后开始配置 Adc 模块,首先添加 ADC 模块,E3 最多可以添加 3 个 ADC 模块,如图 3.3 所示。
图 3.3 添加新的 Adc 模块
接着配置 ADC 的 Channel,Channel 配置中 AdcChannelId 和 AdcLogicalChannelId 这两项都按照默认的连续值即可,AdcChannelMux 和 AdcPhysicalChannelId 需要根据实际使用的 ADC 引脚进行配置,下面参照图 3.5 举例进行说明。
比如我们使用的 ADC 引脚是 GPIO_B6,使用的 ADC 模块是 ADC1,通过查看数据手册可以知道该引脚连接到 ADC 的 CH3_N 通道,从图中可以看出 ADC1 的 N3 通道只有 GPIO_B6 一个引脚输入,因此 AdcChannelMux 配置为 0,对于 N5 通道则有多个 GPIO 引脚输入,其对应的 AdcChannelMux 分别为 0~7,AdcChannelMux 的计算则按照图中所示公式计算:3 x 2 = 6
图 3.4 配置 ADC Channel
图 3.5 AdcChannelMux 和 AdcPhysicalChannelId 计算方法
接着配置 ADC 模块的 Group 参数,具体各参数的说明如下图所示。需要注意的是 Group 最多可以配置 4 组。
图 3.6 ADC Group 参数配置
最后配置 ADC Group 组别内部的 Channel,每个 Group 最多可以添加 16 个 Channel,并且这些 Channel 都是属于同一个 ADC 硬件单元的,具体配置如图 3.7 所示。
图 3.7 配置每个 Group 中的 Channel
四、实际操作
完成以上的配置后,接着使用测试代码进行验证,测试代码如图 4.1所示。
图 4.1 ADC 测试代码
配置完以后编译生成配置文件,然后重新编译工程,调试运行,按照图 4.2 输入相关命令进行测试,测试前我们将 GPIO_B5 和 GPIO_B6 两个引脚都接到 3.3V。可以看到 ADC 转换的结果为 3.294V,跟实际电压一致。
图 4.2 串口打印信息
五、使用注意事项
对于 ADC 模块的使用需要注意以下事项:
- 每一个 ADC 单元,只允许同时一个 Group 正常进行转换。
- 如果是硬件触发 Group,需要配置在每个 ADC 单元的第 0 个 Group。
- DMA 模式只支持软件触发,并且如果当一个 ADC 单元已经有一个 DMA Group,那么该单元无法配置其他的 Group。另外需要注意的是 DMA 模式下提供 Group 存放数据的 Buffer 需要 32 字节对齐。
- 对于 CIRCULAR 模式下跟 AUTOSAR 规范不完全适配:在调用 Adc_ReadGroup 之前,如果 group 达到 ADC_STREAM_COMPLETED 状态,不调用 Adc_ReadGroup 接口,那么不会开启下一轮采样,也不会覆盖 Buffer 中的采样数据。
- 建议在硬件触发模式下,如果完成转换后,关闭触发源或者 Xtrg 的 Tmux。
- 如果需要做通道的过压测试(比如某个通道短路超过 9V,查看其他通道的采样值是否准确),需要打开 Adc_Channel_Detect 的宏,并且根据硬件电路进行验证以找到合适的电压阈值进行屏蔽。此功能只支持软件采样、中断模式的 Group;使用此功能时,第一轮采样的数据会用作检测过压的通道,第二轮以后得数据才会返回上层调用者。
六、参考资料
1.《SemiDrive_E3_MCAL_User_Guide_Rev03.00.pdf》,2023.08