【Renesas RA6M4开发板之两路PWM驱动】

  • 1.0 PWM 简介
    • 1.1 原理
    • 1.2 访问 PWM 设备
  • 2. RT-theard配置
    • 2.1 硬件需求
    • 2.2 软件配置
  • 3. 代码分析
  • 4. 下载验证

1.0 PWM 简介

PWM(Pulse Width Modulation , 脉冲宽度调制) 是一种对模拟信号电平进行数字编码的方法,通过不同频率的脉冲使用方波的占空比用来对一个具体模拟信号的电平进行编码,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替所需要波形的设备。

上图是一个简单的 PWM 原理示意图,假定定时器工作模式为向上计数,当计数值小于阈值时,则输出一种电平状态,比如高电平,当计数值大于阈值时则输出相反的电平状态,比如低电平。当计数值达到最大值是,计数器从0开始重新计数,又回到最初的电平状态。高电平持续时间(脉冲宽度)和周期时间的比值就是占空比,范围为0~100%。上图高电平的持续时间刚好是周期时间的一半,所以占空比为50%。

1.1 原理

一个比较常用的pwm控制情景就是用来调节灯或者屏幕的亮度,根据占空比的不同,就可以完成亮度的调节。PWM调节亮度并不是持续发光的,而是在不停地点亮、熄灭屏幕。当亮、灭交替够快时,肉眼就会认为一直在亮。在亮、灭的过程中,灭的状态持续时间越长,屏幕给肉眼的观感就是亮度越低。亮的时间越长,灭的时间就相应减少,屏幕就会变亮。

1.2 访问 PWM 设备

应用程序通过 RT-Thread 提供的 PWM 设备管理接口来访问 PWM 设备硬件,相关接口如下所示:

函数 描述
rt_device_find() 根据 PWM 设备名称查找设备获取设备句柄
rt_pwm_set() 设置 PWM 周期和脉冲宽度
rt_pwm_enable() 使能 PWM 设备
rt_pwm_disable() 关闭 PWM 设备

2. RT-theard配置

2.1 硬件需求

实现功能:
板载LED3(P106)和P107的LED两路PWM驱动。

1、RA6M4开发板

2、USB下载线,ch340串口和附带4根母母线,rx—p613;tx—p614
3、准备LED灯一个,正极接3.3V,负极接P107,板载LED3(P106)不变


硬件到此配置完成

2.2 软件配置

Renesas RA6M4开发板环境配置参照:【基于 RT-Thread Studio的CPK-RA6M4 开发板环境搭建】
1、新建项目RA6M4-pwm工程

2、查阅RA6M4硬件资源,相关资料,在RT-theard Setting 硬件下开启PWM,使能pwm8

pdf文档第21章pwm

需要使能pwm8

3、打开RA Smart Congigurator,在Stacks中New Stack添加r_gpt

4、在Property的Module的General中选Channel8,Pins选择P107和P106

5、然后Generate Project Content 同步更新刚刚配置的文件

图形化配置已经完成,接下来配置相关代码

3. 代码分析

1、修改hal_entry.c函数,屏蔽LED3普通GPIO输出

/** 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>//#define LED3_PIN    BSP_IO_PORT_01_PIN_06
#define USER_INPUT  "P105"void hal_entry(void)
{rt_kprintf("\nHello RT-Thread!\n");while (1){//        rt_pin_write(LED3_PIN, PIN_HIGH);
//        rt_thread_mdelay(500);
//        rt_pin_write(LED3_PIN, PIN_LOW);rt_thread_mdelay(500);}
}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);

在src文件下新建pwmled.c和pwmled.h文件,其他不变。

pwmled.c

/** Copyright (c) 2006-2021, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2022-07-11     Asus       the first version*/
/** 程序清单:这是一个 PWM 设备使用例程* 例程导出了 pwm_led_sample 命令到控制终端* 命令调用格式:pwm_led_sample* 程序功能:通过 PWM 设备控制 LED 灯的亮度,可以看到LED不停的由暗变到亮,然后又从亮变到暗。
*/#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设备句柄 */
//static int pwm_led_sample(int argc, char *argv[])
int pwm_led_sample(void)
{rt_uint32_t period, pulse, dir;period = 500000;    /* 周期为0.5ms,单位为纳秒us */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_set(pwm_dev, 1, period, pulse);/* 使能设备 */rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);rt_pwm_enable(pwm_dev, 1);while (1){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);rt_pwm_set(pwm_dev, 1, period, abs(period-pulse));}
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(pwm_led_sample, pwm sample);

pwmled.h

/** Copyright (c) 2006-2021, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2022-07-11     Asus       the first version*/
#ifndef PWMLED_H_
#define PWMLED_H_int pwm_led_sample(void);#endif /* PWMLED_H_ */

保存完是灰色,没有保存是蓝色。
pwm_led_sample导 出 到 msh 命 令 列 表 中,实现pwm8的两路输出

4. 下载验证

1、编译重构

编译成功

2、下载程序

下载成功

3、CMD串口调试


然后板载复位,输入:pwm_led_sample

效果如下

这样我们就可以天马行空啦!

参考文献;
【基于 RT-Thread Studio的CPK-RA6M4 开发板环境搭建】
【开发板评测】Renesas RA6M4开发板之PWM呼吸灯
pwm端口是成对存在的,一共有10对

【Renesas RA6M4开发板之两路PWM驱动】相关推荐

  1. 【Renesas RA6M4开发板之UART与Serial studio串口交互】

    [Renesas RA6M4开发板之UART与Serial studio串口交互] 1.0 UART简介 1.1 原理 1.2 访问 PWM 设备 2. RT-theard配置 2.1 硬件需求 2. ...

  2. 【Renesas RA6M4开发板之I2C读取mpu6050】

    [Renesas RA6M4开发板之I2C读取mpu6050] 1.0 mpu6050 1.1 mpu6050介绍 1.2 mpu6050特点 1.3 mpu6050应用 2. RT-theard配置 ...

  3. 【Renesas RA6M4开发板之按键和LED的GPIO】

    [Renesas RA6M4开发板之按键和LED的GPIO] 1.0 I/O 设备模型 1.1 I/O 设备模型框架 1.2 I/O 设备模型 2. RT-theard配置 2.1 硬件需求 2.2 ...

  4. 【Renesas RA6M4开发板之I2C(模拟)驱动ssd1306 OLED屏幕】

    [Renesas RA6M4开发板之I2C(模拟)驱动ssd1306 OLED屏幕] 1.0 OLED 1.1产品特性: 1.2产品参数: 2. RT-theard配置 2.1 硬件需求 2.2 软件 ...

  5. 【Renesas RA6M4开发板之I2C读取BMP180气压温度】

    [Renesas RA6M4开发板之I2C读取BMP180气压温度] 1.0 BMP180 1.1 BMP180介绍 1.2 BMP180特点 1.3 产品应用 2. RT-theard配置 2.1 ...

  6. 基于FPGA开发板使用Verilog设计PWM呼吸灯实验

    基于FPGA开发板使用Verilog设计PWM呼吸灯实验 1,实验原理 2,实验模块设计 2.1 RTL设计,呼吸灯模块设计 2.2,测试数据,下载到FPGA开发板板级的数据 2.3,两个模块综合的n ...

  7. 逆变器方案(高频 工频)正弦波逆变驱动开发板,完全兼容EG8010驱动板

    逆变器方案(高频 工频)正弦波逆变驱动开发板,完全兼容EG8010驱动板,高频机工频机通用,资料包含源代码,带中文注释,原理图,PCB图,高质量开发板代码,可以直接上机运行 ID:4215006632 ...

  8. Auvidea J120 TX2开发板 Jetpack刷机与驱动安装

    Auvidea J120 TX2开发板 Jetpack刷机与驱动安装 一.刷机准备 下载Nvidia SDK Manager 网址:https://developer.nvidia.com/nvidi ...

  9. 关于arduino开发板链接usb时,驱动安装不成功的解决办法

    关于arduino开发板链接usb时,驱动安装不成功的解决办法 环境 当前的环境是Windows 64位 x86平台 系统镜像创建方法是gosht还原 当前问题 arduino开发板使用原装数据线链接 ...

最新文章

  1. [Swift]LeetCode218. 天际线问题 | The Skyline Problem
  2. mysql的锁表问题
  3. 学习 git clone 几种不同的协议
  4. 容器viewController添加或者删除子viewController
  5. 资源放送丨《如何从零快速搭建一整套监控体系(日志采集+主机+数据库)》PPT视频...
  6. C语言 文件操作| 文件关闭 |文件写入 |文件读取
  7. MDM主数据管理平台开发精要
  8. 外包一个小程序多少钱(外包小程序开发的价格费用)
  9. 写个单机版斗地主程序,复习c++面向对象
  10. data could not be sent to remote host
  11. android界面设计开发总结
  12. 微信人工客服24小时在线电话
  13. 如何编写出优秀的代码
  14. canvas 制作简易涂鸦画板(教程)
  15. esxi显卡给2个虚拟机_使用虚拟机ESXI,显卡直通VM,使一台实体机虚拟成HTPC、WEB服务器、NAS服务器等经验 - 小众知识...
  16. 想发国际期刊,这些工具和技巧你都知道吗?
  17. 明天是程序员节,程序员的过节姿势大全抢先看
  18. C++ Primer:vector删除元素时迭代器失效问题
  19. UNLINK key [key ...]
  20. php绘制图像黑色的数值,canvas.toDataURL()通过尝试调整base64的大小而导致黑色图像字符串...

热门文章

  1. EXCEL查找函数之VLOOKUP,LOOKUP,HLOOKUP
  2. 网络电视机顶盒、IPTV后台内容管理系统?
  3. java按位异或运算_位运算(按位与、按位或、异或)
  4. electron端实现录音播放功能
  5. 搭建完菜单后运行不显示菜单的原因及其解决方法(拼图小游戏)
  6. Hexo+gitee,NexT主题搭建个人博客首页图标为方框问题
  7. restTemplate.postForObject 发送POST请求
  8. 工作小记:redirectTo,relaunch,switchTab
  9. Android8.1去掉低电量时的弹窗提醒功能
  10. 一封来自嘉兴市公安局网警支队的感谢信