1. 程式人生 > >嵌入式Linux下PWM功能除錯

嵌入式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

--------------------------------