FuShenxiao 发表于 2025-1-10 21:33

毕设记录(一)——无刷直流电机的无感控制

<div class='showpostmsg'> 本帖最后由 FuShenxiao 于 2025-1-10 21:33 编辑

<p>实验对象:P-NUCLEO-IHM03电机开发套件,包含无刷电机控制板、无刷电机驱动板以及三相云台电机,如图1。</p>

<p align="center" style="text-align: center;"> &nbsp;</p>

<p align="center">图1 电机开发套件</p>

<p>由于三相云台电机没有霍尔传感器和光电编码器用于有感控制,因此采用转子电压过零检测和直流母线电流检测用于无刷电机速度和电流的双闭环控制,其中,电机驱动电路与电压过零检测电路如图2,其控制框图如图3,实际信号传输框图如图4。其中转速调节器和电流调节器均采用带饱和的PI控制,如图5。</p>

<p align="center" style="text-align: center;"> &nbsp;</p>

<p align="center">图2 电机驱动与电压过零检测电路</p>

<p align="center" style="text-align: center;"> &nbsp;</p>

<p align="center">图3 无刷电机双闭环控制框图</p>

<p align="center" style="text-align: center;"> &nbsp;</p>

<p align="center">图4 实际信号传输框图</p>

<p align="center" style="text-align: center;"> &nbsp;</p>

<p align="center">图5 带饱和环节的PI控制器</p>

<p>对于速度环,取K<sub>p</sub>=3.85,K<sub>i</sub>=0.0124</p>

<p>为了实现无刷电机转速和电流双闭环控制,对程序配置如下:</p>

<ol>
        <li>电机基本驱动实现:实现电机的基础驱动函数,启停、6步换向组合等。</li>
        <li>初始化ADC:初始化ADC通道IO,设置ADC工作方式、开启DMA。</li>
        <li>PID闭环控制实现:实现PID的初始参数赋值、PID计算等。</li>
        <li>上位机通信协议:编写上位机通信代码,可在上位机实时显示当前速度。</li>
        <li>编写中断服务函数:PWM中断用于换向控制、堵转检测等,添加PID的周期计算调用。</li>
</ol>

<p>程序流程图如图6。</p>

<p align="center" style="text-align: center;"> &nbsp;</p>

<p align="center">图6 控制程序流程图</p>

<p>对于无刷电机旋转状态,采用分阶段启动方式,其相关参数如表1,阶段1-阶段3相关参数的变化曲线如图7。</p>

<p align="center">表1 无刷电机无感启动参数</p>

<table style="border-collapse:collapse; border:none">
        <tbody>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:2px solid black; border-right:none; border-left:none" valign="top">
                        <p>&nbsp;</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:2px solid black; border-right:none; border-left:none" valign="top">
                        <p>持续时间(ms)</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:2px solid black; border-right:none; border-left:none" valign="top">
                        <p>目标转速(rpm)</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:2px solid black; border-right:none; border-left:none" valign="top">
                        <p>相电压(V rms)</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:none; border-top:none; border-right:none; border-left:none" valign="top">
                        <p>阶段1</p>
                        </td>
                        <td style="border-bottom:none; border-top:none; border-right:none; border-left:none" valign="top">
                        <p>500</p>
                        </td>
                        <td style="border-bottom:none; border-top:none; border-right:none; border-left:none" valign="top">
                        <p>0</p>
                        </td>
                        <td style="border-bottom:none; border-top:none; border-right:none; border-left:none" valign="top">
                        <p>0.61</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:none; border-top:none; border-right:none; border-left:none" valign="top">
                        <p>阶段2</p>
                        </td>
                        <td style="border-bottom:none; border-top:none; border-right:none; border-left:none" valign="top">
                        <p>1000</p>
                        </td>
                        <td style="border-bottom:none; border-top:none; border-right:none; border-left:none" valign="top">
                        <p>236</p>
                        </td>
                        <td style="border-bottom:none; border-top:none; border-right:none; border-left:none" valign="top">
                        <p>4.99</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:none; border-top:none; border-right:none; border-left:none" valign="top">
                        <p>阶段3</p>
                        </td>
                        <td style="border-bottom:none; border-top:none; border-right:none; border-left:none" valign="top">
                        <p>500</p>
                        </td>
                        <td style="border-bottom:none; border-top:none; border-right:none; border-left:none" valign="top">
                        <p>236</p>
                        </td>
                        <td style="border-bottom:none; border-top:none; border-right:none; border-left:none" valign="top">
                        <p>4.99</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:2px solid black; border-top:none; border-right:none; border-left:none" valign="top">
                        <p>阶段4</p>
                        </td>
                        <td style="border-bottom:2px solid black; border-top:none; border-right:none; border-left:none" valign="top">
                        <p>&nbsp;</p>
                        </td>
                        <td style="border-bottom:2px solid black; border-top:none; border-right:none; border-left:none" valign="top">
                        <p>1000</p>
                        </td>
                        <td style="border-bottom:2px solid black; border-top:none; border-right:none; border-left:none" valign="top">
                        <p>4.99</p>
                        </td>
                </tr>
        </tbody>
</table>

<p align="center"> &nbsp;</p>

<p align="center">图7 启动目标转速和相电压与时间关系</p>

<p>以1000rpm为无刷电机目标转速,得到无刷电机转速随时间变化曲线如图8。</p>

<p align="center"> &nbsp;</p>

<p align="center">图8 无刷电机转速变化</p>

<p>&nbsp;</p>

<p>目前存在的问题:由于代码调用的是ST官方电机库的函数,因此底层机理难以修改,部分变量只能在ST的电机控制工具中查看,无法导出分析。</p>

<p style="text-align: center;">&nbsp;</p>

<p>下一步计划:基于市面上其他基于STM32的电机控制案例重构代码,并建立基于电机开发套件中三相云台电机的模糊控制器控制规律。</p>

<p>&nbsp;</p>

<p>工程文件</p>

<div></div>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

Jacktang 发表于 2025-1-11 10:01

<p>由于代码调用的是ST官方电机库的函数,因此底层机理难以修改,部分变量只能在ST的电机控制工具中查看,无法导出分析。</p>

<p>只能在ST的电机控制工具中查看,这个什么原因</p>

FuShenxiao 发表于 2025-1-11 12:07

Jacktang 发表于 2025-1-11 10:01
由于代码调用的是ST官方电机库的函数,因此底层机理难以修改,部分变量只能在ST的电机控制工具中查看,无法 ...

<p>就是比如说我要写PID,ST电机库就有PID,但是这个PID就是单纯的PID,我想用改进PID算法,比如模糊PID啥的就比较难修改了。然后相关变量的值得在Motor&nbsp;Pilot里面看,具体寄存器值在程序里怎么看我还没写好查看方法。</p>
页: [1]
查看完整版本: 毕设记录(一)——无刷直流电机的无感控制