Kontrol Donanımı PWM frekansı


21

Wiringpi ile donanım PWM çıkışını kullanıyorum. Frekansı değiştirmeyi mümkün kılan pwmSetClock fonksiyonunu sağlar. ( https://projects.drogon.net/raspberry-pi/wiringpi/functions/ ). Varsayılan 200 Mhz olduğundan, bölenin 200000000 olarak ayarlanmasının, çıkışa bağlı bir LED'in görünür şekilde yanıp sönmesini sağlaması gerektiğine inanıyorum, ancak bu böyle değil.

Bu değiştirilebilir mi?


1
Donanım PWM ile bazı testler yapıyorum ve fiexd frekansı yok gibi görünüyor. Ayarlanan nabız genişliğine bağlı olarak değişmiştir pwmWrite().
Olmasını

Yanıtlar:


25

Geçenlerde PWM ile kendim denemeye başlamak için bazı nedenlerim vardı ve (yorumlardan birinin işaret ettiği gibi) sıklığın görev döngüsüne göre değiştiğini gördüm - bizzare, değil mi? Broadcom’un, PWM sinyallerini mümkün olduğu kadar eşit bir şekilde dağıtmak için “dengeli” PWM kullandığı ortaya çıktı. Algoritmanın açıklamasını ve veri sayfalarının 139. sayfasında daha fazla tartışmayı veriyorlar: http://www.element14.com/community/servlet/JiveServlet/downloadBody/43016-102-1-231518/Broadcom.Datasheet.pdf

Yani gerçekte istediğin şey, PWM'yi aradığın geleneksel (ve kolayca tahmin edilebilir) PWM'yi verecek olan işaret boşluğu moduna koymak.

pwmSetMode(PWM_MODE_MS);

Cevabın geri kalanı işaret boşluğu modunda olduğumuzu varsayıyor.

Ayrıca bazı değerleri izin verdiği aralıkta deneme yaptım pwmSetClock()ve pwmSetRange(). Diğer cevaplardan birinde belirtildiği gibi, geçerli aralık pwmSetClock()2 - 4095 arasındadır, geçerli aralık pwmSetRange()4096'ya kadar çıkmaktadır (daha düşük bir limit bulmaya çalışmadım).

Aralık ve saat (daha iyi bir isim muhtemelen bölen) her ikisi de frekansı etkiler. Bu aralık aynı zamanda çözünürlüğü de etkiler, bu nedenle çok düşük değerler kullanmak mümkün olsa da, muhtemelen ne kadar düşük gitmek istediğinize ilişkin pratik bir sınırlama vardır. Örneğin, 4 aralığını kullandıysanız, daha yüksek frekanslar elde edebilirsiniz, ancak görev döngüsünü yalnızca 0/4, 1/4, 2/4, 3/4 veya 4/4 olarak ayarlayabilirsiniz.

Ahududu Pi PWM saat 19.2 MHz'lik bir temel frekansa sahiptir. Argümanla bölünen bu frekans, pwmSetClock()PWM sayacının artırıldığı frekanstır. Sayaç belirtilen aralığa eşit bir değere ulaştığında, sıfıra sıfırlar. Sayaç belirtilen görev döngüsünden az olsa da, çıkış yüksektir, aksi halde çıkış düşüktür.

Bu, eğer PWM'yi belirli bir frekansa ayarlayacaksanız, aşağıdaki ilişkiyi kullanabilirsiniz:

pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange.

İçin izin verilen en yüksek değerleri kullanmak ise pwmSetClock()ve pwmSetRange(), sen ~ 1.14 Hz minimum elde donanım PWM frekansı ile sona erecek. Bu kesinlikle bir LED'e gözle görülür bir titreme (daha çok flaş) verir. Yukarıdaki denklemi bir osiloskopla onayladım ve öyle görünüyor. Üst frekans sınırı, yukarıda açıklandığı gibi ihtiyacınız olan çözünürlükten etkilenir.


PwmRange'daki alt sınırla ilgili: Başarılı bir şekilde 2'ye ayarladım (% 50'lik bir görev döngüsü elde etmek için).
Ted Pudlik

pwm saatin 19,2 mhz frekansa sahip olduğunu hangi kaynaktan biliyorsunuz?
thi gg

10

Bu formüle göre:

pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange

Ayarlayabilir pwmClock=1920ve pwmRange=200almak için pwmFrequency=50Hz:

50 Hz = 19.2e6 Hz / 1920 / 200

Alarmpi'de test ediyorum:

$ pacman -S wiringpi
$ gpio mode 1 pwm
$ gpio pwm-ms
$ gpio pwmc 1920
$ gpio pwmr 200     # 0.1 ms per unit
$ gpio pwm 1 15     # 1.5 ms (0º)
$ gpio pwm 1 20     # 2.0 ms (+90º)
$ gpio pwm 1 10     # 1.0 ms (-90º)

Not: Servom 50Hz sinyal bekliyor .


nasılsın: 'gpio pwmr 200 # birim başına 0.1 ms'
mxlian

50Hz --- çevrim başına 20ms. 20ms / 200 birim = birim başına
0.1ms

5

Bu kullandığım kod. Ayarları değiştirdiğimde neyin değişeceğini görmeye çalışıyorum.

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

int main (void)
{
  printf ("Raspberry Pi wiringPi test program\n") ;

  if (wiringPiSetupGpio() == -1)
    exit (1) ;

  pinMode(18,PWM_OUTPUT);
  pwmSetClock(2);
  pwmSetRange (10) ;
  pwmWrite (18, 5);

for (;;) delay (1000) ;
}

pwmSetClock (1); -> 2.342kHz

pwmSetClock (2); -> 4.81MHz

pwmSetClock (3); -> 3.19MHz

pwmSetClock (4); -> 2.398MHz

pwmSetClock (5); -> 1.919MHz

pwmSetClock (6); -> 1.6MHz

pwmSetClock (7); -> 1.3MHz

pwmSetClock (8); -> 1.2MHz

pwmSetClock (9); -> 1.067MHz

pwmSetClock (10); -> 959kHz

pwmSetClock (11); -> 871kHz

pwmSetClock (20); -> 480kHz

pwmSetClock (200); -> 48kHz

pwmSetClock (500); -> 19kHz

pwmSetClock (1000); -> 9.59kHz

pwmSetClock (2000); -> 4.802kHz

pwmSetClock (4000); -> 2.401kHz

pwmSetClock (5000); -> 10.58kHz

Test ettiklerime göre, bölen 2'den 5000'e daha az sayıya gidiyor. Görünüşe göre, doğrudan sicile ayarlanmış olan bu sayıların ikili gösterimi ile ilgisi var. Sayılar ikili gösterimi registerın alabileceğinden daha fazla bit içerdiğinde, sadece ilk bitleri alır ve sayıları bu şekilde yorumlar. Bu yüzden tuhaf davranış 4000'den 5000'e giderken geliyor.


1
Görev döngüsünü nasıl değiştiririm?
noufal

Frekansları nasıl ölçtünüz?
Seanny123
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.