1.0 PWM 簡(jiǎn)介
PWM(Pulse Width Modulation , 脈沖寬度調(diào)制) 是一種對(duì)模擬信號(hào)電平進(jìn)行數(shù)字編碼的方法,通過(guò)不同頻率的脈沖使用方波的占空比用來(lái)對(duì)一個(gè)具體模擬信號(hào)的電平進(jìn)行編碼,使輸出端得到一系列幅值相等的脈沖,用這些脈沖來(lái)代替所需要波形的設(shè)備。
上圖是一個(gè)簡(jiǎn)單的 PWM 原理示意圖,假定定時(shí)器工作模式為向上計(jì)數(shù),當(dāng)計(jì)數(shù)值小于閾值時(shí),則輸出一種電平狀態(tài),比如高電平,當(dāng)計(jì)數(shù)值大于閾值時(shí)則輸出相反的電平狀態(tài),比如低電平。當(dāng)計(jì)數(shù)值達(dá)到最大值是,計(jì)數(shù)器從0開(kāi)始重新計(jì)數(shù),又回到最初的電平狀態(tài)。高電平持續(xù)時(shí)間(脈沖寬度)和周期時(shí)間的比值就是占空比,范圍為0~100%。上圖高電平的持續(xù)時(shí)間剛好是周期時(shí)間的一半,所以占空比為50%。
1.1 原理
一個(gè)比較常用的pwm控制情景就是用來(lái)調(diào)節(jié)燈或者屏幕的亮度,根據(jù)占空比的不同,就可以完成亮度的調(diào)節(jié)。PWM調(diào)節(jié)亮度并不是持續(xù)發(fā)光的,而是在不停地點(diǎn)亮、熄滅屏幕。當(dāng)亮、滅交替夠快時(shí),肉眼就會(huì)認(rèn)為一直在亮。在亮、滅的過(guò)程中,滅的狀態(tài)持續(xù)時(shí)間越長(zhǎng),屏幕給肉眼的觀感就是亮度越低。亮的時(shí)間越長(zhǎng),滅的時(shí)間就相應(yīng)減少,屏幕就會(huì)變亮。
1.2 訪(fǎng)問(wèn) PWM 設(shè)備
應(yīng)用程序通過(guò) RT-Thread 提供的 PWM 設(shè)備管理接口來(lái)訪(fǎng)問(wèn) PWM 設(shè)備硬件,相關(guān)接口如下所示:
函數(shù) | 描述 |
---|---|
rt_device_find() | 根據(jù) PWM 設(shè)備名稱(chēng)查找設(shè)備獲取設(shè)備句柄 |
rt_pwm_set() | 設(shè)置 PWM 周期和脈沖寬度 |
rt_pwm_enable() | 使能 PWM 設(shè)備 |
rt_pwm_disable() | 關(guān)閉 PWM 設(shè)備 |
2. RT-theard配置
2.1 硬件需求
實(shí)現(xiàn)功能:
板載LED3(P106)和P107的LED兩路PWM驅(qū)動(dòng)。
1、RA6M4開(kāi)發(fā)板
2、USB下載線(xiàn),ch340串口和附帶4根母母線(xiàn),rx---p613;tx---p614
3、準(zhǔn)備LED燈一個(gè),正極接3.3V,負(fù)極接P107,板載LED3(P106)不變
硬件到此配置完成
2.2 軟件配置
Renesas RA6M4開(kāi)發(fā)板環(huán)境配置參照:【基于 RT-Thread Studio的CPK-RA6M4 開(kāi)發(fā)板環(huán)境搭建】
1、新建項(xiàng)目RA6M4-pwm工程
2、查閱RA6M4硬件資源,相關(guān)資料,在RT-theard Setting 硬件下開(kāi)啟PWM,使能pwm8
pdf文檔第21章pwm
需要使能pwm8
3、打開(kāi)RA Smart Congigurator,在Stacks中New Stack添加r_gpt
4、在Property的Module的General中選Channel8,Pins選擇P107和P106
5、然后Generate Project Content 同步更新剛剛配置的文件
圖形化配置已經(jīng)完成,接下來(lái)配置相關(guān)代碼
3. 代碼分析
1、修改hal_entry.c
函數(shù),屏蔽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
#include "hal_data.h"
#include
//#define LED3_PIN BSP_IO_PORT_01_PIN_06
#define USER_INPUT "P105"
void hal_entry(void)
{
rt_kprintf("
Hello RT-Thread!
");
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("
IRQ00 triggered
");
}
void icu_sample(void)
{
/* init */
rt_uint32_t pin = rt_pin_get(USER_INPUT);
rt_kprintf("
pin number : 0x%04X
", 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("
attach irq failed.
");
}
err = rt_pin_irq_enable(pin, PIN_IRQ_ENABLE);
if(RT_EOK != err)
{
rt_kprintf("
enable irq failed.
");
}
}
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
*/
/*
* 程序清單:這是一個(gè) PWM 設(shè)備使用例程
* 例程導(dǎo)出了 pwm_led_sample 命令到控制終端
* 命令調(diào)用格式:pwm_led_sample
* 程序功能:通過(guò) PWM 設(shè)備控制 LED 燈的亮度,可以看到LED不停的由暗變到亮,然后又從亮變到暗。
*/
#include
#include
#define PWM_DEV_NAME "pwm8" /* PWM設(shè)備名稱(chēng) */
#define PWM_DEV_CHANNEL 0 /* PWM通道 */
struct rt_device_pwm *pwm_dev; /* PWM設(shè)備句柄 */
//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 */
/* 查找設(shè)備 */
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!
", PWM_DEV_NAME);
return RT_ERROR;
}
/* 設(shè)置PWM周期和脈沖寬度默認(rèn)值 */
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
rt_pwm_set(pwm_dev, 1, period, pulse);
/* 使能設(shè)備 */
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值開(kāi)始每次增加5000ns */
}
else
{
pulse -= 5000; /* 從最大值開(kāi)始每次減少5000ns */
}
if (pulse >= period)
{
dir = 0;
}
if (0 == pulse)
{
dir = 1;
}
/* 設(shè)置PWM周期和脈沖寬度 */
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
rt_pwm_set(pwm_dev, 1, period, abs(period-pulse));
}
}
/* 導(dǎo)出到 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_ */
保存完是灰色,沒(méi)有保存是藍(lán)色。
pwm_led_sample
導(dǎo) 出 到 msh 命 令 列 表 中,實(shí)現(xiàn)pwm8的兩路輸出
4. 下載驗(yàn)證
1、編譯重構(gòu)
編譯成功
2、下載程序
下載成功
3、CMD串口調(diào)試
然后板載復(fù)位,輸入:pwm_led_sample
效果如下
這樣我們就可以天馬行空啦!
參考文獻(xiàn);
【基于 RT-Thread Studio的CPK-RA6M4 開(kāi)發(fā)板環(huán)境搭建】
【開(kāi)發(fā)板評(píng)測(cè)】Renesas RA6M4開(kāi)發(fā)板之PWM呼吸燈
pwm端口是成對(duì)存在的,一共有10對(duì)
-
PWM
+關(guān)注
關(guān)注
114文章
5141瀏覽量
213390 -
Renesas
+關(guān)注
關(guān)注
0文章
1757瀏覽量
22622 -
開(kāi)發(fā)板
+關(guān)注
關(guān)注
25文章
4943瀏覽量
97188 -
PWM驅(qū)動(dòng)
+關(guān)注
關(guān)注
0文章
28瀏覽量
1192 -
RA6M4
+關(guān)注
關(guān)注
0文章
51瀏覽量
429
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論