受不了了,无刷电机一个月了还没有驱动成功
<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>而是每采集一次就做一次平均,>>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&aid=75760" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:方波无刷电机驱动.zip</a></p>
<p>求帮我改下代码吧,我快坚持不下去了,打算放弃了</p>
建议先完整测试我的电路和软件,再做修改移植。 楼主应该检查UVW的相序是否正确。 社区闲人 发表于 2024-12-23 09:25
楼主应该检查UVW的相序是否正确。
核对了很多遍了,没问题 <p>手动驱动一下,找点感觉再写程序吧,要不就不清不楚的。驱动电压调到1-2V,空载,然后人肉换相,直到能转一圈,再动手写程序就没有问题了。</p>
<p>我刚开始也是只能强启动的转几下,后面马上停了,我后来改了 比较器滤波次数,然后就可以正常启动了</p>
<p>我也尝试过了,没成功,两个版本,做了几套都是,通电响几声,按按钮后乱转且发热严重,元件都是按电路图买的,今年工作任务比较多,暂时没时间研究了</p>
飞吻兔 发表于 2024-12-24 10:14
我刚开始也是只能强启动的转几下,后面马上停了,我后来改了 比较器滤波次数,然后就可以正常启动了
...
<p><img src="data/attachment/forum/202412/24/111446n9bscmzert0es4ss.png" alt="image.png" title="image.png" /></p>
<p>你是说的这个滤波吗,你设置了多少</p>
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就正常了 飞吻兔 发表于 2024-12-24 16:53
void CMP_config(void) //比较器初始化程序
{
CMPCR1 = 0x8C; // 1000 110 ...
这个延时最大只能设置63,6位滤波
页:
[1]