제어 하드웨어 PWM 주파수


21

wirepi와 함께 하드웨어 PWM 출력을 사용하고 있습니다. 주파수를 변경할 수있게하는 pwmSetClock 기능을 제공합니다. ( https://projects.drogon.net/raspberry-pi/wiringpi/functions/ ). 기본값은 200Mhz이므로 제수를 200000000으로 설정하면 LED가 출력 플래시에 시각적으로 연결되도록해야하지만 그렇지 않습니다.

변경할 수 있습니까?


1
하드웨어 PWM을 사용하여 테스트를 진행 중이며 주파수가 고정되지 않은 것 같습니다. 에 설정된 펄스 폭에 따라 다릅니다 pwmWrite(). 내가 일어날 것으로 예상되지 않는 것
TheMeaningfulEngineer

답변:


25

나는 최근에 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에 눈에 띄는 깜박임 (실제로 더 많은 플래시)을 줄 것입니다. 오실로스코프로 위의 방정식을 확인했으며 보류하는 것 같습니다. 위에 설명 된 것처럼 주파수 상한은 필요한 해상도의 영향을받습니다.


pwmRange의 하한에 대해 : 듀티 사이클을 50 %로하기 위해 성공적으로 2로 설정했습니다.
Ted Pudlik

pwm 클럭의 주파수가 19.2 MHz 인 것을 어떤 소스에서 알 수 있습니까?
thi gg

10

이 공식에 따르면 :

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 신호가 필요합니다.


당신은 어떻게 올 않습니다 'GPIO pwmr 단위 당 200 # 0.1 MS'
mxlian

사이클 당 50Hz ---> 20ms. 이 20ms / 200 = 유닛 단위는 0.1ms
mxlian

5

이것은 내가 사용하는 코드입니다. 설정을 변경하면 무엇이 바뀌는 지 확인하려고합니다.

#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으로 갈 때 이상한 행동이 오는 이유입니다.


1
듀티 사이클을 어떻게 변경합니까?
누팔

주파수는 어떻게 측정 했습니까?
Seanny123
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.