fengke 发表于 2021-3-30 11:46

疯壳AI开源无人机PWM(电机控制)

<div class='showpostmsg'><p>一、PWM简介</p>

<p>脉冲宽度调制(PWM),是英文&ldquo;Pulse Width Modulation&rdquo;的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。</p>

<p>PWM在生活中非常的常见,小到呼吸灯的闪烁,达到航天飞船都会应用到PWM技术。PWM的波形如下图所示。</p>

<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587888194413811.png" title="1587888194413811.png" /></p>

<p>二、占空比简介</p>

<p>占空比是脉冲宽度调制技术中常用专业术语,占空比是指在一个时钟脉冲周期(T)内,高电平(t1)的时间占总周期时间的比值,即占空比(duty)=t1/T*100%</p>

<p>如下图所示是一系列典型的脉冲波形。</p>

<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587888209139690.png" title="1587888209139690.png" /></p>

<p>第一个PWM波,周期为10ms,高电平的时间为4ms,所以占空比为40%,同理第二个PWM波为60%,第三个为80%。</p>

<p>一般地,占空比反映了等效幅值的大小:占空比越大,等效幅值越高;占空比越小,等效幅值越低。如下图所示为不同占空比对应等效幅值的关系示意图。</p>

<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587888221316960.png" title="1587888221316960.png" /></p>

<p>三、STM32的PWM模式</p>

<p>STM32上定时器有专门的PWM模式,它的原理是通过定时器使用比较输出的方式如下图所示产生波形。</p>

<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587888232981987.png" title="1587888232981987.png" /></p>

<p>ARR为自动重载寄存器,CCR为捕获/比较寄存器,CNT就是定时器的计数器,CNT的值从0开始递增,使用PWM模式后,可以设置有效电平,以及PWM的模式。上图所示的是当CNT的值小于CCRx时,输出低电平,当CNT的值大于CCRx时,输出高点平,所以我们可以通过改变ARR的值来改变PWM的周期,改变CCRx的值来改变PWM的占空比,从而实现任意频率任意占空比的PWM波。</p>

<p>四、寄存器</p>

<p>STM32的PWM输出模式涉及到以下寄存器。</p>

<p>(1)TIMx_CR1:定时器控制寄存器1,如下图所示。</p>

<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587888261884942.png" title="1587888261884942.png" /></p>

<p>其中CKD来设置时钟分频,ARPE来使能自动重载预装载,CEN来使能计数器。</p>

<p>(2)TIMx_CCMR1:定时器捕获比较模式寄存器,如下图所示。</p>

<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587888274396700.png" title="1587888274396700.png" /></p>

<p>&nbsp; OC1M来配置PWM的模式,PWM模式1,CNT&lt;CCR1时为有效状态、CNT&gt;CCR1时为无效状态;PWM模式2,CNT&lt;CCR1为无效状态、CNT&gt;CCR1为有效状态。OC1PE来使能预装载。CC1S来配置通道的输入输出模式(默认为输出模式)。</p>

<p>(3)TIMx_CCER:捕获比较使能寄存器,如下图所示。</p>

<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587888283182810.png" title="1587888283182810.png" /></p>

<p>CC1P来配置输出极性,可以选择高电平有效或者低电平有效。CC1E来使能捕获/比较。</p>

<p>五、PWM电机控制实验</p>

<p>PWM电机控制实验使用STM32的定时器的PWM输出功能,可对飞控上的电机所在的引脚,产生不同占空比的PWM,从而实现让四个电机以不同的速度旋转。(注意:做实验的时候,占空比不要调节过大,该实验会使旋翼转动,要小心无人机的旋翼划伤手)无人机的四个旋翼如下图所示。</p>

<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587888294300535.png" title="1587888294300535.png" /></p>

<p>&nbsp;</p>

<p>根据原理图,可以看到四个电机分别由两个AO9926C控制,AO9926C其实想当于是两路的N沟道MOS管,两个AO9926C的四个MOS管的G极(栅极)接口分别是:PB6、PB7、PB8、PB9,如下图所示。</p>

<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587888304466552.png" title="1587888304466552.png" /></p>

<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587888309816559.png" title="1587888309816559.png" /></p>

<p>查看数据手册可知,PB6、PB7、PB8、PB9分别对应的是TIM4_CH1、TIM4_CH2、TIM4_CH3、TIM4_CH4,即定时器4的输出通道1~4。</p>

<p>配置输出PWM的代码编写的思路如下:</p>

<p>&nbsp;</p>

<table>
        <tbody>
                <tr>
                        <td>
                        <p>1</p>
                        </td>
                        <td>
                        <p>管脚配置</p>
                        </td>
                        <td>
                        <p>1、定义结构体;</p>

                        <p>2、使能时钟;</p>

                        <p>3、填充结构体;</p>

                        <p>4、装载结构体。</p>
                        </td>
                </tr>
                <tr>
                        <td>
                        <p>2</p>
                        </td>
                        <td>
                        <p>定时器配置</p>
                        </td>
                        <td>
                        <p>1、定义结构体;</p>

                        <p>2、使能时钟;</p>

                        <p>3、填充结构体;</p>

                        <p>4、装载结构体。</p>
                        </td>
                </tr>
                <tr>
                        <td>
                        <p>3</p>
                        </td>
                        <td>
                        <p>PWM输出参数配置</p>
                        </td>
                        <td>
                        <p>1、定义结构体;</p>

                        <p>2、填充结构体;</p>

                        <p>3、装载结构体;</p>

                        <p>4、使能输出。</p>
                        </td>
                </tr>
                <tr>
                        <td>
                        <p>4</p>
                        </td>
                        <td>
                        <p>改变占空比</p>
                        </td>
                        <td>
                        <p>1、改变占空比参数。</p>
                        </td>
                </tr>
        </tbody>
</table>

<p>定时器PWM输出的初始化代码如下:</p>

<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587888345244816.png" title="1587888345244816.png" /></p>

<p>装载不同的CCR值,产生不同的占空比,从而使四个电机以不同的速度旋转,代码如下图所示。</p>

<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587888362573500.png" title="1587888362573500.png" /></p>

<p>其中TIM4_CH1装载CCR值为25、TIM4_CH2装载CCR值为50、TIM4_CH3装载CCR值为75、TIM4_CH4装载CCR值为100。如下图所示。</p>

<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587888374294798.png" title="1587888374294798.png" /></p>

<p>保存、编译、下载代码(注意旋翼会转动,小心划伤),可以看到四个旋翼以不同的速度转动,其中转速的排序为接在PB6的电机&lt;接在PB7的电机&lt;接在PB8的电机&lt;接在PB9的电机。</p>
</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>

火辣西米秀 发表于 2021-3-31 07:46

<p>可以,楼主把 STM32的PWM模式整了遍,不懂的PWM的可以来学习一下</p>

h472438470 发表于 2021-9-12 13:14

<p>疯壳AI开源无人机 &nbsp; &nbsp; &nbsp;感谢楼主的整个xi整个系列系统性分享 &nbsp; 谢谢</p>
页: [1]
查看完整版本: 疯壳AI开源无人机PWM(电机控制)