lugl4313820 发表于 2022-3-24 07:39

【沁恒RISC-V内核 CH582】定时器PWM 驱动舵机

<p>【沁恒RISC-V内核 CH582】CH582 用固态继电器控制取暖器发热管可行性 https://bbs.eeworld.com.cn/thread-1197474-1-1.html</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; 我的评测作品,最后是DIY一个手机APP控制电取暖器。主要思路是改装我家的一个电取暖器,原来的取暖器是发热源是电热丝,电热加热后用风机吹出热空气,类似电吹风机的原理。现在改装的思路是用固态继电器替代手工加热开关档位,用舵机来控制风机电位器。</p>

<p>&nbsp; &nbsp; &nbsp; 前面已经用APP可以控制开关,现在准备用APP控制舵机来控制风机的电位器:</p>

<p>&nbsp; &nbsp; 一、在原来的APP下面增加3个按键,分别为控制舵机转到指定角度,并在微信小程序上增加发送指领的相关函数。</p>

<p>&nbsp;二、我所用的舵机为N年前买的舵机:ES06MA,好象最大转角只有180。</p>

<p>1、查看资料舵机的旋转角度是由一个20ms(50Hz)周期的pwm波形来控制电机旋转角度来决定旋转多少度。要想得到50HzPWM就要用到定时器PWM。</p>

<p>2、翻看例程\CH583EVT\EVT\EXAM\TMR,我决定用TMR3来做:</p>

<pre>
<code>#if 1 /* 定时器3,PWM输出 */

    GPIOB_ResetBits(GPIO_Pin_22); // 配置PWM口 PB22
    GPIOB_ModeCfg(GPIO_Pin_22, GPIO_ModeOut_PP_20mA);

    TMR3_PWMInit(High_Level, PWM_Times_1);
    TMR3_PWMCycleCfg(1200000); // 周期 50Hz 20ms具体为:60 000 000 /1 200 000 = 50
    TMR3_Disable();
    TMR3_PWMActDataWidth(600000); // 占空比 50%, 修改占空比必须暂时关闭定时器
    TMR3_Enable();

#endif</code></pre>

<p>配置好后用示波器测量PB22,得到50Hz的波形:</p>

<p>&nbsp;改写simpleProfileChangeCB接收回调函数</p>

<pre>
<code>static void simpleProfileChangeCB(uint8_t paramID, uint8_t *pValue, uint16_t len)
{
    switch(paramID)
    {
      case SIMPLEPROFILE_CHAR1:
      {
            uint8_t newValue;
            tmos_memcpy(newValue, pValue, len);
            PRINT("profile ChangeCB CHAR1.. %s\n",newValue);
            if(pValue == '0')
            {
                GPIOB_SetBits(GPIO_Pin_19);
            }
            else if (pValue == '1') {
                GPIOB_ResetBits(GPIO_Pin_19);
            }
            else if (pValue == 'a') //97 'a'
            {
                TMR3_Disable();
                TMR3_PWMActDataWidth(32000); // 0度 0.5ms
                TMR3_Enable();
            }
            else if (pValue == 'b') {
                TMR3_Disable();
                TMR3_PWMActDataWidth(96000);// 1.5ms = 60,000 *1.5
                TMR3_Enable();
            }
            else if (pValue == 'c'){
                TMR3_Disable();
                TMR3_PWMActDataWidth(128000); // 180 2ms 120*1000
                TMR3_Enable();
            }
            break;
      }</code></pre>

<p>下载程序后就可以控制舵机的转动了。</p>

<p><iframe allowfullscreen="true" frameborder="0" height="510" src="https://training.eeworld.com.cn/shareOpenCourseAPI?isauto=true&amp;lessonid=32819" style="background:#eee;margin-bottom:10px;" width="700"></iframe><br />
到此为止,基本取暖器分块都调试差不多了,下一步组装测评。</p>

nmg 发表于 2022-3-24 09:36

<p>边测评,顺手还升级了下生活物品</p>

soso 发表于 2022-3-24 09:41

<p>期待成品:)</p>

lyj33 发表于 2022-7-14 17:02

<p>我这样写,为什么程序烧进去后,初始化舵机至转一下?</p>

<p>#if 1 /* 定时器3,PWM输出 */</p>

<p>&nbsp; &nbsp; GPIOB_ResetBits(GPIO_Pin_22); // 配置PWM口 PB22<br />
&nbsp; &nbsp; GPIOB_ModeCfg(GPIO_Pin_22, GPIO_ModeOut_PP_20mA);</p>

<p>&nbsp; &nbsp; TMR3_PWMInit(High_Level, PWM_Times_1);<br />
&nbsp; &nbsp; TMR3_PWMCycleCfg(1200000); // 周期 50Hz 20ms &nbsp;详细为60 000 000/1 200 000=50<br />
&nbsp; &nbsp; TMR3_Disable();<br />
&nbsp; &nbsp; TMR3_PWMActDataWidth(600000); // 占空比 50%, 修改占空比必须暂时关闭定时器<br />
&nbsp; &nbsp; TMR3_Enable();<br />
&nbsp; &nbsp;&nbsp;<br />
&nbsp; &nbsp; TMR3_Disable();<br />
&nbsp; &nbsp; TMR3_PWMCycleCfg(32000);<br />
&nbsp; &nbsp;TMR3_Enable();<br />
&nbsp;</p>

lugl4313820 发表于 2022-7-14 20:35

lyj33 发表于 2022-7-14 17:02
我这样写,为什么程序烧进去后,初始化舵机至转一下?

#if 1 /* 定时器3,PWM输出 */

&nbsp; &nbsp;...

<p>你的波形没有变化了,就会一直停在那里,只有波形变化,才会转,有空去看下舵机的驱动原理。</p>

lyj33 发表于 2022-7-15 09:01

本帖最后由 lyj33 于 2022-7-15 10:34 编辑

<div class="quote">
<blockquote><font size="2"><a href="forum.php?mod=redirect&amp;goto=findpost&amp;pid=3157539&amp;ptid=1197629" target="_blank"><font color="#999999">lugl4313820 发表于 2022-7-14 20:35</font></a></font> 你的波形没有变化了,就会一直停在那里,只有波形变化,才会转,有空去看下舵机的驱动原理。</blockquote>
</div>

<p>控制多路舵机的话应该怎么控制呢?</p>

<p>&nbsp;</p>

lugl4313820 发表于 2022-7-15 12:50

lyj33 发表于 2022-7-15 09:01
lugl4313820 发表于 2022-7-14 20:35 你的波形没有变化了,就会一直停在那里,只有波形变化,才会转,有 ...

<p>一个IO可以控制一路呀,原理一样的。</p>
页: [1]
查看完整版本: 【沁恒RISC-V内核 CH582】定时器PWM 驱动舵机