anybunny 发表于 2024-8-6 17:51:13

关于无刷电调的奇妙问题(已解决)

一般大家都会在电调程序里写上电后放音乐的程序来检测电机和电调是否完好。

我们的程序也不例外,甚至浪漫主义地调了一首卡农。

但是卡农太久了,于是在制作新的电调时,我就裁掉了一部分音节:
#define MUSIC_NUM   8
uint16frequency_spectrum = {0, 523, 587, 659, 698, 783};
uint8   music_frequency = {1,2,3,4,5};
uint16music_wait_time = 250;

变成了上边这样。

新的电调焊好了,我下载程序,美美上电。

然后我就发现在电调响完五声之后,会莫名转动一下

attach://53139.mp4


(这是事后的场景复原)

为什么呢?

最开始我们怀疑是换相检测部分有问题

但是再三检查,重焊也还是会疯转,

又想会不会是芯片没焊好,重焊了几次也没效果。

那会不会是程序的问题呢?

于是我又看向了这我唯一修改过的部分

#define MUSIC_NUM   8
会不会是这里有问题?

但是按照程序逻辑,这里即使写20,也是只是会在

uint8   music_frequency = {1,2,3,4,5};
后边多加几个 0 ,多播放一会儿空音节啊。

但我还是抱着将信将疑的态度,把 8 改成了 5 ;

上电,问题解决了。

attach://53140.mp4


为什么数组多个 0 会让电机疯转?

for(i = 0; i < MUSIC_NUM; i++)
    {
      pwm_init(PWMA_CH1P_P20, frequency_spectrum], beep_duty);
      
      delay_ms(music_wait_time);
    }
这响声程序看起来根本不具有这样的效果啊?

顺着0往下找,我注意到了

uint16frequency_spectrum = {0, 523, 587, 659, 698, 783};
频率数组这里,frequency_spectrum = 0


众所周知,C语言里 0,很引人注目,也相对更容易出问题


所以我就尝试着,把 0 改成了 50


果然,不会疯转了,再疯转的地方取而代之的是音效。


看来问题就是 0 了


检测发现


在程序里写PWM频率为 0 时,会直接给电机输出 3.3V 电。


可能是STC芯片的问题


问了实验室的前辈,他们也表示遇到过这个情况


而且还说 “但是我们只有在张学长的电脑上运行才会出现这种情况”


真是玄学呢。












soma 发表于 2024-8-6 18:40:28

一个0引发的事故啊!

qq603599910 发表于 2024-8-6 21:06:46

一般来说硬件PWM写零不一定是高电平也可能是低电平,这个要看前一个电平状态是啥,就是说一旦发送PWM为0指令IO输出不管在高电平还是低电平都立即停止.
STC配置普通IO还好说直接IO = 0即可置低电平,32位MCU PWM输出GPIO要配置复用输出的话还需要临时配置GPIO为推挽或者可下拉模式再用指令置为低电平.

anybunny 发表于 2024-8-6 22:59:51

qq603599910 发表于 2024-8-6 21:06
一般来说硬件PWM写零不一定是高电平也可能是低电平,这个要看前一个电平状态是啥,就是说一旦发送PWM为0指令I ...

{:4_196:}感谢
页: [1]
查看完整版本: 关于无刷电调的奇妙问题(已解决)