继上一篇 连载 | 带你深入了解NXP汽车通用控制器S32K3 (二):开发环境搭建篇,今天将介绍S32K3的ADC用法,接下来,让我们一睹为快吧!
32K3系列MCU有多达3个硬件ADC,ADC通道分为3组:精度组、标准组和外部组
继上一篇 连载 | 带你深入了解NXP汽车通用控制器S32K3 (二):开发环境搭建篇,今天将介绍S32K3的ADC用法,接下来,让我们一睹为快吧!
ADC配置一览
S32K3系列MCU有多达3个硬件ADC,ADC通道分为3组:精度组、标准组和外部组(每个组具有独立的配置设置和不同的精度/性能级别),下表是目前S32K3的ADC配置情况:
表格1 ADC配置
表格2 ADC分组配置
表格3 ADC最大时钟频率
特性:
分辨率:可选择的分辨率8、10、12、14位,但是转换结果总是15bit,即使我们选择了8bit 分辨率;如果需要较高的转换速率,可以尝试将分辨率选择为8bit,此时转换速度会有提高,但是转换结果仍为15bit。
采样转换时间:1us,高达采样率1M samples/second。
转换模式:
DMA通道可编程
通道预采样可编程
硬件平均以及模块自检
ADC模块硬件结构框图
上图,数据流从左—>右,ADC从采集到转化,基本经历以下几个过程:
Normal,Injection,BCTU三组信号采集以后,首先警告优先级复用器,进行优先级仲裁。
通道选择由Channel Select 模块进行确认,这个取决于我们软件的实际配置情况。
FSM模块将从IDLE模式切换到CONVERT模式。
FSM状态机切换到转换模式以后,输出信号给ConversionControl模块,准备启动通道转换,转换通道由Channel Select模块提供。
转换:Conversion Control采集选定的采样通道,采样以后将数据进行处理并保存,其中包括误差校正,采样结果+err_correction[14:0],这个值在ADC校准时可得到,采样N次以后,进行硬件平均,将经过硬件平均的采样值[14:0]写入采样结果寄存器;(硬件平均功能需要使能,MCR[AVGEN] = 1)。
单次采样完成以后,FSM状态机自动回到IDLE模式,Channel Select模块选择下一个需要转换的通道,FSM切换会转换模式,重复以上3-5步骤,直到所有转换完成。
当然,以上是正常转换过程,如果出现异常情况,可以查看用户手册,进行处理,这里不一一列举。
ADC的触发机制
S32K3目前主要支持BCTU,Normal,以及Injection三种转换方式,对应软件以及硬件两种触发方式,标准组合注入组大家会比较熟悉,这里主要是介绍一下BCTU的软件以及硬件触发。
软件触发
Normal转换模式:设置NSTART位
Injection转换模式:设置JSTART位
BCTU转换模式:设置SFTRGn位
硬件触发
Normal转换模式:通过配置TRGMUX来配置硬件触发源
Injection转换模式:通过配置TRGMUX来配置硬件触发源
BCTU转换模式:共计72个触发源,其中69个通过eMIOS通道来触发,剩余3个是其他模块通过TRGMUX触发
ADC引脚映射
前面讲到ADC主要有精度组、标准组和外部组,目前对应的引脚如下:
在实际开发时,为了加快开发进度,我们可以通过打开ADC的例程,利用S32DS IDE来确认引脚是属于精度组、标准组和外部组的哪个分类。
以下三张图,分别是选择了对应外部组,精度组以及标准组的输入引脚,选择对应的引脚配置引脚属性,重新生产代码即可。
ADC实战配置
这里我们先实际通过Tresos Studio 28.0来配置一个ADC软件触发扫描模式的Demo,边操作边介绍。
1. 导入模板工程
如需该模板,请联系我们。
2. 添加ADC模块
3. 配置ADC模块
4. 确认对应的ADC引脚
评估板上,电位器输入引脚为PTA11,查询该引脚如下图:
PTA1为ADC1_S10输入通道,以上为S32DS 3.4Z 中截图,该IDE可以直接查看对应引脚以及寄存器配置,因此我们没有浓墨重彩去介绍寄存器配置。
5. DIO模块配置
S32K3引脚数众多,因此K3系列在进行引脚命名时,定义了ABCDEF等Port,每一个Port对应至多32个GPIO,其中Port AL=PTA[15-0],Port AH = PTA[16-31],这里引脚对应的是PTA11,因此在A_L里面定义。当然在EB Studio里面,任何设置如果不明白,可以直接将鼠标置于对应的位置,Studio右下角会有对应帮助文档。
帮助文档:
6. 双击A_L的索引 Index 0,打开DioChannel选项卡,点击“+”按钮,增加如下节点:PTA11_ADC1_Port0_In10,同时需要修改General选项卡,Dio Port ID为0,因为A_L的GPIO都是属于Port0,可以看上图,否则会报错。
7. DIO以上已经配置完成,目前还有部分报错,我们继续配置Port模块,点开Port → PortConfigSet → PortContainer → PortPin,增加IO后,General选项卡的io number也应该+1,否则会报错。
增加PTA_ADC1_S10配置后,双击PTA_ADC1_S10的Index,进入该PTA_ADC1_S10条目进行配置,主要设置PortPinMscr的ID为11,同时修改该IO的复用为ADC1_ADC1_S10,其他保持缺省设置即可,这个时候对应的IO就已经配置为ADC1的输入通道AN_11。
8. ADC时钟配置
这里PTA11在ADC1,因此我们需要使能ADC1的时钟,板级时钟配置都在MCU模块。打开Mcu → McuModuleConfiguration → McuModeSettingConf → McuModeSettingConf_Run → McuPartitionConfiguration → McuPeripheral,Peripheral Clock Enable选项卡,在ADC1一栏对应打 ✓。
9. 配置ADC模块,如果按照上面配置,打开ADC模块选项卡,会发现如下错误:
这里我们需要仿照已经添加的节点,增加ADC1的配置;主要是增加EOC,以及WD两个中断,分别对应转换完成中断以及看门狗中断。如果仅仅添加我们用到的ADC1也是不够的,同时需要增加ADC2的EOC以及WD中断才行。
回到ADC General选项卡,设置为变量预编译
数据对齐模式为右对齐
Adc Timeout Method选择为系统时钟
Adc Conversion Time Once 设置使能,主要是设置完成单次转换;
Adc Channel Indexes Symbolic Names设置使能,这用于生成ADC符号名称,生成的符号名类似于:#define “ADC_GroupName”“ADC_ChannelName” “Channel index value”,主要是生成部分宏定义,方便我们程序使用。
Adc Enable Calibration API 主要是生产ADC校准相关API,填写对应的校准函数,用于获取上文提到的err_correction值。
打开ADC模块的AdcHwUnit,修改ADC硬件为Port0_ADC1_S10 以方便记忆,同时修改实际的ADC单元为ADC1,EB IDE里面默认为ADC0。
双击ADC1的Index索引0,进入ADC1的属性配置界面,修改数据传输模式为ADC中断模式;
设置预分频为2,校准分频为4,同时设置分辨率为10,通常来讲,如果我们选择的引脚是标准通道,也就是Standard引脚,分辨率通常选择12,如果选择是精准通道,分辨率我们选择为12或者14。
然后,使能AdcNormalConvTimings,后续如果我们需要使能硬件平均,直接勾选下面的硬件平均即可。
接着,选择Channel选项卡:修改AdcChannel的Name为Port0_ADC1_S10以方便区分。
接下来,双击AdcChannel索引,进入配置界面:Adc Physical Channel Name选择为S10_ChanNum34,同时修改Adc Physical Channel ID 为34。
修改AdcGroup,这里修改为Adc1Group1。
双击AdcGroup的Index值,进入Adc Group的配置阶段:
转换模式采用连续采样,转换类型采用正常模式,当然根据实际情况也可以选择注入组;Adc Group Trigger Source 选择为ADC_TRIGG_SRC_SW,因为我们目前是软件触发,如果是其他外设硬件触发,这里我们需要选择硬件触发。
由于是软件触发,因此Adc Group不需要额外中断触发:因此这里使能Adc Group Without Interrupts
配置完成以上后,会发现有其他错误
这里,需要去选择我们刚刚定义的AdcGroup,点击Adc → AdcConfigSet → AdcHwUnit → Port0_ADC1_S10 → AdcGroup → Adc1Group1 → AdcGroupDefinition,或者直接在上面填入:/Adc/Adc/AdcConfigSet/Port0_ADC1_S10/Port0_ADC1_S10
配置完成以上属性,我们基本完成所有配置,接下来就是根据配置生成MCAL的API。
10. 生成代码
到此,ADC简介以及MCAL的配置就结束了,后续根据MCAL生产的代码测试部分,将会在开发板上验证无误后给出。