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 

  1. EID 为 8 位二进制数,范围在 0~255之 间;
  2. EID 分成两部分,高三位和低五位:xxx | xxxxx;
  1. 高三位(取值范围为 000~111,即 0 到 7),对应前文所述的 TargetLut_x(x 即为此处高三位的值)

      例:如 EID = 001 | xxxxx,那么此时 TmuxDrt 中的 TargetLut_1 就会生效;如 EID = 011 | xxxxx,那么此时 TmuxDrt 中的 TargetLut_3 就会生效,以此类推;

  1. 低五位(取值范围为 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》

欢迎大家登录大大通,可以了解更多精彩内容哦!

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值