【沁恒RISC-V内核 CH582】定时器PWM 驱动舵机
<p>【沁恒RISC-V内核 CH582】CH582 用固态继电器控制取暖器发热管可行性 https://bbs.eeworld.com.cn/thread-1197474-1-1.html</p><p> 我的评测作品,最后是DIY一个手机APP控制电取暖器。主要思路是改装我家的一个电取暖器,原来的取暖器是发热源是电热丝,电热加热后用风机吹出热空气,类似电吹风机的原理。现在改装的思路是用固态继电器替代手工加热开关档位,用舵机来控制风机电位器。</p>
<p> 前面已经用APP可以控制开关,现在准备用APP控制舵机来控制风机的电位器:</p>
<p> 一、在原来的APP下面增加3个按键,分别为控制舵机转到指定角度,并在微信小程序上增加发送指领的相关函数。</p>
<p> 二、我所用的舵机为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> 改写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&lessonid=32819" style="background:#eee;margin-bottom:10px;" width="700"></iframe><br />
到此为止,基本取暖器分块都调试差不多了,下一步组装测评。</p>
<p>边测评,顺手还升级了下生活物品</p>
<p>期待成品:)</p>
<p>我这样写,为什么程序烧进去后,初始化舵机至转一下?</p>
<p>#if 1 /* 定时器3,PWM输出 */</p>
<p> GPIOB_ResetBits(GPIO_Pin_22); // 配置PWM口 PB22<br />
GPIOB_ModeCfg(GPIO_Pin_22, GPIO_ModeOut_PP_20mA);</p>
<p> TMR3_PWMInit(High_Level, PWM_Times_1);<br />
TMR3_PWMCycleCfg(1200000); // 周期 50Hz 20ms 详细为60 000 000/1 200 000=50<br />
TMR3_Disable();<br />
TMR3_PWMActDataWidth(600000); // 占空比 50%, 修改占空比必须暂时关闭定时器<br />
TMR3_Enable();<br />
<br />
TMR3_Disable();<br />
TMR3_PWMCycleCfg(32000);<br />
TMR3_Enable();<br />
</p>
lyj33 发表于 2022-7-14 17:02
我这样写,为什么程序烧进去后,初始化舵机至转一下?
#if 1 /* 定时器3,PWM输出 */
...
<p>你的波形没有变化了,就会一直停在那里,只有波形变化,才会转,有空去看下舵机的驱动原理。</p>
本帖最后由 lyj33 于 2022-7-15 10:34 编辑
<div class="quote">
<blockquote><font size="2"><a href="forum.php?mod=redirect&goto=findpost&pid=3157539&ptid=1197629" target="_blank"><font color="#999999">lugl4313820 发表于 2022-7-14 20:35</font></a></font> 你的波形没有变化了,就会一直停在那里,只有波形变化,才会转,有空去看下舵机的驱动原理。</blockquote>
</div>
<p>控制多路舵机的话应该怎么控制呢?</p>
<p> </p>
lyj33 发表于 2022-7-15 09:01
lugl4313820 发表于 2022-7-14 20:35 你的波形没有变化了,就会一直停在那里,只有波形变化,才会转,有 ...
<p>一个IO可以控制一路呀,原理一样的。</p>
页:
[1]