如何用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
相关产品推荐
相关产品推荐

