本帖最后由 怀揣少年梦 于 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模块使用还是很方便的。
四、呼吸灯实际波形测试现象
示波器