完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我正在使用 mpc5642a。我的目标是读取 PWM 输入信号的高电平时间和频率。
有一个 1ms 周期的调度程序,但我打算读取的信号频率约为 20-500Hz。 我研究了两种不同的设计来读取 PWM 输入信号。 设计 1:我在每个周期中读取 CADR 和 CBDR 寄存器值的值,尽管由于调度程序的最小周期时间和目标高电平读取时间我无法捕捉到高边沿。 // Channel Control Register /* Freeze Enable:正常操作 */ /* Output Disable:输出引脚正常操作 */ / * Output Disable Select:输出禁用输入 0 */ /* Prescaler:分频比 1 */ /* Prescaler启用:启用 */ /* DMA 内存访问:分配给中断 */ /* 输入过滤器:不适用 */ /* 过滤器时钟选择:预分频器时钟 */ /* 标志启用:不生成 IRQ/DMA */ /* 强制匹配 A:禁用 */ /* 强制匹配 B:禁用 */ /* 总线选择:内部计数器 */ /* 边沿选择位:不适用 */ / * 边沿极性:在匹配 A 上设置 */ / * MODE[0 -6]:输入脉冲宽度测量*/ EMIOS.CH[1].CCR.R = 0x02000684; // 函数实现 void inputCapture() { uint32_t ChannelAData = 0; uint32_t ChannelBData = 0; uint32_t 脉冲宽度值 = 0; uint32_t 周期值 = 0; // 测量信号的脉冲宽度 // 等待标志设置 if EMIOS.CH[1].CSR.B.FLAG == 1) { // 清除标志位 EMIOS.CH[1].CSR.B.FLAG = 1; } // 从寄存器A和寄存器B读取数据 ChannelAData = EMIOS.CH[1].CADR.R; ChannelBData = EMIOS.CH[1].CBDR.R; // 计算脉冲宽度值 // 正常情况 if ((EMIOS.CH[1].CSR.B.OVFL != 1) || (ChannelBData < ChannelAData)) { PulseWidthValue = (ChannelAData - ChannelBData); } else { PulseWidthValue = (0xFFFFFFFFu - ChannelBData + ChannelAData); // 清除溢出标志 EMIOS.CH[1].CSR.B.OVFL = 1; } } 设计 2:我通过 EDMA 读取输入信号。 // Channel Control Register /* Freeze Enable:正常操作 */ /* Output Disable:输出引脚正常操作 */ / * Output Disable Select:输出禁用输入 0 */ /* Prescaler:分频比 1 */ /* Prescaler Enable: Enable */ /* DMA Memory Access: Assigned to DMA request */ /* Input Filter: Not Applicable */ /* Filter clock select: Prescaler clock */ /* Flag Enable: Enable (标志生成IRQ/DMA请求*/ /* 强制匹配 A:禁用 */ /* 强制匹配 B:禁用 */ /* 总线选择:内部计数器 */ /* 边沿选择位:不适用 */ / * 边沿极性:在匹配 A 上设置 */ /* MODE[0-6]: 输入脉冲宽度测量 */ EMIOS.CH[1].CCR.R = 0x03020684; struct EDMA_TCD_STD_tag eMIOSCH1Descriptor = { /* 00 */ /* 加载源数据地址 */ (vuint32_t) &EMIOS.CH[1].CADR.R, /* SADDR - 32 位 */ / * 04 */ 0, /* SMOD - 05 位 */ 3, /* SSIZE - 03 位 */ 0, /* DMOD - 05 位 */ 3, /* DSIZE - 03 位 */ / * 06 */ 0, /* SOFF - 16 位 * / /* 08 */ 8, /* NBYTES - 32 位 */ /* 12 */ 0, /* SLAST - 32 位 */ /* 16 */ (vuint32) &EMIOSDataRegValues.CADRRegValue, /* DADDR - 32 位 * / /* 20 */ 0, /* CITERE_LINK - 01 位 */ (vuint16) 1, /* CITER - 15 位 */ /* 22 */ 0, /* DOFF - 16 位 */ /* 24 */ 0, /* DLAST - 32 位 */ /* 28 */ 0, /* BITERE_LINK - 01 位 */ (vuint16) 1, /* BITER - 15 位 */ /* 30 */ 0, /* BWC - 02 位 */ 0, /* MAJORLINKCH - 06 位 */ 0, /* DONE - 01 位 */ 0, /* ACtiVE - 01 位 */ 0, /* MAJORE_LINK - 01 位 */ 0, /* E_SG - 01 位 */ 0, /* D_REQ - 01 位 */ 0, /* INT_HALF - 01 位 */ 0, /* INT_MAJ - 01 位 */ 0 /* START - 01 位 */ }; // 函数实现 void inputCapture() { uint32_t pulseWidthValue = 0; // 测量 信号 的 脉冲 宽度 } else { pulseWidthValue = (0xFFFFFFFFu - EMIOSDataRegValues.CBDRRegValue + EMIOSDataRegValues.CADRRegValue); } } |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
1932个成员聚集在这个小组
加入小组我的项目我做主,使用GN+Ninja来完成构建系统(VSCode开发RT106X)
36420 浏览 0 评论
NXP IMX8应用处理器快速入门必备:技巧、使用、设计指南
4858 浏览 1 评论
6107 浏览 1 评论
6817 浏览 0 评论
NXP i.MX6UL开发板(linux系统烧录+规格+硬件+模块移植)使用手册
4248 浏览 0 评论
644浏览 2评论
求助,S32G上Core M启动后如何让Core A在Flash指定位置加载uboot?
640浏览 2评论
ESP32-WROVER-IE + LAN8720以太网,GPIO0电压只有1.6v,无法正常进入spi flash boot模式如何解决?
642浏览 2评论
求分享适用于PN7160 Android的NFC工厂测试应用程序
728浏览 2评论
843浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 18:48 , Processed in 1.219726 second(s), Total 75, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号