怀揣少年梦 发表于 2022-5-15 21:42

RTT&瑞萨高性能 CPK-RA6M4 开发板测评——PWM呼吸灯与输出方波

<div class='showpostmsg'> 本帖最后由 怀揣少年梦 于 2022-5-17 18:38 编辑

<h1 id="rttandamp瑞萨高性能-cpk-ra6m4-开发板测评pwm与方波测试">一、PWM与方波介绍</h1>

<h3 id="1、pwmpulse-width-modulation:脉冲宽度调制(简称脉宽调制,通俗的讲就是调节脉冲的宽度)">1、PWM&mdash;&mdash;Pulse Width Modulation:脉冲宽度调制(简称脉宽调制,通俗的讲就是调节脉冲的宽度)</h3>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a)、就是通过控制定时器,不断更新高低平的时间,假如定时器的周期是T,那么高电平时间是th,低电平时间就是tl,那么高电平的占空比就是th/T。只需要调整th时间即可得到变化的高电平,并且用于驱动LED,LED显示就会显示呼吸一样,俗称呼吸灯。波形图</p>

<p></p>

<p>呼吸灯现象如下:</p>

<p>0359255c487c5b6593fabfd26984fe02</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b)、方波就是在一个定时器的时钟周期,高低电平时间各占一半,也就是占空比为50%。</p>

<h2 id="二、硬件准备">二、硬件准备</h2>

<h3 id="1、pwm驱动硬件介绍">1、PWM驱动硬件介绍</h3>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a)、使用定时器CPK-RA6M4 MCU 评估板上的用户LED3,该LED3由MCU的引脚P106驱动,并且该LED3串了一个470欧姆的限流电阻,是因为发光二极管的驱动电流不能太大,一般在3ma-20ma,使用万用表量了一下LED两端电压为1.97V,因此,计算出来的电流在2.8mA。</p>

<p></p>

<p>&nbsp;</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b)、根据RA6M4的datasheet,P106对应的定时器是定时器通道8。</p>

<p></p>

<h3 id="2、方波测试引脚">2、方波测试引脚</h3>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用MCU引脚P602输出PWM,占空比为50%的方波。并且使用定时器1来产生PWM</p>

<p>&nbsp;</p>

<h2 id="三、软件操作">三、软件操作</h2>

<h3 id="1、ra-smart-configurator">1、RA Smart Configurator</h3>

<p>&nbsp;配置定时器0和1,定时器0用于产生变化的PWM,以驱动LED3以及在P603引脚上产生方波,定时1产生方波。</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;1)、引脚配置。打开之前的RT-Thread Studio创建的工程,在项目资源管理器双击打开RA Smart Configurator,如图所示,设置对应的引脚为定时器PWM功能。</p>

<p></p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;2)、定时器配置。如图所示,在stack中添加定时器功能,只需要双击New Stack即可。</p>

<p></p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;添加好定时器功能,就要配置定时器具体参数。在stack中点击对应的定时器,就会跳出对应的参数设置。如图所示。图中有参数具体介绍。</p>

<p>&nbsp;</p>

<p></p>

<p>&nbsp;</p>

<h3 id="2、rt-thread-studio">2、RT-Thread Studio</h3>

<p>配置MCU的硬件,还要进行对RT-Thread进行使能PWM输出,因为这样能够把RT-Thread的使用框架与RA联系起来。</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;1)、在工程中双击RT-Thread Settings,选中硬件选项,在芯片设备驱动下,然后找到PWM,使能PWM即可。如图</p>

<p>点击右箭头到硬件配置页面</p>

<p>&nbsp;</p>

<p>使能PWM0和PWM1</p>

<p></p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;2)、在hal_entry.c中添加对应的呼吸灯代码。</p>

<p>打开pwm0使能</p>

<pre>
<code>/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date         Author      Notes
* 2021-10-10   Sherman       first version
* 2021-11-03   Sherman       Add icu_sample
*/

#include &lt;rtthread.h&gt;
#include "hal_data.h"
#include &lt;rtdevice.h&gt;
#include "sensor_renesas_isl29035.h"
#include "OLED.h"

void breathing_light(void);
//#define LED3_PIN    BSP_IO_PORT_01_PIN_06
#define USER_INPUT"P105"
#define PWM_DEV_NAME      "pwm0"/* PWM设备名称 */
#define PWM_DEV_CHANNEL   0       /* PWM通道 */
#define PWM_DEV_NAME_ONE      "pwm1"/* PWM设备名称 */
#define PWM_DEV_CHANNEL_ONE   1       /* PWM通道 */
#define ISL29035_I2C_BUS "i2c1"

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


void hal_entry(void)
{
      rt_kprintf("\nHello RT-Thread!\n");
      while (1)
      {
            rt_thread_mdelay(50);
            breathing_light();
      }
}

void irq_callback_test(void *args)
{
    rt_kprintf("\n IRQ00 triggered \n");
}

void icu_sample(void)
{
    /* init */
    rt_uint32_t pin = rt_pin_get(USER_INPUT);
    rt_kprintf("\n pin number : 0x%04X \n", pin);
    rt_err_t err = rt_pin_attach_irq(pin, PIN_IRQ_MODE_RISING, irq_callback_test, RT_NULL);
    if(RT_EOK != err)
    {
      rt_kprintf("\n attach irq failed. \n");
    }
    err = rt_pin_irq_enable(pin, PIN_IRQ_ENABLE);
    if(RT_EOK != err)
    {
      rt_kprintf("\n enable irq failed. \n");
    }
}
MSH_CMD_EXPORT(icu_sample, icu sample);

static int pwm_led_sample(int argc, char *argv[])
{
    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;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(pwm_led_sample, pwm sample);

static int square_wave_sample(int argc, char *argv[])
{
    rt_uint32_t period_square, pulse_square;
    period_square = 200000;    /* 周期为0.5ms,单位为纳秒ns */
    pulse_square = 100000;          /* PWM脉冲宽度值,单位为纳秒ns */

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

    /* 设置PWM周期和脉冲宽度默认值 */
    rt_pwm_set(pwm_dev_one, PWM_DEV_CHANNEL_ONE, period_square, pulse_square);
    /* 使能设备 */
    rt_pwm_enable(pwm_dev_one, PWM_DEV_CHANNEL_ONE);
    rt_kprintf("pwm sample run%s device!\n", PWM_DEV_NAME_ONE);
    return 0;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(square_wave_sample, square wave);

void breathing_light(void) {
    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);
//    rt_pwm_set(pwm_dev_one, PWM_DEV_CHANNEL_ONE, period, pulse);
}
</code></pre>

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

<p>&nbsp;</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用瑞萨提供的RA SMart Configurator 配置外设,真是的好方便,你不需要知道外设怎么工作,只需要知道用什么配置,配置相应的参数,再结合RT-Thread Studio 直接使用RT-Thread的使用框架,更快地上手,并且能更快地投入使用。另外瑞萨的PWM运用,可以配置时钟源、还是PWM周期、开始占空比、并且还能够配置中断事件以及PWM模式,还可以输出三角波模式,整体而言,瑞萨的PWM模块使用还是很方便的。</p>

<p>&nbsp;</p>

<p>四、呼吸灯实际波形测试现象</p>

<p>1e2baf07a1cc0a59e8969074a62b7f87</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-17 23:17

<p>这么快跑起来了。</p>

怀揣少年梦 发表于 2022-5-18 10:46

freebsder 发表于 2022-5-17 23:17
这么快跑起来了。

<p>测评都做完了,就是没有时间写:loveliness:</p>

nmg 发表于 2022-5-23 15:41

怀揣少年梦 发表于 2022-5-18 10:46
测评都做完了,就是没有时间写

<p>我以为你们都是边测评边写呢</p>

elecfxc 发表于 2022-5-24 20:33

<p>666</p>
页: [1]
查看完整版本: RTT&瑞萨高性能 CPK-RA6M4 开发板测评——PWM呼吸灯与输出方波