You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python脚本模拟30次4.5-0.5V锯齿波电压(无特殊库)

调整方案说明

首先,原PWM函数存在参数错误(使用了未定义的tt,应改为参数t),先修正这个基础问题。根据你的需求,提供两种实现思路:


思路1:通过PWM平均电压模拟锯齿波

锯齿波的核心是电压随时间线性变化,我们可以让PWM的占空比线性递减,使PWM的平均电压从4.5V逐步降到0.5V。

修正并扩展后的代码

def PWM(t, frequency, dutyCycle):
    pt = t * frequency  # 计算当前时间对应的周期数
    tc = pt - int(pt)   # 周期内的归一化时间(范围0~1)
    return 1 if tc < dutyCycle else 0

def simulate_sawtooth(total_cycles=30, frequency=1, v_high=4.5, v_low=0.5):
    # 计算每次循环的电压变化步长
    step = (v_high - v_low) / total_cycles
    current_v = v_high
    results = []
    
    for cycle in range(total_cycles):
        # 占空比与电压线性关联:电压越高,占空比越大
        duty_cycle = (current_v - v_low) / (v_high - v_low)
        # 计算PWM平均电压(简化模拟效果)
        avg_voltage = v_low + (v_high - v_low) * duty_cycle
        results.append(avg_voltage)
        # 电压递减到下一个值
        current_v -= step
    
    return results

# 执行模拟并打印结果
sawtooth_voltages = simulate_sawtooth()
for i, v in enumerate(sawtooth_voltages, 1):
    print(f"第{i}次模拟电压: {v:.2f}V")

说明

  • 修正了原PWM函数的参数错误,确保逻辑正常运行。
  • 若需要更贴近硬件PWM的实际输出,可以在每个周期内采样多个PWM开关值再取平均,代码中直接计算平均电压是高效的简化实现。

思路2:直接生成锯齿波电压值(无需PWM开关输出)

如果仅需要锯齿波的电压数值序列,不需要模拟PWM的开关状态,可以直接通过线性计算生成,实现更简洁:

def generate_sawtooth(total_samples=30, v_high=4.5, v_low=0.5):
    # 计算步长,确保最后一个采样点刚好是0.5V
    step = (v_high - v_low) / (total_samples - 1)
    # 生成从4.5V线性降到0.5V的电压序列
    voltages = [v_high - i * step for i in range(total_samples)]
    return voltages

# 执行生成并打印结果
sawtooth_voltages = generate_sawtooth()
for i, v in enumerate(sawtooth_voltages, 1):
    print(f"第{i}次模拟电压: {v:.2f}V")

说明

  • 直接生成30个符合要求的电压值,完全匹配锯齿波的线性变化特性。
  • 无需依赖PWM函数,代码更简洁高效,适合仅需要电压数值模拟的场景。

选择建议

  • 若要模拟硬件PWM输出的锯齿波效果(包含开关状态的平均电压),选思路1;
  • 若仅需要锯齿波的电压数值序列,选思路2更合适。

内容的提问来源于stack exchange,提问作者Alex Alexe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 23:30:56