Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
LED
PWM
瑞萨_RA6M4
【Renesas RA6M4开发板之两路PWM驱动】
发布于 2022-07-13 11:58:54 浏览:771
订阅该版
[tocm] # 1.0 PWM 简介 PWM(Pulse Width Modulation , 脉冲宽度调制) 是一种对模拟信号电平进行数字编码的方法,通过不同频率的脉冲使用方波的占空比用来对一个具体模拟信号的电平进行编码,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替所需要波形的设备。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220723/19270b480232f1a2204033a7611264b9b5b5afbb.png) 上图是一个简单的 PWM 原理示意图,假定定时器工作模式为向上计数,当计数值小于阈值时,则输出一种电平状态,比如高电平,当计数值大于阈值时则输出相反的电平状态,比如低电平。当计数值达到最大值是,计数器从0开始重新计数,又回到最初的电平状态。高电平持续时间(脉冲宽度)和周期时间的比值就是占空比,范围为0~100%。上图高电平的持续时间刚好是周期时间的一半,所以占空比为50%。 ## 1.1 原理 一个比较常用的pwm控制情景就是用来调节灯或者屏幕的亮度,根据占空比的不同,就可以完成亮度的调节。PWM调节亮度并不是持续发光的,而是在不停地点亮、熄灭屏幕。当亮、灭交替够快时,肉眼就会认为一直在亮。在亮、灭的过程中,灭的状态持续时间越长,屏幕给肉眼的观感就是亮度越低。亮的时间越长,灭的时间就相应减少,屏幕就会变亮。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220723/3fe535fd33be9a52cb1c3e10b6cb57f4ab8dd65f.png) ## 1.2 访问 PWM 设备 应用程序通过 RT-Thread 提供的 PWM 设备管理接口来访问 PWM 设备硬件,相关接口如下所示: |函数 |描述| | ------ | ------ | |[rt_device_find()](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/pwm/pwm?id=%E6%9F%A5%E6%89%BE-pwm-%E8%AE%BE%E5%A4%87) |根据 PWM 设备名称查找设备获取设备句柄| |[rt_pwm_set()](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/pwm/pwm?id=%E8%AE%BE%E7%BD%AE-pwm-%E5%91%A8%E6%9C%9F%E5%92%8C%E8%84%89%E5%86%B2%E5%AE%BD%E5%BA%A6) |设置 PWM 周期和脉冲宽度| |[rt_pwm_enable()](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/pwm/pwm?id=%E4%BD%BF%E8%83%BD-pwm-%E8%AE%BE%E5%A4%87) |使能 PWM 设备| |[rt_pwm_disable()](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/pwm/pwm?id=%E5%85%B3%E9%97%AD-pwm-%E8%AE%BE%E5%A4%87%E9%80%9A%E9%81%93) |关闭 PWM 设备| # 2. RT-theard配置 ## 2.1 硬件需求 > 实现功能: > 板载LED3(P106)和P107的LED两路PWM驱动。 1、RA6M4开发板 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220723/666c70553be11f37c54e2fd5b12b1dd1dae10084.png) 2、USB下载线,ch340串口和附带4根母母线,**rx---p613;tx---p614** 3、准备LED灯一个,正极接3.3V,负极接P303,板载LED3(P106)不变 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220723/d835aeffb5df6029c33173bb94771596f9d40883.png) ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220723/a0e5ce4d38066e0c32e2b0ff53f6f53cf76150eb.png) 硬件到此配置完成 ## 2.2 软件配置 Renesas RA6M4开发板环境配置参照:[【基于 RT-Thread Studio的CPK-RA6M4 开发板环境搭建】](https://blog.csdn.net/vor234/article/details/125634313) 1、新建项目RA6M4-pwm工程 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220723/68b022641207fd804784c67a51b3107ca75489a0.png) 2、查阅RA6M4硬件资源,相关资料,在RT-theard Setting 硬件下开启PWM,使能pwm8 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220723/0e20897dd3a74102f31d9fcfc750bceb3a1185da.png) pdf文档第21章pwm ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220723/7a72acf61b96d405035ff0654883459c8af7660b.png) 需要使能pwm8 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220723/57fdb650f38378e8d2b2db3b768f3f4f8962e1d6.png) 需要使能pwm7 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20220724/b163d5ce745c6e2d6cb1310dc0453e7c.png.webp) 3、打开RA Smart Congigurator,在Stacks中New Stack添加r_gpt ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220723/30fc2682975e1dd26afa380d51b49f9e5feec731.png) 4、在Property的Module的General中选Channel8,Pins选择P107和P106 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20220723/da3553cc1e559bc33898f9ecee3bc6c9.png.webp) ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220723/4aa176ce6d5495ccce56af3b0e866b37a03ec828.png) 5、然后Generate Project Content 同步更新刚刚配置的文件 图形化配置已经完成,接下来配置相关代码 # 3. 代码分析 1、修改`hal_entry.c`函数,屏蔽LED3普通GPIO输出 ```cpp /* * 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
#include "hal_data.h" #include
//#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文件,其他不变。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220723/5b48f292dbf5aab9087ca40f11584fa1ca750069.png) `pwmled.c` ```cpp /* * 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
#include
#define PWM_DEV_NAME "pwm8" /* PWM设备名称 */ #define PWM2_DEV_NAME "pwm7" /* PWM设备名称 */ #define PWM_DEV_CHANNEL 0 /* PWM通道 */ struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */ struct rt_device_pwm *pwm2_dev; /* PWM2设备句柄 */ //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; } /* 查找设备 */ pwm2_dev = (struct rt_device_pwm *)rt_device_find(PWM2_DEV_NAME); if (pwm2_dev == RT_NULL) { rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM2_DEV_NAME); return RT_ERROR; } /* 设置PWM周期和脉冲宽度默认值 */ rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse); rt_pwm_set(pwm2_dev, PWM_DEV_CHANNEL, period, pulse); /* 使能设备 */ rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL); rt_pwm_enable(pwm2_dev, PWM_DEV_CHANNEL); 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, period); rt_pwm_set(pwm2_dev, PWM_DEV_CHANNEL, period, pulse); } } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(pwm_led_sample, pwm sample); ``` `pwmled.h` ```cpp /* * 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、编译重构 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220723/195bf2f574ae77744bbec4bcbc4be8177ffbd8f7.png) 编译成功 2、下载程序 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220723/bb510d5e475a90cddb3e1ee288f1350bfd3ad71a.png) 下载成功 3、CMD串口调试 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220723/6184c9825aed5d03ac96cf1a092775ed36dfc517.png) 然后板载复位,输入:`pwm_led_sample` ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220723/7c628ee3b5d8b781c382f9b4b3e9518a6e7825c9.png) 效果如下 ![请添加图片描述](https://oss-club.rt-thread.org/uploads/20220723/3e6947384e17387d7af4bd9f7af4e141a39f39c0.gif) 这样我们就可以天马行空啦! ![请添加图片描述](https://oss-club.rt-thread.org/uploads/20220723/bde92a578c517a7600208aa4971d4198dcace737.gif) 参考文献; [【基于 RT-Thread Studio的CPK-RA6M4 开发板环境搭建】](https://blog.csdn.net/vor234/article/details/125634313) [【开发板评测】Renesas RA6M4开发板之PWM呼吸灯](https://club.rt-thread.org/ask/article/606a6ea62d8845fc.html "【开发板评测】Renesas RA6M4开发板之PWM呼吸灯") pwm端口是成对存在的,一共有10对
3
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
2345vor
每天都满怀期待i😀
文章
20
回答
2
被采纳
0
关注TA
发私信
相关文章
1
玩iot camera笔记之3测试试用3路pwm
2
[已解决]PWM输出异常分析
3
给RT-Thread添加PWM驱动框架
4
关于rt-thread-3.1.0 pwm
5
关于rt-thread的PWM框架在stm32f103vf应用的疑问
6
rt-thread stm32 bsp adc pwm 外设适配好了吗
7
stm32f103ze 添加pwm 设备失败
8
【正点原子】潘多拉IoT-STM32L475开发板 用menuconfig 看不到PWM....
9
关于rtthread 4.0.0版本中pwm的初始化定时器寄存器读写问题
10
RT-Thread正点原子战舰V3使用PWM设备驱动没有输出
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
MicroPython
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
15
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部