wirepi와 함께 하드웨어 PWM 출력을 사용하고 있습니다. 주파수를 변경할 수있게하는 pwmSetClock 기능을 제공합니다. ( https://projects.drogon.net/raspberry-pi/wiringpi/functions/ ). 기본값은 200Mhz이므로 제수를 200000000으로 설정하면 LED가 출력 플래시에 시각적으로 연결되도록해야하지만 그렇지 않습니다.
변경할 수 있습니까?
wirepi와 함께 하드웨어 PWM 출력을 사용하고 있습니다. 주파수를 변경할 수있게하는 pwmSetClock 기능을 제공합니다. ( https://projects.drogon.net/raspberry-pi/wiringpi/functions/ ). 기본값은 200Mhz이므로 제수를 200000000으로 설정하면 LED가 출력 플래시에 시각적으로 연결되도록해야하지만 그렇지 않습니다.
변경할 수 있습니까?
답변:
나는 최근에 PWM으로 실험을 시작해야 할 몇 가지 이유가 있었으며 (주석 중 하나에서 지적한 것처럼) 주파수는 듀티 사이클에 따라 변하는 것으로 나타났습니다. Broadcom은 온 / 오프 PWM 펄스를 가능한 한 고르게 분산시키기 위해 "균형"PWM을 구현 한 것으로 나타났습니다. 알고리즘에 대한 설명과 데이터 시트 139 페이지에 대한 추가 설명을 제공합니다. http://www.element14.com/community/servlet/JiveServlet/downloadBody/43016-102-1-231518/Broadcom.Datasheet.pdf
따라서 실제로 원하는 것은 PWM을 마크 스페이스 모드로 설정하는 것입니다. 이러면 원하는 전통적인 PWM을 쉽게 예측할 수 있습니다.
pwmSetMode(PWM_MODE_MS);
나머지 답변은 우리가 마크 스페이스 모드에 있다고 가정합니다.
또한 pwmSetClock()
and에 허용되는 값 범위를 실험했습니다 pwmSetRange()
. 다른 답변 중 하나에서 언급했듯이 유효 범위 pwmSetClock()
는 2에서 4095로, 반면 유효 범위는pwmSetRange()
는 최대 4096입니다 (하한선을 찾지 못했습니다).
범위와 시계 (더 나은 이름은 약수 일 수 있음)는 모두 주파수에 영향을줍니다. 이 범위는 해상도에도 영향을 미치므로 매우 낮은 값을 사용하는 것이 가능할 수 있지만 실제로는 얼마나 낮아야하는지에 대한 실질적인 제한이 있습니다. 예를 들어, 4의 범위를 사용하면 더 높은 주파수를 얻을 수 있지만 듀티 사이클은 0/4, 1/4, 2/4, 3/4 또는 4/4로만 설정할 수 있습니다.
라즈베리 파이 PWM 클럭의 기본 주파수는 19.2 MHz입니다. 의 인수로 나눈이 주파수 pwmSetClock()
는 PWM 카운터가 증가하는 주파수입니다. 카운터가 지정된 범위와 같은 값에 도달하면 0으로 재설정됩니다. 카운터가 지정된 듀티 사이클보다 작 으면 출력이 높고 그렇지 않으면 출력이 낮습니다.
즉, 특정 주파수를 갖도록 PWM을 설정하려는 경우 다음 관계를 사용할 수 있습니다.
pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange.
pwmSetClock()
및에 최대 허용 값을 사용하면 pwmSetRange()
달성 가능한 최소 하드웨어 PWM 주파수가 ~ 1.14Hz가됩니다. 이것은 분명히 LED에 눈에 띄는 깜박임 (실제로 더 많은 플래시)을 줄 것입니다. 오실로스코프로 위의 방정식을 확인했으며 보류하는 것 같습니다. 위에 설명 된 것처럼 주파수 상한은 필요한 해상도의 영향을받습니다.
이 공식에 따르면 :
pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange
우리는 설정 pwmClock=1920
하고 pwmRange=200
얻을 수 있습니다 pwmFrequency=50Hz
:
50 Hz = 19.2e6 Hz / 1920 / 200
alarmpi에서 테스트합니다.
$ 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º)
참고 : 내 서보에는 50Hz 신호가 필요합니다.
이것은 내가 사용하는 코드입니다. 설정을 변경하면 무엇이 바뀌는 지 확인하려고합니다.
#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
내가 테스트 한 결과, 제수는 2에서 5000보다 작은 숫자로 이동하는 것 같습니다. 레지스터에 직접 설정되는 숫자의 이진 표현과 관련이 있다고 생각합니다. 일단 이진 표현이 레지스터가 취할 수있는 것보다 많은 비트를 가지면 첫 번째 비트 만 취해서 숫자를 해석합니다. 그것이 4000에서 5000으로 갈 때 이상한 행동이 오는 이유입니다.
pwmWrite()
. 내가 일어날 것으로 예상되지 않는 것