功能簡(jiǎn)介
PWM即脈沖寬度調(diào)制(Pulse Width Modulation)的縮寫(xiě),是一種對(duì)模擬信號(hào)電平進(jìn)行數(shù)字編碼并將其轉(zhuǎn)換為脈沖的技術(shù)。
PWM接口定義了操作PWM設(shè)備的通用方法集合,包括:
-
PWM設(shè)備句柄獲取和釋放
-
PWM周期、占空比、極性的設(shè)置
-
PWM使能和關(guān)閉
-
PWM配置信息的獲取和設(shè)置
基本概念
脈沖是“電脈沖”的簡(jiǎn)稱(chēng),指電路中電流或電壓短暫起伏的現(xiàn)象,其特點(diǎn)是突變和不連續(xù)性。脈沖的種類(lèi)很多,常見(jiàn)的脈沖波形有:三角脈沖、尖脈沖、矩形脈沖、方形脈沖、梯形脈沖及階梯脈沖等。脈沖的主要參數(shù)包括重復(fù)周期T(T=1/F,F(xiàn)為重復(fù)頻率)、脈沖幅度U、脈沖前沿上升時(shí)間ts、后沿下降時(shí)間t、脈沖寬度tk等。
運(yùn)作機(jī)制
在HDF框架中,PWM接口適配模式采用獨(dú)立服務(wù)模式(如圖1所示)。在這種模式下,每一個(gè)設(shè)備對(duì)象會(huì)獨(dú)立發(fā)布一個(gè)設(shè)備服務(wù)來(lái)處理外部訪問(wèn),設(shè)備管理器收到API的訪問(wèn)請(qǐng)求之后,通過(guò)提取該請(qǐng)求的參數(shù),達(dá)到調(diào)用實(shí)際設(shè)備對(duì)象的相應(yīng)內(nèi)部方法的目的。獨(dú)立服務(wù)模式可以直接借助HDF設(shè)備管理器的服務(wù)管理能力,但需要為每個(gè)設(shè)備單獨(dú)配置設(shè)備節(jié)點(diǎn),增加內(nèi)存占用。
獨(dú)立服務(wù)模式下,核心層不會(huì)統(tǒng)一發(fā)布一個(gè)服務(wù)供上層使用,因此這種模式下驅(qū)動(dòng)要為每個(gè)控制器發(fā)布一個(gè)服務(wù),具體表現(xiàn)為:
-
驅(qū)動(dòng)適配者需要實(shí)現(xiàn)HdfDriverEntry的Bind鉤子函數(shù)以綁定服務(wù)。
-
device_info.hcs文件中deviceNode的policy字段為1或2,不能為0。
PWM模塊各分層作用:
-
接口層提供打開(kāi)PWM設(shè)備、設(shè)置PWM設(shè)備周期、設(shè)置PWM設(shè)備占空時(shí)間、設(shè)置PWM設(shè)備極性、設(shè)置PWM設(shè)備參數(shù)、獲取PWM設(shè)備參數(shù)、使能PWM設(shè)備、禁止PWM設(shè)備、關(guān)閉PWM設(shè)備的接口。
-
核心層主要提供PWM控制器的添加、移除以及管理的能力,通過(guò)鉤子函數(shù)與適配層交互。
-
適配層主要是將鉤子函數(shù)的功能實(shí)例化,實(shí)現(xiàn)具體的功能。
圖 1?PWM獨(dú)立服務(wù)模式結(jié)構(gòu)圖
使用指導(dǎo)
場(chǎng)景介紹
通常情況下,在使用馬達(dá)控制、背光亮度調(diào)節(jié)時(shí)會(huì)用到PWM模塊。
接口說(shuō)明
PWM模塊設(shè)備屬性如表1所示,PWM模塊提供的主要接口如表2所示,具體API詳見(jiàn)//drivers/hdf_core/framework/include/platform/pwm_if.h。
表 1?PwmConfig結(jié)構(gòu)體介紹
名稱(chēng) | 描述 |
---|---|
duty | uint32_t類(lèi)型,占空時(shí)間,以納秒為單位。 |
period | uint32_t類(lèi)型,PWM周期,以納秒為單位。 |
number | uint32_t類(lèi)型,要生成的方波數(shù): -?正值:表示將生成指定數(shù)量的方波 -?0:表示方波將不斷產(chǎn)生 |
polarity | uint8_t類(lèi)型,極性:正極性/反極性。 |
status | uint8_t類(lèi)型,狀態(tài):?jiǎn)⒂脿顟B(tài)/禁用狀態(tài)。 |
表 2?PWM驅(qū)動(dòng)API接口功能介紹
接口名 | 接口描述 |
---|---|
DevHandle PwmOpen(uint32_t num) | 打開(kāi)PWM設(shè)備 |
void PwmClose(DevHandle handle) | 關(guān)閉PWM設(shè)備 |
int32_t PwmSetPeriod(DevHandle handle, uint32_t period) | 設(shè)置PWM設(shè)備周期 |
int32_t PwmSetDuty(DevHandle handle, uint32_t duty) | 設(shè)置PWM設(shè)備占空時(shí)間 |
int32_t PwmSetPolarity(DevHandle handle, uint8_t polarity) | 設(shè)置PWM設(shè)備極性 |
int32_t PwmEnable(DevHandle handle) | 使能PWM設(shè)備 |
int32_t PwmDisable(DevHandle handle) | 禁用PWM設(shè)備 |
int32_t PwmSetConfig(DevHandle handle, struct PwmConfig *config) | 設(shè)置PWM設(shè)備參數(shù) |
int32_t PwmGetConfig(DevHandle handle, struct PwmConfig *config) | 獲取PWM設(shè)備參數(shù) |
說(shuō)明:
本文涉及PWM的所有接口,支持內(nèi)核態(tài)及用戶(hù)態(tài)使用。
開(kāi)發(fā)步驟
使用PWM的一般流程如下圖所示。
圖 2?PWM使用流程圖
獲取PWM設(shè)備句柄
在操作PWM設(shè)備時(shí),首先要調(diào)用PwmOpen獲取PWM設(shè)備句柄,該函數(shù)會(huì)返回指定設(shè)備號(hào)的PWM設(shè)備句柄。
DevHandle PwmOpen(uint32_t num);
表 3?PwmOpen參數(shù)和返回值描述
參數(shù) | 參數(shù)描述 |
---|---|
num | uint32_t類(lèi)型,PWM設(shè)備號(hào) |
返回值 | 返回值描述 |
handle | 打開(kāi)PWM設(shè)備成功,返回PWM設(shè)備句柄 |
NULL | 打開(kāi)PWM設(shè)備失敗 |
假設(shè)系統(tǒng)中的PWM設(shè)備號(hào)為0,獲取該P(yáng)WM設(shè)備句柄的示例如下:
uint32_t num = 0; // PWM設(shè)備號(hào)
DevHandle handle = NULL;
handle = PwmOpen(num); // 打開(kāi)PWM 0設(shè)備并獲取PWM設(shè)備句柄
if (handle == NULL) {
HDF_LOGE("PwmOpen: open pwm_%u failed.\n", num);
return HDF_FAILURE;
}
銷(xiāo)毀PWM設(shè)備句柄
關(guān)閉PWM設(shè)備,系統(tǒng)釋放對(duì)應(yīng)的資源。
void PwmClose(DevHandle handle);
表 4?PwmClose參數(shù)描述
參數(shù) | 參數(shù)描述 |
---|---|
handle | DevHandle類(lèi)型,PWM設(shè)備句柄 |
PwmClose(handle); // 關(guān)閉PWM設(shè)備銷(xiāo)毀PWM設(shè)備句柄
使能PWM設(shè)備
int32_t PwmEnable(DevHandle handle);
表 5?PwmEnable參數(shù)和返回值描述
參數(shù) | 參數(shù)描述 |
---|---|
handle | DevHandle類(lèi)型,PWM設(shè)備句柄 |
返回值 | 返回值描述 |
HDF_SUCCESS | 使能PWM設(shè)備成功 |
負(fù)數(shù) | 使能PWM設(shè)備失敗 |
int32_t ret;
ret = PwmEnable(handle); // 啟用PWM設(shè)備
if (ret != HDF_SUCCESS) {
HDF_LOGE("PwmEnable: enable pwm failed, ret:%d\n", ret);
return ret;
}
禁用PWM設(shè)備
int32_t PwmDisable(DevHandle handle);
表 6?PwmDisable參數(shù)和返回值描述
參數(shù) | 參數(shù)描述 |
---|---|
handle | DevHandle類(lèi)型,PWM設(shè)備句柄 |
返回值 | 返回值描述 |
HDF_SUCCESS | 禁用PWM設(shè)備成功 |
負(fù)數(shù) | 禁用PWM設(shè)備失敗 |
int32_t ret;
ret = PwmDisable(handle); // 禁用PWM設(shè)備
if (ret != HDF_SUCCESS) {
HDF_LOGE("PwmDisable: disable pwm failed, ret:%d\n", ret);
return ret;
}
設(shè)置PWM設(shè)備周期
int32_t PwmSetPeriod(DevHandle handle, uint32_t period);
表 7?PwmSetPeriod參數(shù)和返回值描述
參數(shù) | 參數(shù)描述 |
---|---|
handle | DevHandle類(lèi)型,PWM設(shè)備句柄 |
period | uint32_t類(lèi)型,要設(shè)置的周期,單位為納秒 |
返回值 | 返回值描述 |
HDF_SUCCESS | 設(shè)置PWM設(shè)備周期成功 |
負(fù)數(shù) | 設(shè)置PWM設(shè)備周期失敗 |
int32_t ret;
ret = PwmSetPeriod(handle, 50000000); // 設(shè)置周期為50000000納秒
if (ret != HDF_SUCCESS) {
HDF_LOGE("PwmSetPeriod: pwm set period failed, ret:%d\n", ret);
return ret;
}
設(shè)置PWM設(shè)備占空時(shí)間
int32_t PwmSetDuty(DevHandle handle, uint32_t duty);
表 8?PwmSetDuty參數(shù)和返回值描述
參數(shù) | 參數(shù)描述 |
---|---|
handle | DevHandle類(lèi)型,PWM設(shè)備句柄 |
duty | uint32_t類(lèi)型,要設(shè)置的占空時(shí)間,單位為納秒 |
返回值 | 返回值描述 |
HDF_SUCCESS | 設(shè)置PWM設(shè)備占空時(shí)間成功 |
負(fù)數(shù) | 設(shè)置PWM設(shè)備占空時(shí)間失敗 |
int32_t ret;
ret = PwmSetDuty(handle, 25000000); // 設(shè)置占空時(shí)間為25000000納秒
if (ret != HDF_SUCCESS) {
HDF_LOGE("PwmSetDuty: pwm set duty failed, ret:%d\n", ret);
return ret;
}
設(shè)置PWM設(shè)備極性
int32_t PwmSetPolarity(DevHandle handle, uint8_t polarity);
表 9?PwmSetPolarity參數(shù)和返回值描述
參數(shù) | 參數(shù)描述 |
---|---|
handle | DevHandle類(lèi)型,PWM設(shè)備句柄 |
polarity | uint8_t類(lèi)型,要設(shè)置的極性,正/反 |
返回值 | 返回值描述 |
HDF_SUCCESS | 設(shè)置PWM設(shè)備極性成功 |
負(fù)數(shù) | 設(shè)置PWM設(shè)備極性失敗 |
int32_t ret;
ret = PwmSetPolarity(handle, PWM_INVERTED_POLARITY); // 設(shè)置極性為反
if (ret != HDF_SUCCESS) {
HDF_LOGE("PwmSetPolarity: pwm set polarity failed, ret:%d\n", ret);
return ret;
}
設(shè)置PWM設(shè)備參數(shù)
int32_t PwmSetConfig(DevHandle handle, struct PwmConfig *config);
表 10?PwmSetConfig參數(shù)和返回值描述
參數(shù) | 參數(shù)描述 |
---|---|
handle | DevHandle類(lèi)型,PWM設(shè)備句柄 |
config | 結(jié)構(gòu)體指針類(lèi)型,配置參數(shù) |
返回值 | 返回值描述 |
HDF_SUCCESS | 設(shè)置PWM設(shè)備參數(shù)成功 |
負(fù)數(shù) | 設(shè)置PWM設(shè)備參數(shù)失敗 |
int32_t ret;
struct PwmConfig pcfg;
pcfg.duty = 25000000; // 占空時(shí)間為25000000納秒
pcfg.period = 50000000; // 周期為50000000納秒
pcfg.number = 0; // 不斷產(chǎn)生方波
pcfg.polarity = PWM_INVERTED_POLARITY; // 極性為反
pcfg.status = PWM_ENABLE_STATUS; // 運(yùn)行狀態(tài)為啟用
ret = PwmSetConfig(handle, &pcfg); // 設(shè)置PWM設(shè)備參數(shù)
if (ret != HDF_SUCCESS) {
HDF_LOGE("PwmSetConfig: pwm set config failed, ret:%d\n", ret);
return ret;
}
獲取PWM設(shè)備參數(shù)
int32_t PwmGetConfig(DevHandle handle, struct PwmConfig *config);
表 11?PwmGetConfig參數(shù)和返回值描述
參數(shù) | 參數(shù)描述 |
---|---|
handle | DevHandle類(lèi)型,PWM設(shè)備句柄 |
config | 結(jié)構(gòu)體指針類(lèi)型,配置參數(shù) |
返回值 | 返回值描述 |
HDF_SUCCESS | 獲取PWM設(shè)備參數(shù)成功 |
負(fù)數(shù) | 獲取PWM設(shè)備參數(shù)失敗 |
int32_t ret;
struct PwmConfig pcfg;
ret = PwmGetConfig(handle, &pcfg); // 獲取PWM設(shè)備參數(shù)
if (ret != HDF_SUCCESS) {
HDF_LOGE("PwmGetConfig: pwm get config failed, ret:%d\n", ret);
return ret;
}
使用實(shí)例
下面將基于Hi3516DV300開(kāi)發(fā)板展示使用PWM完整操作,步驟主要如下:
-
傳入PWM設(shè)備號(hào),打開(kāi)PWM設(shè)備并獲得PWM設(shè)備句柄。
-
通過(guò)PWM設(shè)備句柄及待設(shè)置的周期,設(shè)置PWM設(shè)備周期。
-
通過(guò)PWM設(shè)備句柄及待設(shè)置的占空時(shí)間,設(shè)置PWM設(shè)備占空時(shí)間。
-
通過(guò)PWM設(shè)備句柄及待設(shè)置的極性,設(shè)置PWM設(shè)備極性。
-
通過(guò)PWM設(shè)備句柄及待獲取的設(shè)備參數(shù),獲取PWM設(shè)備參數(shù)。
-
通過(guò)PWM設(shè)備句柄,使能PWM設(shè)備。
-
通過(guò)PWM設(shè)備句柄及待設(shè)置的設(shè)備參數(shù),設(shè)置PWM設(shè)備參數(shù)。
-
通過(guò)PWM設(shè)備句柄,禁用PWM設(shè)備。
-
通過(guò)PWM設(shè)備句柄,關(guān)閉PWM設(shè)備。
#include "pwm_if.h" // pwm標(biāo)準(zhǔn)接口頭文件
#include "hdf_log.h" // 標(biāo)準(zhǔn)日志打印頭文件
static int32_t PwmTestSample(void)
{
int32_t ret;
uint32_t num;
uint32_t period;
uint32_t duty;
DevHandle handle = NULL;
struct PwmConfig pcfg;
pcfg.duty = 20000000; // 占空時(shí)間為20000000納秒
pcfg.period = 40000000; // 周期為40000000納秒
pcfg.number = 100; // 生成100個(gè)方波
pcfg.polarity = PWM_NORMAL_POLARITY; // 極性為正
pcfg.status = PWM_ENABLE_STATUS; // 運(yùn)行狀態(tài)為啟用
num = 1; // PWM設(shè)備編號(hào),要填寫(xiě)實(shí)際平臺(tái)上的編號(hào)
handle = PwmOpen(num); // 獲取PWM設(shè)備句柄
if (handle == NULL) {
HDF_LOGE("PwmTestSample: open pwm_%u fail!\n", num);
return HDF_FAILURE;
}
period = 50000000; // 設(shè)置周期為50000000納秒
ret = PwmSetPeriod(handle, period);
if (ret != HDF_SUCCESS) {
HDF_LOGE("PwmTestSample: pwm set period fail, ret:%d\n", ret);
goto ERR;
}
duty = 25000000; // 設(shè)置占空時(shí)間為25000000納秒
ret = PwmSetDuty(handle, duty);
if (ret != HDF_SUCCESS) {
HDF_LOGE("PwmTestSample: pwm set duty fail, ret:%d\n", ret);
goto ERR;
}
ret = PwmSetPolarity(handle, PWM_INVERTED_POLARITY); // 設(shè)置極性為反
if (ret != HDF_SUCCESS) {
HDF_LOGE("PwmTestSample: pwm set polarity fail, ret:%d\n", ret);
goto ERR;
}
ret = PwmGetConfig(handle, &pcfg); // 獲取PWM設(shè)備參數(shù)
if (ret != HDF_SUCCESS) {
HDF_LOGE("PwmTestSample: get pwm config fail, ret:%d\n", ret);
goto ERR;
}
ret = PwmEnable(handle); // 啟用PWM設(shè)備
if (ret != HDF_SUCCESS) {
HDF_LOGE("PwmEnable: enable pwm fail, ret:%d\n", ret);
goto ERR;
}
ret = PwmSetConfig(handle, &pcfg); // 設(shè)置PWM設(shè)備參數(shù)
if (ret != HDF_SUCCESS) {
HDF_LOGE("PwmTestSample: set pwm config fail, ret:%d\n", ret);
goto ERR;
}
ret = PwmDisable(handle); // 禁用PWM設(shè)備
if (ret != HDF_SUCCESS) {
HDF_LOGE("PwmTestSample: disable pwm fail, ret:%d\n", ret);
goto ERR;
}
HDF_LOGD("PwmTestSample: all tests end.");
ERR:
PwmClose(handle); // 銷(xiāo)毀PWM設(shè)備句柄
return ret;
}
最后
有很多小伙伴不知道學(xué)習(xí)哪些鴻蒙開(kāi)發(fā)技術(shù)?不知道需要重點(diǎn)掌握哪些鴻蒙應(yīng)用開(kāi)發(fā)知識(shí)點(diǎn)?而且學(xué)習(xí)時(shí)頻繁踩坑,最終浪費(fèi)大量時(shí)間。所以有一份實(shí)用的鴻蒙(HarmonyOS NEXT)資料用來(lái)跟著學(xué)習(xí)是非常有必要的。?
這份鴻蒙(HarmonyOS NEXT)資料包含了鴻蒙開(kāi)發(fā)必掌握的核心知識(shí)要點(diǎn),內(nèi)容包含了(ArkTS、ArkUI開(kāi)發(fā)組件、Stage模型、多端部署、分布式應(yīng)用開(kāi)發(fā)、音頻、視頻、WebGL、OpenHarmony多媒體技術(shù)、Napi組件、OpenHarmony內(nèi)核、Harmony南向開(kāi)發(fā)、鴻蒙項(xiàng)目實(shí)戰(zhàn)等等)鴻蒙(HarmonyOS NEXT)技術(shù)知識(shí)點(diǎn)。
希望這一份鴻蒙學(xué)習(xí)資料能夠給大家?guī)?lái)幫助,有需要的小伙伴自行領(lǐng)取,限時(shí)開(kāi)源,先到先得~無(wú)套路領(lǐng)?。。?/strong>
獲取這份完整版高清學(xué)習(xí)路線,請(qǐng)點(diǎn)擊→純血版全套鴻蒙HarmonyOS學(xué)習(xí)資料
鴻蒙(HarmonyOS NEXT)最新學(xué)習(xí)路線
-
?HarmonOS基礎(chǔ)技能
-
HarmonOS就業(yè)必備技能?
- ?HarmonOS多媒體技術(shù)
- 鴻蒙NaPi組件進(jìn)階
- HarmonOS高級(jí)技能
-
初識(shí)HarmonOS內(nèi)核?
- 實(shí)戰(zhàn)就業(yè)級(jí)設(shè)備開(kāi)發(fā)
有了路線圖,怎么能沒(méi)有學(xué)習(xí)資料呢,小編也準(zhǔn)備了一份聯(lián)合鴻蒙官方發(fā)布筆記整理收納的一套系統(tǒng)性的鴻蒙(OpenHarmony )學(xué)習(xí)手冊(cè)(共計(jì)1236頁(yè))與鴻蒙(OpenHarmony )開(kāi)發(fā)入門(mén)教學(xué)視頻,內(nèi)容包含:ArkTS、ArkUI、Web開(kāi)發(fā)、應(yīng)用模型、資源分類(lèi)…等知識(shí)點(diǎn)。
獲取以上完整版高清學(xué)習(xí)路線,請(qǐng)點(diǎn)擊→純血版全套鴻蒙HarmonyOS學(xué)習(xí)資料
《鴻蒙 (OpenHarmony)開(kāi)發(fā)入門(mén)教學(xué)視頻》
《鴻蒙生態(tài)應(yīng)用開(kāi)發(fā)V2.0白皮書(shū)》
《鴻蒙 (OpenHarmony)開(kāi)發(fā)基礎(chǔ)到實(shí)戰(zhàn)手冊(cè)》
OpenHarmony北向、南向開(kāi)發(fā)環(huán)境搭建
?《鴻蒙開(kāi)發(fā)基礎(chǔ)》
- ArkTS語(yǔ)言
- 安裝DevEco Studio
- 運(yùn)用你的第一個(gè)ArkTS應(yīng)用
- ArkUI聲明式UI開(kāi)發(fā)
- .……
?《鴻蒙開(kāi)發(fā)進(jìn)階》
- Stage模型入門(mén)
- 網(wǎng)絡(luò)管理
- 數(shù)據(jù)管理
- 電話服務(wù)
- 分布式應(yīng)用開(kāi)發(fā)
- 通知與窗口管理
- 多媒體技術(shù)
- 安全技能
- 任務(wù)管理
- WebGL
- 國(guó)際化開(kāi)發(fā)
- 應(yīng)用測(cè)試
- DFX面向未來(lái)設(shè)計(jì)
- 鴻蒙系統(tǒng)移植和裁剪定制
- ……
《鴻蒙進(jìn)階實(shí)戰(zhàn)》
- ArkTS實(shí)踐
- UIAbility應(yīng)用
- 網(wǎng)絡(luò)案例
- ……
?獲取以上完整鴻蒙HarmonyOS學(xué)習(xí)資料,請(qǐng)點(diǎn)擊→純血版全套鴻蒙HarmonyOS學(xué)習(xí)資料
總結(jié)
總的來(lái)說(shuō),華為鴻蒙不再兼容安卓,對(duì)中年程序員來(lái)說(shuō)是一個(gè)挑戰(zhàn),也是一個(gè)機(jī)會(huì)。只有積極應(yīng)對(duì)變化,不斷學(xué)習(xí)和提升自己,他們才能在這個(gè)變革的時(shí)代中立于不敗之地。?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-850281.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-850281.html
到了這里,關(guān)于Harmony鴻蒙南向驅(qū)動(dòng)開(kāi)發(fā)-PWM接口使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!