硬汉嵌入式论坛

 找回密码
 立即注册
查看: 387|回复: 4
收起左侧

[技术讨论] 同下降沿方波求助

[复制链接]

9

主题

20

回帖

47

积分

新手上路

积分
47
发表于 2025-8-21 11:27:32 | 显示全部楼层 |阅读模式
汉哥和各位大佬好,我使用的单片机是FS32K144W,项目需求是要输出两个同下降沿的5K,10K方波,目前使用的是两个定时器输出PWM,在初始化的时候将计数值清一下0,目前的效果是100ns左右的偏移,尝试过在10k的重装载中断中反转5k的电平,直接操作的寄存器依旧有260ns的偏移,目前在考虑尝试同一个定时器去的比较输出模式,或者两个定时器做级联,还有什么好一些的方案么?
回复

使用道具 举报

4

主题

95

回帖

107

积分

初级会员

积分
107
发表于 2025-8-21 23:51:13 | 显示全部楼层
啥是同下降沿的 5kHz, 10kHz 方波?是指 5kHz 的下降沿和 10kHz 的一半下降沿重叠吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118312
QQ
发表于 2025-8-22 11:07:48 | 显示全部楼层
看看有没有类似stm32的bsrr gpio寄存器,同时输出即可。
回复

使用道具 举报

9

主题

20

回帖

47

积分

新手上路

积分
47
 楼主| 发表于 前天 18:38 | 显示全部楼层
eric2013 发表于 2025-8-22 11:07
看看有没有类似stm32的bsrr gpio寄存器,同时输出即可。

我看过硬汉哥之前任意管脚的PWM,但这样不意味着要频繁进入中断了么?
回复

使用道具 举报

4

主题

82

回帖

94

积分

初级会员

积分
94
发表于 昨天 11:24 | 显示全部楼层
eFlexPWM 拥有多个独立的子模块(例如 PWM0, PWM1, PWM2 ...)。这些子模块可以独立工作,也可以通过同步信号让一个子模块(主模块)去控制另一个子模块(从模块)的计数器启停和相位。
[C] 纯文本查看 复制代码
// 假设系统时钟和PWM时钟已配置为60MHz
#define PWM_CLK_HZ 60000000UL
#define PERIOD_10K ((PWM_CLK_HZ / 10000) - 1) // 5999

// 1. 配置主模块 PWM0 为 10kHz,50% 占空比
PWM0->SM[0].INIT = 0; // 计数器初始值
PWM0->SM[0].VAL1 = PERIOD_10K; // 周期值
PWM0->SM[0].VAL2 = PERIOD_10K / 2; // 比较值,50% 占空比
PWM0->SM[0].VAL3 = 0; // 其他比较值...
PWM0->SM[0].VAL4 = 0;
PWM0->SM[0].VAL5 = 0;

// 设置 PWM0 为主同步源
PWM0->SM[0].CTRL2 |= PWM_CTRL2_INIT_SEL(0); // 本地同步
PWM0->SM[0].CTRL2 |= PWM_CTRL2_SOC_SEL(0);  // 同步选择
PWM0->SM[0].CTRL2 |= PWM_CTRL2_FORCE_SEL(2); // 强制在初始化时加载
PWM0->OUTEN |= ... ; // 使能PWM0输出

// 2. 配置从模块 PWM1 为 5kHz,50% 占空比
// 注意:PWM1的周期寄存器设置为和PWM0相同,因为它的时钟被2分频了
PWM1->SM[0].INIT = 0;
PWM1->SM[0].VAL1 = PERIOD_10K; // 周期值与PWM0相同!
PWM1->SM[0].VAL2 = PERIOD_10K / 2; // 50% 占空比

// 设置 PWM1 接收 PWM0 的同步信号,并2分频
PWM1->SM[0].CTRL2 |= PWM_CTRL2_INIT_SEL(1); // 初始化信号源选择为PWM0 (值1代表PWM0)
PWM1->SM[0].CTRL1 |= PWM_CTRL1_PRSC(1); // 预分频器 = 2 (0b001)
PWM1->SM[0].CTRL2 |= PWM_CTRL2_FORCE_SEL(2);
PWM1->SM[0].CTRL2 |= PWM_CTRL2_REINIT_MASK; // 使能通过同步信号重新初始化
PWM1->OUTEN |= ... ; // 使能PWM1输出

// 3. 关键的启动顺序
// 先启动从模块
PWM1->MCTRL |= PWM_MCTRL_LDOK(1 << 0); // 加载PWM1子模块0的寄存器
PWM1->MCTRL |= PWM_MCTRL_RUN(1 << 0);  // 运行PWM1子模块0(它会等待同步信号)

// 再启动主模块
PWM0->MCTRL |= PWM_MCTRL_LDOK(1 << 0); // 加载PWM0子模块0的寄存器
PWM0->MCTRL |= PWM_MCTRL_RUN(1 << 0);  // 运行PWM0子模块0,并立即发出同步信号

deepseek给的代码,https://chat.deepseek.com/share/o95ubg6hmf4452ce31
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-9-26 11:32 , Processed in 0.041157 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表