仙景 发表于 2020-11-24 09:16

【AutoChips AC7801x电机demo板测评】+从零写Hall有感BLDC方波控制

本帖最后由 仙景 于 2020-11-24 10:58 编辑

<p>首先,我们需要知道BLDC是什么,BLDC指的是无刷直流电机,无刷直流电机(Brushless Direct Current Motor, BLDCM)克服了有刷直流电机的先天性缺陷,以电子换向器取代了机械换向器,所以无刷直流电机既具有直流电机良好的调速性能等特点,又具有交流电机结构简单、无换向火花、噪音小,寿命长,运行可靠和易于维护等优点。无刷直流电机的实质是直流电源输入,采用电子逆变器将直流电转换为交流电,有转子位置反馈的三相交流永磁同步电机。</p>

<p></p>

<p>电机工作的基本原理</p>

<p><strong>右手螺旋定则</strong>,用右手握住通电螺线管,使四指弯曲与电流方向一致,那么大拇指所指的那一端就是通电螺旋管的N极。</p>

<p></p>

<div align="left" style="text-indent:0px; -webkit-text-stroke-width:0px"><span style="font-size:16px"><span style="overflow-wrap:break-word"><span style="color:#303030"><span style="font-family:&quot;Microsoft Yahei&quot;, Simsun"><span style="font-style:normal"><span style="font-variant-ligatures:normal"><span style="font-variant-caps:normal"><span style="font-weight:400"><span style="letter-spacing:normal"><span style="orphans:2"><span style="text-transform:none"><span style="white-space:normal"><span style="widows:2"><span style="word-spacing:0px"><span style="background-color:#ffffff"><span style="text-decoration-style:initial"><span style="text-decoration-color:initial"><strong style="overflow-wrap:break-word; font-weight:700"><font face="微软雅黑"><font style="overflow-wrap: break-word;"><font size="3"><font style="overflow-wrap: break-word;">直流电机模型</font></font></font></font></strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div>

<div align="left" style="text-indent:0px; -webkit-text-stroke-width:0px"><span style="font-size:16px"><span style="overflow-wrap:break-word"><span style="color:#303030"><span style="font-family:&quot;Microsoft Yahei&quot;, Simsun"><span style="font-style:normal"><span style="font-variant-ligatures:normal"><span style="font-variant-caps:normal"><span style="font-weight:400"><span style="letter-spacing:normal"><span style="orphans:2"><span style="text-transform:none"><span style="white-space:normal"><span style="widows:2"><span style="word-spacing:0px"><span style="background-color:#ffffff"><span style="text-decoration-style:initial"><span style="text-decoration-color:initial"><font face="微软雅黑"><font style="overflow-wrap: break-word;"><font size="3"><font style="overflow-wrap: break-word;">我们找到一个中学物理学过的<strong style="overflow-wrap:break-word; font-weight:700">直流电机</strong>的模型,通过磁回路分析法来进行一个简单的分析。</font></font></font></font></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div>

<div align="left" style="text-indent:0px; -webkit-text-stroke-width:0px">
<div align="left" style="text-indent:0px; -webkit-text-stroke-width:0px"><span style="font-size:16px"><span style="overflow-wrap:break-word"><span style="color:#303030"><span style="font-family:&quot;Microsoft Yahei&quot;, Simsun"><span style="font-style:normal"><span style="font-variant-ligatures:normal"><span style="font-variant-caps:normal"><span style="font-weight:400"><span style="letter-spacing:normal"><span style="orphans:2"><span style="text-transform:none"><span style="white-space:normal"><span style="widows:2"><span style="word-spacing:0px"><span style="background-color:#ffffff"><span style="text-decoration-style:initial"><span style="text-decoration-color:initial"><font face="微软雅黑"><font style="overflow-wrap: break-word;"><font size="3"><font style="overflow-wrap: break-word;">当两头的线圈通上电流时,根据右手螺旋定则,会产生方向指向右的外加磁感应强度B(如粗箭头方向所示),而<strong style="overflow-wrap:break-word; font-weight:700">中间的转子会尽量使自己内部的磁感线方向与外磁感线方向保持一致</strong>,以形成一个最短闭合磁力线回路,这样内转子就会按逆时针方向旋转了。</font></font></font></font></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div>

<div align="left" style="text-indent:0px; -webkit-text-stroke-width:0px">&nbsp;</div>

<div align="left" style="text-indent:0px; -webkit-text-stroke-width:0px"><span style="font-size:16px"><span style="overflow-wrap:break-word"><span style="color:#303030"><span style="font-family:&quot;Microsoft Yahei&quot;, Simsun"><span style="font-style:normal"><span style="font-variant-ligatures:normal"><span style="font-variant-caps:normal"><span style="font-weight:400"><span style="letter-spacing:normal"><span style="orphans:2"><span style="text-transform:none"><span style="white-space:normal"><span style="widows:2"><span style="word-spacing:0px"><span style="background-color:#ffffff"><span style="text-decoration-style:initial"><span style="text-decoration-color:initial"><font face="微软雅黑"><font style="overflow-wrap: break-word;"><font size="3"><font style="overflow-wrap: break-word;">当<strong style="overflow-wrap:break-word; font-weight:700">转子磁场方向</strong>与<strong style="overflow-wrap:break-word; font-weight:700">外部磁场方向</strong><strong style="overflow-wrap:break-word; font-weight:700">垂直</strong>时,转子所受的转动力矩最大。注意这里说的是&ldquo;力矩&rdquo;最大,而不是&ldquo;力&rdquo;最大。诚然,在转子磁场与外部磁场方向一致时,转子所受磁力最大,但此时转子呈水平状态,力臂为0,当然也就不会转动了。补充一句,<strong style="overflow-wrap:break-word; font-weight:700">力矩是力与力臂的乘积。</strong>其中一个为零,乘积就为零了。以上就是BLDC旋转的基本原理。</font></font></font></font></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div>

<div align="left" style="text-indent:0px; -webkit-text-stroke-width:0px">&nbsp;</div>

<div align="left" style="text-indent:0px; -webkit-text-stroke-width:0px">下图为一对极电机旋转示意图,三个霍尔H1、H2、H3间隔120&deg;放置一周,根据霍尔的输出状态,不断的改变A、B、C三相通电顺序,使定子形成一个旋转磁场,带动转子旋转。</div>

<div align="left" style="text-indent:0px; -webkit-text-stroke-width:0px">电机按一定方向转动时,3个霍尔的输出会按照6步的规律变化如下:</div>

<div align="left" style="text-indent:0px; -webkit-text-stroke-width:0px"></div>

<div align="left" style="text-indent:0px; -webkit-text-stroke-width:0px"><strong>BLDC有感控制系统如下:</strong>根据霍尔信号的换向顺序图,红线的方向为电流的方向,标记红线的管为打开的MOS管,每次换向只为其中的两相通电。</div>

<div align="left" style="text-indent:0px; -webkit-text-stroke-width:0px"></div>

<div align="left" style="text-indent:0px; -webkit-text-stroke-width:0px"></div>

<div align="left" style="text-indent:0px; -webkit-text-stroke-width:0px">按照这样的顺序给ABC三相加电,电机就会全速旋转起来,如果想反向旋转,按照霍尔的反向顺序给三相供电即可。直流电机的转速和电压是成正比的,如果想改变转速只需要改变导通的MOS管的PWM占空比即可,相当于调压。<br />
PWM的调节一般有三种方式,下桥臂打开,只调节上桥臂,比如第一个状态,UB给正UC给负,Q3&nbsp;Q4打开,电流从Q3流向B再经C流出到Q4最后至电源的负极。那么就可以只调节上桥臂Q3的占空比,而Q4一直打开;也可以Q3常开只调节Q4;还有一种方式为互补PWM调节,Q3和Q2为一组互补输出,Q5与Q4为一组互补输出,Q1和Q0关断;互补的好处是上管关断的瞬间电流可以由下管续流而不经过MOS管的内部续流二极管,以免在大电流时造成MOS管的烧坏。</div>

<div align="left" style="text-indent:0px; -webkit-text-stroke-width:0px"><strong>BLDC速度控制</strong></div>

<div align="left" style="text-indent:0px; -webkit-text-stroke-width:0px">在BLDC电子换相的基础上,通过更改导通时PWM占空比即可改变等效的输出电压, 从而更改来实现调速。</div>

<div align="left" style="text-indent:0px; -webkit-text-stroke-width:0px">&nbsp;</div>

<div align="left" style="text-indent:0px; -webkit-text-stroke-width:0px"><span style="font-size:20px;"><strong>有感BLDC程序开源</strong></span></div>

<div align="left" style="text-indent:0px; -webkit-text-stroke-width:0px">根据之前分享的AutoChips AC7801x电机demo板的硬件电路和相关的驱动程序,就可以写一个简单的BLDC方波控制程序。</div>

<div align="left" style="text-indent:0px; -webkit-text-stroke-width:0px">hall传感器接口</div>

<div align="left" style="text-indent:0px; -webkit-text-stroke-width:0px">
<table align="center" border="1" cellpadding="1" cellspacing="1" class="center-class" style="width: 100%;">
        <tbody>
                <tr>
                        <td>PC8</td>
                        <td>PWDT_IN0</td>
                </tr>
                <tr>
                        <td>PC7</td>
                        <td>PWDT_IN1</td>
                </tr>
                <tr>
                        <td>PC6</td>
                        <td>PWDT_IN2</td>
                </tr>
        </tbody>
</table>

<p>VR:AD调速</p>

<table align="center" border="1" cellpadding="1" cellspacing="1" class="center-class" style="width: 100%;">
        <tbody>
                <tr>
                        <td>PC1</td>
                        <td>ADC_IN9&nbsp; &nbsp;</td>
                </tr>
        </tbody>
</table>

<p>电机驱动IO引脚</p>

<table align="center" border="1" cellpadding="1" cellspacing="1" class="center-class" style="width: 100%;">
        <tbody>
                <tr>
                        <td>&nbsp; PB5</td>
                        <td>&nbsp; &nbsp;PWM1_CH0</td>
                </tr>
                <tr>
                        <td>&nbsp; PB4</td>
                        <td>&nbsp; &nbsp;PWM1_CH1</td>
                </tr>
                <tr>
                        <td>&nbsp;PB8</td>
                        <td>&nbsp; &nbsp;PWM1_CH2</td>
                </tr>
                <tr>
                        <td>&nbsp;PB7</td>
                        <td>&nbsp; &nbsp;PWM1_CH3</td>
                </tr>
                <tr>
                        <td>PB10</td>
                        <td>&nbsp; &nbsp;PWM1_CH4</td>
                </tr>
                <tr>
                        <td>PB9</td>
                        <td>&nbsp; &nbsp;PWM1_CH5</td>
                </tr>
        </tbody>
</table>

<p>&nbsp;</p>

<p>电机驱动程序</p>

<pre>
<code class="language-objectivec">void BLDC_PhaseSwitch(int16_t motorDir, uint8_t hallStatus)
{
        if(motorDir == 1)
        {
                        switch (hallStatus)
                        {
                        case 5://B+,A-
                                        BLDC_PwmUpdate(PHASEB, PHASEA);
                        break;
                        case 1: //B+,C-
                                        BLDC_PwmUpdate(PHASEB, PHASEC);
                        break;
                        case 3: //A+,C-
                                        BLDC_PwmUpdate(PHASEA, PHASEC);
                        break;
                        case 2:// A+,B-
                                        BLDC_PwmUpdate(PHASEA, PHASEB);
                        break;
                        case 6: //C+,B-
                                        BLDC_PwmUpdate(PHASEC, PHASEB);
                        break;
                        case 4://C+,A-
                                        BLDC_PwmUpdate(PHASEC, PHASEA);
                        break;
                        default:
                                        BLDC_Stop();
                        break;
                        }
        }
        else if(motorDir == 2)
        {
                        switch (hallStatus)
                        {
                        case 5://A+,B-
                                        BLDC_PwmUpdate(PHASEA, PHASEB);
                        break;
                        case 1: //C+,B-
                                        BLDC_PwmUpdate(PHASEC, PHASEB);
                        break;
                        case 3: //C+,A-
                                        BLDC_PwmUpdate(PHASEC, PHASEA);
                        break;
                        case 2:// B+,A-
                                        BLDC_PwmUpdate(PHASEB, PHASEA);
                        break;
                        case 6: //B+,C-
                                        BLDC_PwmUpdate(PHASEB, PHASEC);
                        break;
                        case 4://A+,C-
                                        BLDC_PwmUpdate(PHASEA, PHASEC);
                        break;
                        default:
                                        BLDC_Stop();
                        break;
                        }
        }
}</code></pre>

<p>main.c文件</p>

<pre>
<code class="language-objectivec">int main(void)
{
        GPIO_LedInit();
        MC_PWDT1_Init();
        CTU_Config();
        ADC_init();
        TIMER_PrdInit();
        BLDC_PWM_Init();
               
        //发波调试
        g_startupPwmRatio = ratio_q12(10);//30
        BLDC_SetMotorSpeed(g_startupPwmRatio);
       
        g_hallStatus = PWDT_GetHallStatus(PWDT1) &amp; 0x07;

        BLDC_PhaseSwitch(1,g_hallStatus);
               
        while(1)
        {
                GPIO_ToggleLedPrd();
                               
                if(g_scanKeyTime &gt;= SCAN_KEY_INTVL)
                {
                        g_scanKeyTime = 0;
                        AdjustPwmVal = (g_ADCValueBuffer*100)&gt;&gt;12;//AD调速
                        if(AdjustPwmVal != AdjustPwmValpre)
                        {
                                if(AdjustPwmVal &gt; 80)
                                {
                                        AdjustPwmVal = 80;
                                }
                                else if(AdjustPwmVal &lt; 8)
                                {
                                        AdjustPwmVal = 8;
                                }
                                g_startupPwmRatio = ratio_q12(AdjustPwmVal);//30
                                BLDC_SetMotorSpeed(g_startupPwmRatio); //设置速度
                        }
                }
                               
          if(g_hallStatus != g_hallStatuspre)
                {       
                  BLDC_PhaseSwitch(1,g_hallStatus);//换相
                        g_hallStatuspre = g_hallStatus;
                }
        }
}</code></pre>

<p>编译工程,下载程序运行可直以看到电机成功转动起来,用示波器可以看到三相线上的输出电压波形图如下:</p>

<p></p>

<p>程序在此</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>请看调速波形动态图,哈哈</p>

<p></p>
</div>
</div>

<p>&nbsp;</p>

freebsder 发表于 2020-11-24 13:10

<p>厉害了</p>

w494143467 发表于 2020-11-24 13:36

<p>一看就是专业搞电机的!</p>

仙景 发表于 2020-11-26 08:57

w494143467 发表于 2020-11-24 13:36
一看就是专业搞电机的!

<p>版主是做什么的,电机控制也是一个方向</p>

仙景 发表于 2020-11-26 08:58

freebsder 发表于 2020-11-24 13:10
厉害了

<p>简单控制,简单运行</p>

w494143467 发表于 2020-11-26 09:08

仙景 发表于 2020-11-26 08:57
版主是做什么的,电机控制也是一个方向

<p>我是搞智能穿戴设备的,偶尔玩玩物联网。</p>

仙景 发表于 2020-11-26 09:13

w494143467 发表于 2020-11-26 09:08
我是搞智能穿戴设备的,偶尔玩玩物联网。

<p>那你可以参加论坛的物联网大赛,简直就是为你订做的<img height="52" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/pleased.gif" width="48" /></p>

w494143467 发表于 2020-11-26 10:38

仙景 发表于 2020-11-26 09:13
那你可以参加论坛的物联网大赛,简直就是为你订做的

<p>哈哈,参加了,就是不知道能不能过申请哈~</p>

1103278429 发表于 2020-12-15 10:20

<p>楼主有没有了解过dsp28027+drv8305的驱动方法呀,急求!</p>

<p>&nbsp;</p>

MianQi 发表于 2021-3-18 09:14

<p>为什么6个管子都是NPN型,而不是一半NPN一半PNP呢?&ldquo;互补&rdquo;,在哪里体现呢?</p>

MianQi 发表于 2021-6-22 08:30

看不到“BLDC_PwmUpdate(PHASEB, PHASEC)”的代码,附件在我这里打不开。可否将全部文件粘贴进来?

supreme42 发表于 2021-12-7 21:06

MianQi 发表于 2021-3-18 09:14
为什么6个管子都是NPN型,而不是一半NPN一半PNP呢?&ldquo;互补&rdquo;,在哪里体现呢?

<p>互补是指PWM波形,不是只MOS管。MOS管用NPN和PNP都行,PNP内阻大一些,热量大点,NPN就是要升压。</p>
页: [1]
查看完整版本: 【AutoChips AC7801x电机demo板测评】+从零写Hall有感BLDC方波控制