1.0 PWM 簡介
PWM(Pulse Width Modulation , 脈沖寬度調(diào)制) 是一種對模擬信號電平進行數(shù)字編碼的方法,通過不同頻率的脈沖使用方波的占空比用來對一個具體模擬信號的電平進行編碼,使輸出端得到一系列幅值相等的脈沖,用這些脈沖來代替所需要波形的設備。
上圖是一個簡單的 PWM 原理示意圖,假定定時器工作模式為向上計數(shù),當計數(shù)值小于閾值時,則輸出一種電平狀態(tài),比如高電平,當計數(shù)值大于閾值時則輸出相反的電平狀態(tài),比如低電平。當計數(shù)值達到最大值是,計數(shù)器從0開始重新計數(shù),又回到最初的電平狀態(tài)。高電平持續(xù)時間(脈沖寬度)和周期時間的比值就是占空比,范圍為0~100%。上圖高電平的持續(xù)時間剛好是周期時間的一半,所以占空比為50%。
1.1 原理
一個比較常用的pwm控制情景就是用來調(diào)節(jié)燈或者屏幕的亮度,根據(jù)占空比的不同,就可以完成亮度的調(diào)節(jié)。PWM調(diào)節(jié)亮度并不是持續(xù)發(fā)光的,而是在不停地點亮、熄滅屏幕。當亮、滅交替夠快時,肉眼就會認為一直在亮。在亮、滅的過程中,滅的狀態(tài)持續(xù)時間越長,屏幕給肉眼的觀感就是亮度越低。亮的時間越長,滅的時間就相應減少,屏幕就會變亮。
1.2 訪問 PWM 設備
應用程序通過 RT-Thread 提供的 PWM 設備管理接口來訪問 PWM 設備硬件,相關(guān)接口如下所示:
函數(shù) | 描述 |
---|---|
rt_device_find() | 根據(jù) PWM 設備名稱查找設備獲取設備句柄 |
rt_pwm_set() | 設置 PWM 周期和脈沖寬度 |
rt_pwm_enable() | 使能 PWM 設備 |
rt_pwm_disable() | 關(guān)閉 PWM 設備 |
2. RT-theard配置
2.1 硬件需求
實現(xiàn)功能:
板載LED3(P106)和P107的LED兩路PWM驅(qū)動。
1、RA6M4開發(fā)板
2、USB下載線,ch340串口和附帶4根母母線,rx---p613;tx---p614
3、準備LED燈一個,正極接3.3V,負極接P107,板載LED3(P106)不變
硬件到此配置完成
2.2 軟件配置
Renesas RA6M4開發(fā)板環(huán)境配置參照:【基于 RT-Thread Studio的CPK-RA6M4 開發(fā)板環(huán)境搭建】
1、新建項目RA6M4-pwm工程
2、查閱RA6M4硬件資源,相關(guān)資料,在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 同步更新剛剛配置的文件
圖形化配置已經(jīng)完成,接下來配置相關(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
*/
/*
* 程序清單:這是一個 PWM 設備使用例程
* 例程導出了 pwm_led_sample 命令到控制終端
* 命令調(diào)用格式:pwm_led_sample
* 程序功能:通過 PWM 設備控制 LED 燈的亮度,可以看到LED不停的由暗變到亮,然后又從亮變到暗。
*/
#include
#include
#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!
", 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 命 令 列 表 中,實現(xiàn)pwm8的兩路輸出
4. 下載驗證
1、編譯重構(gòu)
編譯成功
2、下載程序
下載成功
3、CMD串口調(diào)試
然后板載復位,輸入:pwm_led_sample
效果如下
這樣我們就可以天馬行空啦!
參考文獻;
【基于 RT-Thread Studio的CPK-RA6M4 開發(fā)板環(huán)境搭建】
【開發(fā)板評測】Renesas RA6M4開發(fā)板之PWM呼吸燈
pwm端口是成對存在的,一共有10對
-
PWM
+關(guān)注
關(guān)注
114文章
5186瀏覽量
213936 -
Renesas
+關(guān)注
關(guān)注
0文章
1757瀏覽量
22756 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5050瀏覽量
97468 -
PWM驅(qū)動
+關(guān)注
關(guān)注
0文章
28瀏覽量
1204 -
RA6M4
+關(guān)注
關(guān)注
0文章
51瀏覽量
450
發(fā)布評論請先 登錄
相關(guān)推薦
評論