2754|2

309

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

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

一、功能模块的硬件介绍

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

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

   在FSP的芯片配置图中,可以看到和P106关联的定时器通道为GTIOC8B。

 开发板的连接,还是用的前面的串口7(P613、P614)

 

二、功能模块的使用说明

打开RTT Studio,在原来的项目基础上,打开FSP,

 新建TIMER,General PWM

选中新建的g_timer0

修改其中参数如下图

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

设置完成后点击上方的Generate Project Content,在项目文档中生成相关配置。

 接下来,打开RTT Settings,使能PWM以及PWM8

 这里的GPT8和前面FSP的g-timer8相配。

然后保存Ctrl-S。

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

复制示例代码。 

三、代码分析及说明

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

 取名pwm.c,黏贴PWM示例代码后,稍作修改

#include <rtthread.h>
#include <rtdevice.h>

#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 >= 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);

这里,需要特别说明的是PWM设备名称和通道,设备名称一定要选pwm8,而通道要改成0,前面测试了很多通道都失败

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

然后再修改下hal_entry.c中的主体函数

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();
    }
}

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

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

四、心得体会

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

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

PWM

 

最新回复

这里,需要特别说明的是PWM设备名称和通道,设备名称一定要选pwm8,而通道要改成0,前面测试了很多通道都失败。其他通道,是不是IO没有对应好呀。   详情 回复 发表于 2023-4-24 16:58
点赞 关注

回复
举报

7671

帖子

2

TA的资源

五彩晶圆(高级)

沙发
 

板子不错,期待后续!

 
个人签名

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

 

回复

7048

帖子

11

TA的资源

版主

板凳
 

这里,需要特别说明的是PWM设备名称和通道,设备名称一定要选pwm8,而通道要改成0,前面测试了很多通道都失败。其他通道,是不是IO没有对应好呀。

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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