QQ624353765 发表于 2024-12-22 20:05:24

受不了了,无刷电机一个月了还没有驱动成功

<p><img src="data/attachment/forum/202412/22/192814azzpmkmcpgu4k4zm.png" alt="image.png" title="image.png" /></p>
<p>照着官方的例程写的,一摸一样的就是转不起来</p>
<p><img src="data/attachment/forum/202412/22/192956tbvo6p8jwob5ct58.png" alt="image.png" title="image.png" /></p>
<p>电机启动匹配启动b值给了200,这部分和例程一样</p>
<p>强制启动后开启比较器</p>
<p><img src="data/attachment/forum/202412/22/193209wtktxtrtroo9nhar.png" alt="image.png" title="image.png" /></p>
<p>比较器中测量60度电角度,我这里用的PWMB定时器测量,这里我没有采集8次,</p>
<p>而是每采集一次就做一次平均,&gt;&gt;2相当于除以4,正好是30度电角度</p>
<p>我这测了下每中断一次做平均值和取8次做平均值差不了多少,而且是允许有较大波动</p>
<p>值低了会自动往上拉,高了会逼近中性值</p>
<p>那里的4,5行代码忽略,我测试用的</p>
<p>比较器每有效中断一次PWMB定时器停止计数,把PWMB的计数器清零后开启PWMB向上开始计数</p>
<p>电角度延时用的定时器2,用0减去计算得到的30度电角度时间装载到定时器2计数器中</p>
<p>启动定时器2开始延时计时,XiaoCi是一个bit位,XiaoCi=0等待消磁完成</p>
<p><img src="data/attachment/forum/202412/22/194321h4kynhnktqf00vk0.png" alt="image.png" title="image.png" /></p>
<p>30度电角度延时过后定时器2中断,首先先换相,换相需要消磁,给定时器2装载上80个消磁时间</p>
<p>等定时器再次中断消磁结束,XiaoCi=1比较器开启下一次循环</p>
<p>现在的现象是电机只转一圈就不转了,测得的也就是被计算后的30度电角度值100左右</p>
<p>代码逻辑和官方的一模一样,同时定时器2和PWMB定时器设置的频率是一样的</p>
<p>为什么不原搬例程,我这用的单片机硬件功能受限,没有定时器3和4</p>
<p>定时器0用来测PWM,定时器1用来做波特率发生器</p>
<p>官方的例程测量电角度时间是60度,也就是测量两次比较器中断时间</p>
<p>为什么不能只测30度电角度,从换相中断(也就是定时器2中断开始测)到比较器中断计数</p>
<p>测得的这30度电角度时间给后面30度延时用,我觉得是挺合理的,还能少用一个定时器</p>
<p><a href="forum.php?mod=attachment&amp;aid=75760" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:方波无刷电机驱动.zip</a></p>
<p>求帮我改下代码吧,我快坚持不下去了,打算放弃了</p>

梁工 发表于 2024-12-22 23:29:21

建议先完整测试我的电路和软件,再做修改移植。

社区闲人 发表于 2024-12-23 09:25:42

楼主应该检查UVW的相序是否正确。

QQ624353765 发表于 2024-12-23 10:39:21

社区闲人 发表于 2024-12-23 09:25
楼主应该检查UVW的相序是否正确。

核对了很多遍了,没问题

cnos 发表于 2024-12-23 10:47:54

<p>手动驱动一下,找点感觉再写程序吧,要不就不清不楚的。驱动电压调到1-2V,空载,然后人肉换相,直到能转一圈,再动手写程序就没有问题了。</p>

飞吻兔 发表于 2024-12-24 10:14:31

<p>我刚开始也是只能强启动的转几下,后面马上停了,我后来改了 比较器滤波次数,然后就可以正常启动了</p>

深圳湾 发表于 2024-12-24 11:02:31

<p>我也尝试过了,没成功,两个版本,做了几套都是,通电响几声,按按钮后乱转且发热严重,元件都是按电路图买的,今年工作任务比较多,暂时没时间研究了</p>

QQ624353765 发表于 2024-12-24 11:15:06

飞吻兔 发表于 2024-12-24 10:14
我刚开始也是只能强启动的转几下,后面马上停了,我后来改了 比较器滤波次数,然后就可以正常启动了
...

<p><img src="data/attachment/forum/202412/24/111446n9bscmzert0es4ss.png" alt="image.png" title="image.png" /></p>
<p>你是说的这个滤波吗,你设置了多少</p>

飞吻兔 发表于 2024-12-24 16:53:55

QQ624353765 发表于 2024-12-24 11:15
你是说的这个滤波吗,你设置了多少
void CMP_config(void)      //比较器初始化程序
{
CMPCR1 = 0x8C;                        // 1000 1100 打开比较器,P3.6作为比较器的反相输入端,ADC引脚作为正输入端
CMPCR2 = 60;                        //60个时钟滤波   比较结果变化延时周期数, 0~63
P3n_pure_input(0x40);      //CMP-(P3.6)设置为高阻.

```
P_SW2 |= 0x80;                //SFR enable   
```

//      CMPEXCFG |= (0<<6);      //bit7 bit6: 比较器迟滞输入选择: 0: 0mV,1: 10mV, 2: 20mV, 3: 30mV
//      CMPEXCFG |= (0<<2);      //bit2: 输入负极性选择, 0: 选择P3.6做输入,   1: 选择内部BandGap电压BGv做负输入.
//      CMPEXCFG |=0;                //bit1 bit0: 输入正极性选择, 0: 选择P3.7做输入,   1: 选择P5.0做输入,2: 选择P5.1做输入,3: 选择ADC输入(由ADC_CHS所选择的ADC输入端做正输入).
//      CMPEXCFG = (0<<6)+(0<<2)+3;
}

梁工这个设置拿了60,我移到**的芯片,也设置了这个65就正常了

QQ624353765 发表于 2024-12-24 19:55:42

飞吻兔 发表于 2024-12-24 16:53
void CMP_config(void)      //比较器初始化程序
{
CMPCR1 = 0x8C;                        // 1000 110 ...

这个延时最大只能设置63,6位滤波
页: [1]
查看完整版本: 受不了了,无刷电机一个月了还没有驱动成功