kit7828 发表于 2022-5-30 21:32

[RTT&瑞萨高性能 CPK-RA6M4] 3、PWM实现呼吸灯评测

<div class='showpostmsg'><p>一、功能模块的硬件介绍</p>

<p>PWM 是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调制,简称脉宽调制。通过调节单位周期的有效电平的时间(宽度)实现调光、调频等功能。</p>

<p>CPK-RA6M4开发板中,用户LED3的控制管脚是P106。</p>

<p> &nbsp;&nbsp; 在FSP的芯片配置图中,可以看到和P106关联的定时器通道为GTIOC8B。</p>

<p>&nbsp;开发板的连接,还是用的前面的串口7(P613、P614)</p>

<p> &nbsp;</p>

<p>二、功能模块的使用说明</p>

<p>打开RTT Studio,在原来的项目基础上,打开FSP,</p>

<p>&nbsp;新建TIMER,General PWM</p>

<p>选中新建的g_timer0</p>

<p>修改其中参数如下图</p>

<p>&nbsp;这里的Channel应该是绑定g_timer的,2个数值最好一致。可以见到最下方的管脚为P106,和LED3的控制管脚相符。</p>

<p>设置完成后点击上方的Generate Project Content,在项目文档中生成相关配置。&nbsp;接下来,打开RTT Settings,使能PWM以及PWM8</p>

<p>&nbsp;这里的GPT8和前面FSP的g-timer8相配。</p>

<p>然后保存Ctrl-S。</p>

<p>在RTT 的开发文档中https://www.rt-thread.org/document/site/#/,通过标准文档-&gt;设备和驱动-&gt;PWM设备</p>

<p></p>

<p>复制示例代码。&nbsp;</p>

<p>三、代码分析及说明</p>

<p>在RTT项目树中,找到SRC,右键新建文件</p>

<p>&nbsp;取名pwm.c,黏贴PWM示例代码后,稍作修改</p>

<pre>
<code>#include &lt;rtthread.h&gt;
#include &lt;rtdevice.h&gt;

#define PWM_DEV_NAME      "pwm8"/* PWM设备名称 */
#define PWM_DEV_CHANNEL      0   /* PWM通道 */

struct rt_device_pwm *pwm_dev;      /* PWM设备句柄 */
rt_uint32_t period, pulse, dir;

//static int pwm_led_sample(int argc, char *argv[])
int pwm_led_sample(void)
{

    period = 500000;    /* 周期为0.5ms,单位为纳秒ns */
    dir = 1;            /* PWM脉冲宽度值的增减方向 */
    pulse = 0;          /* PWM脉冲宽度值,单位为纳秒ns */

    /* 查找设备 */
    pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
    if (pwm_dev == RT_NULL)
    {
      rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME);
      return RT_ERROR;
    }

    /* 设置PWM周期和脉冲宽度默认值 */
    rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
    /* 使能设备 */
    rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
    return 0;
}

void PWM_Led(void)
{
    //rt_thread_mdelay(50);
    if (dir)
    {
      pulse += 5000;      /* 从0值开始每次增加5000ns */
    }
    else
    {
      pulse -= 5000;      /* 从最大值开始每次减少5000ns */
    }
    if (pulse &gt;= period)
    {
      dir = 0;
    }
    if (0 == pulse)
    {
      dir = 1;
    }

    /* 设置PWM周期和脉冲宽度 */
    rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
}

/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(pwm_led_sample, pwm sample);</code></pre>

<p>这里,需要特别说明的是PWM设备名称和通道,设备名称一定要选pwm8,而通道要改成0,前面测试了很多通道都失败<img height="33" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/sweat.gif" width="32" />。</p>

<p>#define PWM_DEV_NAME &nbsp; &nbsp; &nbsp; &nbsp;&quot;pwm8&quot; &nbsp;/* PWM设备名称 */<br />
#define PWM_DEV_CHANNEL &nbsp; &nbsp; &nbsp;0 &nbsp; /* PWM通道 */</p>

<p>然后再修改下hal_entry.c中的主体函数</p>

<pre>
<code>void hal_entry(void)
{
    rt_kprintf("\nHello RT-Thread!\n");
    pwm_led_sample();
    while (1)
    {
      //rt_pin_write(LED3_PIN, PIN_HIGH);
       // rt_thread_mdelay(500);
       // rt_pin_write(LED3_PIN, PIN_LOW);
      rt_thread_mdelay(50);
      PWM_Led();
    }
}</code></pre>

<p>在这里选择直接启动PWM,没有通过msh,(msh中依然可以通过pwm_led_sample启动)</p>

<p>下面就是编译和下载,编译过程中有两个警告信息,是hal_entry主体函数中的两个调用函数的声明,对结果没太大影响,就懒得处理了。</p>

<p>四、心得体会</p>

<p>使用FSP和RTT Settings对硬件的处理非常方便,不需要写驱动文档,直接就能运行,这点非常方便和快速,也是个人非常喜欢RTT的主要原因,对当今的快速开发非常有帮助。</p>

<p>但一定要有详细文档支持,比如,PWM设置对PWM设备、定时器和通道的说明,如果缺少,就只能一个个尝试了,很是苦恼。</p>

<p>d1a454f5791be4ca604ae2975123bf71<br />
&nbsp;</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>

freebsder 发表于 2022-5-31 09:42

<p>板子不错,期待后续!</p>

lugl4313820 发表于 2023-4-24 16:58

<p>这里,需要特别说明的是PWM设备名称和通道,设备名称一定要选pwm8,而通道要改成0,前面测试了很多通道都失败。其他通道,是不是IO没有对应好呀。</p>
页: [1]
查看完整版本: [RTT&瑞萨高性能 CPK-RA6M4] 3、PWM实现呼吸灯评测