Difference between revisions of "How to add pwm"

(How to enable PWM libraries for Olimex Allwinner boards)
m (LubOlimex moved page How-to-add-pwm-sunxi to How to add pwm: easier for access)
(No difference)

Revision as of 04:48, 13 January 2014

How to enable PWM libraries for Olimex Allwinner boards

The article describes how to enable the PWM control in the Olimex Allwinner boards under Linux by enabling the "Sunxi PWM Driver" in the kernel.

If the Linux PWM module in the board you are using is not available for use there is a good chance it is not enabled by default in the distribution you are using. A way to enable it is detailed below.

To enable the PWM module you need to perform five major steps:

1. Recompile the kernel following one of the Olimex wordpress guides for the board you have on how to do it. The only difference would be to enable the "Sunxi PWM Driver (pwm-sunxi)" as shown in the picture below.

Pwm enable2.jpg

2. Replace the uImage file from first partition of your SD card with the generated one from ../linux-sunxi/arch/arm/boot/uImage directory

3. Replace the modules from second partition of your SD card (usualy they are located in /lib/modules/xx.xx.x) with the new generated modules from ../linux-sunxi/out/modules/xx.xx.x

if the PWM module is not loaded you can load it with

#modprobe pwm-sunxi

4. Edit the script.fex in the "[pwm0_para]" paragraph adding PWM support for specific pin.

Example config for script.bin:

[pwm0_para]

pwm_used = 1

pwm_period = 10000

pwm_duty_percent = 100

Source and more info on the subject: google sunxi groups discussion on pwm0_para

5. Boot the board and use the library! Info on the pwm class:

- /sys/class/pwm-sunxi 
                     |
                     +----pwmX 
                             | 
                             +---duty 
                             +---duty_percent 
                             +---period 
                             +---polarity 
                             +---pulse 
                             +---pin 
                             +---run 

Information on the parameters:

period (r/w) - period that makes up a cycle. Can be expressed as hz, khz, ms, or us. Whole numbers only.

       Examples: 
       echo 10hz > /sys/class/pwm-sunxi/pwm0/period 
       echo 1khz > /sys/class/pwm-sunxi/pwm0/period 
       echo 100ms > /sys/class/pwm-sunxi/pwm0/period 
       echo 100us > /sys/class/pwm-sunxi/pwm0/period 
       echo 150khz > /sys/class/pwm-sunxi/pwm0/period 

duty (r/w) - portion of the period above that is "active" or on. Same units as above.

       Examples:
       echo 1hz > /sys/class/pwm-sunxi/pwm0/period 
       echo 2hz > /sys/class/pwm-sunxi/pwm0/duty 

duty_percent (r/w) - duty (above) expressed as a percentage. Whole numbers only.

       Example:
       echo 50 > /sys/class/pwm-sunxi/pwm0/duty_percent

polarity(r/w) - polarity of the pin during the duty portion. 1 = high, 0 = low

pulse (r/w) - output one pulse at the specified period and duty

Source and more info on the subject: google sunxi group discussion on PWM kernel module