3442|4

270

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

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

本帖最后由 怀揣少年梦 于 2022-5-17 18:38 编辑

一、PWM与方波介绍

1、PWM——Pulse Width Modulation:脉冲宽度调制(简称脉宽调制,通俗的讲就是调节脉冲的宽度)

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

呼吸灯现象如下:

呼吸灯

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

二、硬件准备

1、PWM驱动硬件介绍

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

 

        b)、根据RA6M4的datasheet,P106对应的定时器是定时器通道8。

2、方波测试引脚

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

 

三、软件操作

1、RA Smart Configurator

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

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

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

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

 

 

2、RT-Thread Studio

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

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

点击右箭头到硬件配置页面

 

使能PWM0和PWM1

    2)、在hal_entry.c中添加对应的呼吸灯代码。

打开pwm0使能

/*
 * 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);
}

3、心得体会

 

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

 

四、呼吸灯实际波形测试现象

示波器

最新回复

666  详情 回复 发表于 2022-5-24 20:33
点赞 关注

回复
举报

7462

帖子

2

TA的资源

五彩晶圆(高级)

沙发
 

这么快跑起来了。

点评

测评都做完了,就是没有时间写  详情 回复 发表于 2022-5-18 10:46
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 

回复

270

帖子

0

TA的资源

一粒金砂(高级)

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

测评都做完了,就是没有时间写

点评

nmg
我以为你们都是边测评边写呢  详情 回复 发表于 2022-5-23 15:41
 
 
 

回复

5221

帖子

239

TA的资源

管理员

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

我以为你们都是边测评边写呢

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 

666

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
PIC系列单片机程序设计基础

这本书给了大家想学习PIC单片机的朋友一个很大的帮助该书是一本基础教程书初学着很好的教程

Protel99SE深度汉化补丁

目前汉化最深的补丁. 解压密码www.pp51.com

聊聊for循环

for循环是我最喜欢的循环结构了,本来以为我对for循环已经很了解了,但在最近是使用之中不断的出问题,所以我又对for循环进行 ...

在beaglebone上实现AM3359与FPGA的GPMC通信

作者:chenzhufly QQ:36886052 ( 转载请注明出处)1.参考资料 《AM335x ARM® Cortex™-A8 Microprocessors Technic ...

Infineon Position2Go开发套件测评--skypinglee

此内容由EEWORLD论坛 一、开箱 很荣幸能参与到这次的Infineon Position2Go雷达套件的评测,经过一周的等待,板卡终于 ...

电子血压计原理两个问题

电子血压计原理两个问题 1.袖带自动充气,到一定压力(比收缩压高30-50mmHg),此时收缩压都是未知的,血压计是如何判断当前 ...

32.768K晶体不起振,选型很重要!

在设计一个32位MCU作为工控机协处理的控制器项目时,外接了8M的有源晶振和32.768K的无源晶体。当时采用的是一颗国产插件的32.768 ...

【Beetle ESP32-C3】硬件分析

本帖最后由 dcexpert 于 2022-8-2 09:36 编辑 Beetle ESP32-C3 开发板的资料可以在 DFRobot 网站上找到,链接是:https://wik ...

分享个迷你T2资料

想要DIY的网友可以收个。一个DIY群里收来了群主作品的资料。 658949 658948 658947 658946 658945 658943 ...

《Rust实战》书友互动第五集:深入理解数据

从第五集开始,进入《Rust实战》的第二部分:揭开系统编程的神秘面纱,都有哪些东西需要我们去揭晓呢? 演绎时间:即 ...

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表