本文主要是介绍SemiDrive E3 MCAL 配置 :PWM 硬件触发 ADC 采样,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、前言
在使用 ADC 进行采样时,ADC 的硬件触发采样是 ADC 的典型应用。
本文将介绍 SemiDrive E3 MCAL 配置 :PWM 硬件触发 ADC 采样。
硬件平台:芯驰 E3640 Gateway 开发板
软件平台:SemiDrive_E3_MCAL_V3.0
二、EB 配置
2.1 ADC 配置
ADC 的 Hardware 触发对应的是 ADC 中 Group 的触发方式,所以首先对需要作为 HW(下文中 Hardware 以 HW 为简称)触发方式的 Group 进行配置。
将 AdcGroupTriggSrc 设置为 ADC_TRIGG_SRC_HW(注:每个 ADC Unit 可以至多设置 4 个 Group,作为 HW 触发的 Group 必须配置在当前 Unit 中的第 0 个 Group,
并且每个 Unit 下至多只能配置 1 个 HW 触发的 Group)
Group 的转换模式在 HW 触发下,一定要设置为 OneShot 模式。
在 MCAL3.0 及之后的 MCAL 软件版本中,HW 触发的 group 的 AccessMode 如果设置为 ADC_ACCESS_MODE_SINGLE,此时 StreamingBufferMode 的设置并不影响
调用流程如下所述:
1. Adc_EnableHardwareTrigger(),将 Group 的 Status 转换为 ADC_BUSY;
2. 等待该 Group的Status 至 ADC_STREAM_COMPLETED;
3. Adc_ReadGroup();该步会获取采样值,并且自动开启新一轮转换,并将 Group 的 Status 转换为ADC_BUSY;
如果接下来需要重复:转换->读值->转换->读值,那么只要确保 Group 的 Status 至 ADC_STREAM_COMPLETED 后调用 Adc_ReadGroup 就可以。
一般来说,触发信号会源源不断的以一定频率产生,而 ADC 的转换和读值会不断重复进行,如果在此情况下使用 HW 触发的 Group,推荐配置方式如下:
1. AdcGroupConversionMode->ADC_CONV_MODE_ONESHOT
2. AdcGroupAccessMode->ADC_ACCESS_MODE_SINGLE;
需要注意
2.2 PORT 配置
ADC 引脚配置
UART 引脚配置
2.3 PWM 配置
此处采用 etimer1 进行硬件触发 ADC,具体 PWM 模块介绍请参照《SemiDrive_E3_MCAL_User_Guide_Rev03.00》 PWM 章节。
2.4 Xtrg 配置
TmuxIndir
Xtrg 下,可用于触发 ADC 的 mux 存在 2 种:
- TmuxDir
- TmuxIndir
使用 TmuxIndir 的方式触发 ADC 是推荐使用的方法,此方式可满足使用需求,TmuxDir 触发就不再赘述。
1. TmuxIndrtInstanceId:有 TmuxIndrtInstanceId0~TmuxIndrtInstanceId7 八个 mux 控制器,只是 id 值。
2. TriggerSigSel:选择触发源。
3. TidPool0Config 与 TidPool1Config TmuxDir 的触发关系,由 PWM/ETIMER 中的 EID 决定;而 TmuxIndir 中的触发关系,由 xtrg 自己产生的 tid 决定。
此处介绍一下 EID
- EID 为 8 位二进制数,范围在 0~255之 间;
- EID 分成两部分,高三位和低五位:xxx | xxxxx;
- 高三位(取值范围为 000~111,即 0 到 7),对应前文所述的 TargetLut_x(x 即为此处高三位的值)
例:如 EID = 001 | xxxxx,那么此时 TmuxDrt 中的 TargetLut_1 就会生效;如 EID = 011 | xxxxx,那么此时 TmuxDrt 中的 TargetLut_3 就会生效,以此类推;
- 低五位(取值范围为 00000~11111,即 0~31;但实际使用时,范围为 00000~01111,即0~15),此处的值对应即将触发 ADC 的第 x 个 Channel;
例:如 EID = xxx | 00011,那么此时即将触发 ADC 中 LogicalId 为 3 的 channel;
综上所述,EID 决定了 Xtrg 的 TmuxDir 中哪一个 TargetLut_x 生效,并且决定了即将触发的 ADC 的通道序号。
而具体是哪个 ADC Unit,就由生效的 TargetLut_x 决定,如下所述:
- TargetLut_x = 0000 0001->对应触发 ADC1
- TargetLut_x = 0000 0010->对应触发 ADC2
- TargetLut_x = 0000 0100->对应触发 ADC3
- TargetLut_x = 0000 0101->对应同时触发 ADC1、ADC3,具体优先级由 Xtrg决定,不建议如此使用。
结合上文所叙述内容,具体 TmuxDrt 和 EID 结合使用例子如下:EID = 010 00011,此时 Xtrg 中 TmuxDir 的 TargetLut_2生效,并假设此时 TargetLut_2 = 1,此时 TriggerSigSel = EPWM1_CMP0
- TargetLut_0 = 1
- TargetLut_1 = 1
- TargetLut_2 = 1
- TargetLut_3 = 1
- TargetLut_4 = 1
- TargetLut_5 = 1
- TargetLut_6 = 1
- TargetLut_7 = 1
并且此时EID = 010 | 00011,那么此时通过 EPWM1_CMP0 经过 Xtrg 的 TmuxDir 时,会查找 TargetLut_2 配置的内容(EID 高三位为 2),发现:TargetLut_2 = 1,所以此时将触发 ADC1,而 EID 低 5 位为 00011(数值 3),所以将触
发 ADC1 中,硬件触发的 Group 中 LogicalId 为 3 的channel,我们再回到 TmuxIndir ,TmuxIndir 中 tid 由内部的 tid pool 产生,而具体配置的值就由 TidPool0Config 和 TidPool1Config 确定。
TidPool0Config 和 TidPool1Config 实际为两个 32 位的寄存器,所以每个选项取值范围是:000...000(32 位)~111...111(32 位),即 0~4294967295;每个 TidPoolConfig 分割为 4 个部分,每个部分 8 位,而这 8 位的功能就替代了
上文所叙述的 EID:例如 TidPool0Config 为 011 00001 010 00001 001 00001 000 00000,实际上代表了 4 个 TID 值(此处 TID 和上文的 EID 对应),每个 8 位也是由高 3 位和低 5 位组成,功能和前文所述的 EID 一致。
4. TermValConfig和TermTidConfig
将两个配置项进行合并叙述,现在已知 TidPool0Config 和 TidPool1Config 产生了确定触发关系的 TID,那么如何确定当前选择哪个具体的 TID 就由 TermValConfig 或者 TermTidConfig 决定。
首先,TidPool0Config 和 TidPool1Config 中取 TID 的方式是在 tidpool 中,存在一个不断循环的指针,当这个指针指向哪个 TID,就会选择当前的 TID 值,这个指针的轮询速度不能控制,具体工作方式如下:
TIDpool 中指针从 TID0 开始轮询。
TermValConfig:取值范围是 0~7,已知 TidPool0Config 为 4 个TID,TidPool1Config 为 4 个 TID,而 TermValConfig 决定了从第 0 个 TID 轮询到第几个 TID 结束,具体含义:
例如:
TermValConfig = 4
此时 tidpool 中的指针会从 TidPool0Config 中的 TID0 直至 TidPool1Config 的 TID4 结束并开始重复;
而 TermTidConfig 是一个 8 位配置项,取值范围为 0~255,它也可以用来决定 Tidpool 指针到哪个 TID 结束轮询并开始下一轮循环。
例如:
TermTidConfig = 255
在 TID0~TID7 中,其中一个 TID 的取值为 11111111(255),那么就会到达终点开始下一轮。
TermValConfig 和 TermTidConfig 是共同生效的,但是建议使用 TermValConfig,这样比较直观,TermTidConfig 可以配一个无法匹配的值,比如 11111111。
TargetLut:用于确定触发具体哪个ADC Unit。
配置完上述内容后,代入 sdrv_xtrg_tmux0_drt_config 接口
sdrv_xtrg_tmux0_indrt_config(&xtrg_dev, &TmuxIndrtConfig_0);
此类配置可以满足某个 ADC Unit 下,一个 Hw Group 可以至多配置 8 个 channel。
三、 函数部分
3.1 中断函数
3.2 主函数
四、总结
将 ADC 触发模式设置为硬件触发,通过 PWM 设置触发频率,通过 XTRG 模块链接到 ADC 上,此 Demo 通过延时 100us,打印 ADC 的触发次数来验证 ADC 可以在 100us 被多次触发,且频率可调。
五、 参考文档
《SemiDrive_E3_MCAL_User_Guide_Rev03.00》
欢迎大家登录大大通,可以了解更多精彩内容哦!
这篇关于SemiDrive E3 MCAL 配置 :PWM 硬件触发 ADC 采样的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!