SemiDrive E3 MCAL 配置 :PWM 硬件触发 ADC 采样

2024-08-26 11:12

本文主要是介绍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》

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

这篇关于SemiDrive E3 MCAL 配置 :PWM 硬件触发 ADC 采样的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1108400

相关文章

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

如何为Yarn配置国内源的详细教程

《如何为Yarn配置国内源的详细教程》在使用Yarn进行项目开发时,由于网络原因,直接使用官方源可能会导致下载速度慢或连接失败,配置国内源可以显著提高包的下载速度和稳定性,本文将详细介绍如何为Yarn... 目录一、查询当前使用的镜像源二、设置国内源1. 设置为淘宝镜像源2. 设置为其他国内源三、还原为官方

CentOS7更改默认SSH端口与配置指南

《CentOS7更改默认SSH端口与配置指南》SSH是Linux服务器远程管理的核心工具,其默认监听端口为22,由于端口22众所周知,这也使得服务器容易受到自动化扫描和暴力破解攻击,本文将系统性地介绍... 目录引言为什么要更改 SSH 默认端口?步骤详解:如何更改 Centos 7 的 SSH 默认端口1

Maven的使用和配置国内源的保姆级教程

《Maven的使用和配置国内源的保姆级教程》Maven是⼀个项目管理工具,基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告... 目录1. 什么是Maven?2.创建⼀个Maven项目3.Maven 核心功能4.使用Maven H

SpringBoot多数据源配置完整指南

《SpringBoot多数据源配置完整指南》在复杂的企业应用中,经常需要连接多个数据库,SpringBoot提供了灵活的多数据源配置方式,以下是详细的实现方案,需要的朋友可以参考下... 目录一、基础多数据源配置1. 添加依赖2. 配置多个数据源3. 配置数据源Bean二、JPA多数据源配置1. 配置主数据

Spring 基于XML配置 bean管理 Bean-IOC的方法

《Spring基于XML配置bean管理Bean-IOC的方法》:本文主要介绍Spring基于XML配置bean管理Bean-IOC的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录一. spring学习的核心内容二. 基于 XML 配置 bean1. 通过类型来获取 bean2. 通过

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

如何使用Nginx配置将80端口重定向到443端口

《如何使用Nginx配置将80端口重定向到443端口》这篇文章主要为大家详细介绍了如何将Nginx配置为将HTTP(80端口)请求重定向到HTTPS(443端口),文中的示例代码讲解详细,有需要的小伙... 目录1. 创建或编辑Nginx配置文件2. 配置HTTP重定向到HTTPS3. 配置HTTPS服务器

SpringBoot中配置Redis连接池的完整指南

《SpringBoot中配置Redis连接池的完整指南》这篇文章主要为大家详细介绍了SpringBoot中配置Redis连接池的完整指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以... 目录一、添加依赖二、配置 Redis 连接池三、测试 Redis 操作四、完整示例代码(一)pom.

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效