嵌入式Linux下PWM功能除錯
轉載地址:http://www.eefocus.com/toradex/blog/17-05/420816_04520.html
By Toradex秦海
1). 簡介
PWM(Pulse-width modulation)介面是嵌入式裝置最為常用的介面之一,常用於電機驅動,蜂鳴器,脈衝計數等嵌入式領域,因此本文就基於嵌入式Linux演示使用PWM介面。
本文所演示的平臺來自於Toradex Colibri iMX6DL嵌入式平臺,這個平臺是基於NXP iMX6系列ARM處理器,支援雙核心Cortex-A9。
2. 準備
a). Colibri iMX6DL ARM核心版配合Colibri Eva Board V3.2B載板,連線除錯串列埠到開發主機,同時配置好Ubuntu開發主機開發環境,具體操作方法可以參考這裡。
b). Colibri iMX6DL作業系統使用Toradex Linux Release V2.7b2,下載和更新方法請參考這裡。
c). Colibri iMX6DL 提供了4路PWM介面支援,其中三路為標準的PWM輸出介面,另外一路特定為Backlight背光碟機動控制功能,Toradex Linux釋出V2.7以上版本具體的定義請見如下,其他更低的LInux版本以及其他系列產品的定義情況請見這裡。另外,如果需要將PWM_A作為常規PWM使用,需要修改Device Tree檔案並重新編譯,這裡就不詳細介紹了。
d). 這裡為了簡化測試,採用PWM輸出驅動Colibri Eva Board上面提供的LED燈,連線方式如下,分別測試PWM_B,PWM_C,PWM_D連線到LED的驅動情況,PWM_A是backlight背光碟機動功能這裡就不直接測試了。
./ PWM_B (X12 PWM_B 管腳) –> X21 LED1
./ PWM_C (X12 PWM_B 管腳) –> X21 LED1
./ PWM_D (X12 PWM_B 管腳) –> X21 LED1
3). 在user space下對PWM介面進行測試
a). 這裡以PWM_B為例測試,其他PWM通道都是類似配置。
b). Export PWM_B介面
--------------------------------
root@colibri-imx6:~# cd /sys/class/pwm/pwmchip0/
root@colibri-imx6:~# echo 0 > export
--------------------------------
c). 設定PWM 週期和佔空比,這裡均為時間,單位為ns
--------------------------------
// 這裡為了讓驅動LED效果肉眼可見,分別設定週期為1s,佔空比為50%
root@colibri-imx6:~# echo 1000000000 > pwm0/period
root@colibri-imx6:~# echo 500000000 > pwm0/duty_cycle
--------------------------------
d). 使能PWM,這時候變可以看到連線的LED以0.5s的週期交替亮和滅了。
--------------------------------
root@colibri-imx6:~# echo 1 > pwm0/enable
--------------------------------
4). 通過C程式操作PWM介面示例
a). 程式和上述user space實現的原理一致,只是使用linux 檔案管理相關函式進行操作,具體程式碼請見如下:
./ pwmconfig.h - PWM基本操作函式定義標頭檔案
https://github.com/simonqin09/PWMtest/blob/master/pwmconfig.h
./ pwmconfig.c - PWM基本操作函式定義原始檔
https://github.com/simonqin09/PWMtest/blob/master/pwmconfig.c
./ pwmtest.c – PWM具體介面使能配置主檔案原始碼
https://github.com/simonqin09/PWMtest/blob/master/pwmtest.c
b). 測試上述c程式程式碼執行請見如下:
--------------------------------
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 <PWM Channel Name(B or C or D)>
root@colibri-imx6:~# ./pwmtest S
wrong PWM Channel input
--------------------------------