C语言 PWM生成具有异常低脉冲[关闭]

wbrvyc0a  于 2023-04-05  发布在  其他
关注(0)|答案(1)|浏览(90)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

昨天关门了。
Improve this question
我试图使用ATMega 328 P板创建一个可变占空比PWM。PWM是通过比较MATLAB中生成的两个查找表的值来生成的。一个是60 Hz正弦波,另一个是2KHz三角波。当正弦波大于三角波时,PWM输出设置为高,当它小于三角波时,它被设置为低。这产生了一个变化的占空比pwm信号。最后,这个信号将决定何时H桥上的四个开关将打开和关闭。
然而,在示波器上测量输出时,会出现一个问题,即方波的高侧会莫名其妙地下降,将其一分为二。如下所示:
Oscilloscope PWM Signal of ATMega Operation
在MATLAB中进行仿真时,不会发生这种行为:
MATLAB PWM Signal
代码如下:
Code Image 1Code Image 2
我已经尝试在几个地方改进/纠正布尔逻辑-abs(currentSIN) > abs(currentTRI)-round(currentSIN) > round(currentTRI)-currentSIN >= currentTRI-SIN_Val(sincounter) > TRI_Val(tricounter)这些变化都没有真正帮助。
我还尝试使用不同的端口来验证是否存在硬件问题,尝试使用uint8_t变量而不是bool变量,更改计时器的频率,并生成新的查找表,所有这些都导致了方波的高部分被分成两部分的类似行为。

sirbozc5

sirbozc51#

由于测试,您正在索引超出范围的uint8_t SIN_Val[167]数组

if(sincounter > 167) { sincounter = 0; }

应该是

if(sincounter >= 167) { sincounter = 0; }

因为索引167是非法的。这可能会导致您看到的故障。
你也同样在边界检查中用同样的错误破坏了数组uint8_t TRI_Val[100]

if(tricounter >= 100) { tricounter = 0; }

相关问题