PWM (Pulse Width Modulation), bir sinyalin ortalama güç seviyesini kontrol etmek için kullanılan bir modülasyon tekniğidir. Temel çalışma prensibi, sabit periyotlu bir kare dalganın “açık” ve “kapalı” kalma sürelerinin (duty cycle) ayarlanmasına dayanır. Gömülü sistemlerde motor hız kontrolü, LED parlaklık ayarı, servo motor kontrolü, güç dönüştürücüler ve analog sinyal üretimi gibi birçok amaçla kullanılır. Örneğin, bir motorun hızı PWM ile kontrol edilirken, duty cycle değeri arttıkça motora iletilen ortalama gerilim artar ve motor daha hızlı döner. PWM sinyalinin temel parametrelerinden biri olan periyot bir tam dalga boyunun süresidir. Duty cycle ise bir periyot içinde sinyalin “açık” kaldığı süredir. Polarite ise PWM sinyalinin aktif olduğu durumu (yüksek veya düşük seviye) belirler. Örneğin, normal polaritede duty cycle yüksek seviyeyi temsil ederken, ters polaritede düşük seviyeyi temsil eder.

PWM Arayüzleri

T3-GEM-O1 kartta yer alan PWM arayüzleri aşağıdaki tabloda listelenmiştir.
GPIO
PWM-ECAP0pwmchip0/pwm0GPIO-12k3-am67a-t3-gem-o1-pwm-ecap0-gpio12.dtso
PWM-ECAP1pwmchip1/pwm0GPIO-16k3-am67a-t3-gem-o1-pwm-ecap1-gpio16.dtso
PWM-ECAP2pwmchip2/pwm0GPIO-18k3-am67a-t3-gem-o1-pwm-ecap2-gpio18.dtso
PWM-0Apwmchip3/pwm0GPIO-5k3-am67a-t3-gem-o1-pwm-epwm0-gpio5.dtso
PWM-0Bpwmchip3/pwm1GPIO-14k3-am67a-t3-gem-o1-pwm-epwm0-gpio14.dtso
PWM-1Apwmchip5/pwm0GPIO-6k3-am67a-t3-gem-o1-pwm-epwm1-gpio6.dtso
PWM-1Bpwmchip5/pwm1GPIO-13k3-am67a-t3-gem-o1-pwm-epwm1-gpio13.dtso
PWM-2Apwmchip7/pwm0FAN headerk3-am67a-t3-gem-o1-gpio-fan.dtso
PWM-0A ve PWM-0B birlikte aktif etmek için: k3-am67a-t3-gem-o1-pwm-epwm0-gpio5-gpio14.dtsoPWM-1A ve PWM-1B birlikte aktif etmek için: k3-am67a-t3-gem-o1-pwm-epwm1-gpio6-gpio13.dtso
pwmchip3 ve pwmchip5 çipleri iki kanala sahiptir ve her bir kanal bir PWM cihazı olarak kullanılabiir. Ancak bir PWM çipinin iki kanalına (örneğin PWM-0A ve PWM-0B) farklı periyot değerleri ATANAMAZ. İki kanala aynı periyot değeri verildiği sürece farklı duty-cycle atanmasında bir sakınca yoktur.
Aktif edilmek istenen arayüzlerin overlay dosyalarının isimleri /boot/uEnv.txt dosyasındaki overlays değişkenine eklenmelidir. Overlay’ler hakkında detaylı bilgiye Device Tree bölümünden erişilebilir. Tüm overlay’ler aktif edildiğinde 1 tanesi FAN header’ından 7 tanesi 40-pin header’dan olmak üzere 8 ayrı PWM arayüzü mevcuttur.

PWM Kullanımı

PWM çiplerine /sys/class/pwm dizininden erişilebilmektedir. Bir PWM cihazını kullanabilmek için öncesinde export işlemi yapılmış olmalıdır. Örneğin yukarıdaki tablo incelendiğinde PWM-ECAP0 arayüzünün pwmchip0 çipinin pwm0 cihazına karşılık gelmekte olduğu görülmektedir. Aşağıdaki komut ile export yapıldıktan sonra /sys/class/pwm/pwmchip0/pwm0 cihazı oluşur. echo 0 yazmamızın sebebi pwm0 yani 0 numaralı cihaz olmasıdır.
gemstone@t3-gem-o1:~$ echo 0 | sudo tee /sys/class/pwm/pwmchip0/export
# 0
Benzer şekilde PWM-0B arayüzü kullanılmak isteniyorsa aşağıdaki komutta gösterildiği gibi pwmchip3 çipinin pwm1 cihazı aktif edilmelidir. echo 1 yazmamızın sebebi pwm1 yani 1 numaralı cihaz olmasıdır.
gemstone@t3-gem-o1:~$ echo 1 | sudo tee /sys/class/pwm/pwmchip3/export
# 1
export işleminin ardından nanosaniye cinsinden period ve duty_cycle değişkenleri aşağıdaki örnekte gösterildiği şekilde istenen değerlere ayarlanıp cihazın enable değişkenine 1 atandıktan sonra PWM çıktısı alınabilir.
gemstone@t3-gem-o1:~$ echo 2000000 | sudo tee /sys/class/pwm/pwmchip0/pwm0/period     # 500 Hz
# 2000000
gemstone@t3-gem-o1:~$ echo 1000000 | sudo tee /sys/class/pwm/pwmchip0/pwm0/duty_cycle # 50%
# 1000000
gemstone@t3-gem-o1:~$ echo 1 | sudo tee /sys/class/pwm/pwmchip0/pwm0/enable
# 1
PWM çıktısını durdurmak için enable değişkenine 0 atanabilir.
gemstone@t3-gem-o1:~$ echo 0 | sudo tee /sys/class/pwm/pwmchip0/pwm0/enable
# 1
Eğer PWM cihazı artık kullanılmak istenmiyorsa unexport işlemi yapılabilir. Bu işlem sonrasında cihaz sistemden kaldırılacaktır. echo 0 yazmamızın sebebi pwm0 yani 0 numaralı cihaz olmasıdır.
gemstone@t3-gem-o1:~$ echo 0 | sudo tee /sys/class/pwm/pwmchip0/unexport
# 0