1).?簡(jiǎn)介
PWM(Pulse-width modulation)接口是嵌入式設(shè)備最為常用的接口之一,常用于電機(jī)驅(qū)動(dòng),蜂鳴器,脈沖計(jì)數(shù)等嵌入式領(lǐng)域,因此本文就基于嵌入式Linux演示使用PWM接口。
本文所演示的平臺(tái)來自于Toradex Colibri iMX6DL嵌入式平臺(tái),這個(gè)平臺(tái)是基于NXP iMX6系列ARM處理器,支持雙核心Cortex-A9。
2.?準(zhǔn)備
a).?Colibri iMX6DL?ARM核心版配合Colibri Eva Board?V3.2B載板,連接調(diào)試串口到開發(fā)主機(jī),同時(shí)配置好Ubuntu開發(fā)主機(jī)開發(fā)環(huán)境,具體操作方法可以參考這里。
b). Colibri iMX6DL操作系統(tǒng)使用Toradex Linux Release V2.7b2,下載和更新方法請(qǐng)參考這里。
c). Colibri iMX6DL?提供了4路PWM接口支持,其中三路為標(biāo)準(zhǔn)的PWM輸出接口,另外一路特定為Backlight背光驅(qū)動(dòng)控制功能,Toradex Linux發(fā)布V2.7以上版本具體的定義請(qǐng)見如下,其他更低的LInux版本以及其他系列產(chǎn)品的定義情況請(qǐng)見這里。另外,如果需要將PWM_A作為常規(guī)PWM使用,需要修改Device Tree文件并重新編譯,這里就不詳細(xì)介紹了。
d).?這里為了簡(jiǎn)化測(cè)試,采用PWM輸出驅(qū)動(dòng)Colibri Eva Board上面提供的LED燈,連接方式如下,分別測(cè)試PWM_B,PWM_C,PWM_D連接到LED的驅(qū)動(dòng)情況,PWM_A是backlight背光驅(qū)動(dòng)功能這里就不直接測(cè)試了。
./ PWM_B (X12 PWM_B?管腳) –> X21 LED1
./ PWM_C (X12 PWM_B?管腳) –> X21 LED1
./ PWM_D (X12 PWM_B?管腳) –> X21 LED1
3).?在user space下對(duì)PWM接口進(jìn)行測(cè)試
a).?這里以PWM_B為例測(cè)試,其他PWM通道都是類似配置。
b). Export PWM_B接口
--------------------------------
root@colibri-imx6:~# cd /sys/class/pwm/pwmchip0/
root@colibri-imx6:~# echo 0 > export
--------------------------------
c).?設(shè)置PWM?周期和占空比,這里均為時(shí)間,單位為ns
--------------------------------
//?這里為了讓驅(qū)動(dòng)LED效果肉眼可見,分別設(shè)置周期為1s,占空比為50%
root@colibri-imx6:~# echo 1000000000 > pwm0/period
root@colibri-imx6:~# echo 500000000 > pwm0/duty_cycle
--------------------------------
d).?使能PWM,這時(shí)候變可以看到連接的LED以0.5s的周期交替亮和滅了。
--------------------------------
root@colibri-imx6:~# echo 1 > pwm0/enable
--------------------------------
4).?通過C程序操作PWM接口示例
a).?程序和上述user space實(shí)現(xiàn)的原理一致,只是使用linux?文件管理相關(guān)函數(shù)進(jìn)行操作,具體代碼請(qǐng)見如下:
./ pwmconfig.h - PWM基本操作函數(shù)定義頭文件
https://github.com/simonqin09/PWMtest/blob/master/pwmconfig.h
./ pwmconfig.c - PWM基本操作函數(shù)定義源文件
https://github.com/simonqin09/PWMtest/blob/master/pwmconfig.c
./ pwmtest.c – PWM具體接口使能配置主文件源代碼
https://github.com/simonqin09/PWMtest/blob/master/pwmtest.c
b).?測(cè)試上述c程序代碼運(yùn)行請(qǐng)見如下:
--------------------------------
root@colibri-imx6:~# ./pwmtest B
PWM_B successfully enabled with period - 1000ms, duty cycle - 50.0%
root@colibri-imx6:~# ./pwmtest C
PWM_C successfully enabled with period - 1000ms, duty cycle - 50.0%
root@colibri-imx6:~# ./pwmtest D
PWM_D successfully enabled with period - 1000ms, duty cycle - 50.0%
root@colibri-imx6:~# ./pwmtest
Usage:??./pwmtest
root@colibri-imx6:~# ./pwmtest S
wrong PWM Channel input
--------------------------------
?
評(píng)論