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——Pulse Width Modulation:脉冲宽度调制(简称脉宽调制,通俗的讲就是调节脉冲的宽度)</h3>
<p> a)、就是通过控制定时器,不断更新高低平的时间,假如定时器的周期是T,那么高电平时间是th,低电平时间就是tl,那么高电平的占空比就是th/T。只需要调整th时间即可得到变化的高电平,并且用于驱动LED,LED显示就会显示呼吸一样,俗称呼吸灯。波形图</p>
<p></p>
<p>呼吸灯现象如下:</p>
<p>0359255c487c5b6593fabfd26984fe02</p>
<p> b)、方波就是在一个定时器的时钟周期,高低电平时间各占一半,也就是占空比为50%。</p>
<h2 id="二、硬件准备">二、硬件准备</h2>
<h3 id="1、pwm驱动硬件介绍">1、PWM驱动硬件介绍</h3>
<p> a)、使用定时器CPK-RA6M4 MCU 评估板上的用户LED3,该LED3由MCU的引脚P106驱动,并且该LED3串了一个470欧姆的限流电阻,是因为发光二极管的驱动电流不能太大,一般在3ma-20ma,使用万用表量了一下LED两端电压为1.97V,因此,计算出来的电流在2.8mA。</p>
<p></p>
<p> </p>
<p> b)、根据RA6M4的datasheet,P106对应的定时器是定时器通道8。</p>
<p></p>
<h3 id="2、方波测试引脚">2、方波测试引脚</h3>
<p> 使用MCU引脚P602输出PWM,占空比为50%的方波。并且使用定时器1来产生PWM</p>
<p> </p>
<h2 id="三、软件操作">三、软件操作</h2>
<h3 id="1、ra-smart-configurator">1、RA Smart Configurator</h3>
<p> 配置定时器0和1,定时器0用于产生变化的PWM,以驱动LED3以及在P603引脚上产生方波,定时1产生方波。</p>
<p> 1)、引脚配置。打开之前的RT-Thread Studio创建的工程,在项目资源管理器双击打开RA Smart Configurator,如图所示,设置对应的引脚为定时器PWM功能。</p>
<p></p>
<p> 2)、定时器配置。如图所示,在stack中添加定时器功能,只需要双击New Stack即可。</p>
<p></p>
<p> 添加好定时器功能,就要配置定时器具体参数。在stack中点击对应的定时器,就会跳出对应的参数设置。如图所示。图中有参数具体介绍。</p>
<p> </p>
<p></p>
<p> </p>
<h3 id="2、rt-thread-studio">2、RT-Thread Studio</h3>
<p>配置MCU的硬件,还要进行对RT-Thread进行使能PWM输出,因为这样能够把RT-Thread的使用框架与RA联系起来。</p>
<p> 1)、在工程中双击RT-Thread Settings,选中硬件选项,在芯片设备驱动下,然后找到PWM,使能PWM即可。如图</p>
<p>点击右箭头到硬件配置页面</p>
<p> </p>
<p>使能PWM0和PWM1</p>
<p></p>
<p> 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 <rtthread.h>
#include "hal_data.h"
#include <rtdevice.h>
#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 >= 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> </p>
<p> 使用瑞萨提供的RA SMart Configurator 配置外设,真是的好方便,你不需要知道外设怎么工作,只需要知道用什么配置,配置相应的参数,再结合RT-Thread Studio 直接使用RT-Thread的使用框架,更快地上手,并且能更快地投入使用。另外瑞萨的PWM运用,可以配置时钟源、还是PWM周期、开始占空比、并且还能够配置中断事件以及PWM模式,还可以输出三角波模式,整体而言,瑞萨的PWM模块使用还是很方便的。</p>
<p> </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> <p>这么快跑起来了。</p>
freebsder 发表于 2022-5-17 23:17
这么快跑起来了。
<p>测评都做完了,就是没有时间写:loveliness:</p> 怀揣少年梦 发表于 2022-5-18 10:46
测评都做完了,就是没有时间写
<p>我以为你们都是边测评边写呢</p>
<p>666</p>
页:
[1]