Recentemente, tive algum motivo para começar a experimentar o PWM e descobri que (como apontado por um dos comentários) a frequência parece variar com o ciclo de trabalho - bizzare, certo? Acontece que a Broadcom implementou PWM "equilibrado" para tornar os pulsos PWM ligados e desligados o mais uniformemente distribuídos possível. Eles fornecem uma descrição do algoritmo e mais algumas discussões na página 139 da folha de dados:
http://www.element14.com/community/servlet/JiveServlet/downloadBody/43016-102-1-231518/Broadcom.Datasheet.pdf
Então, o que você realmente deseja é colocar o PWM no modo de espaço de marca, que fornecerá o PWM tradicional (e facilmente previsível) que você está procurando:
pwmSetMode(PWM_MODE_MS);
O restante da resposta assume que estamos no modo de espaço de marca.
Também experimentei a faixa de valores permitida para pwmSetClock()
e pwmSetRange()
. Conforme observado em uma das outras respostas, o intervalo válido para pwmSetClock()
parece variar de 2 a 4095, enquanto o intervalo válido pwmSetRange()
é de até 4096 (não tentei encontrar um limite inferior).
O intervalo e o relógio (um nome melhor é provavelmente divisor) afetam a frequência. O intervalo também afeta a resolução; portanto, embora seja possível usar valores muito baixos, há um limite prático para o quão baixo você provavelmente desejará ir. Por exemplo, se você usou um intervalo de 4, poderá obter frequências mais altas, mas só poderá definir o ciclo de trabalho para 0/4, 1/4, 2/4, 2/4, 3/4 ou 4/4.
O relógio Raspberry Pi PWM tem uma frequência base de 19,2 MHz. Essa frequência, dividida pelo argumento to pwmSetClock()
, é a frequência na qual o contador PWM é incrementado. Quando o contador atinge um valor igual ao intervalo especificado, ele é redefinido para zero. Enquanto o contador for menor que o ciclo de trabalho especificado, a saída é alta, caso contrário, a saída é baixa.
Isso significa que, se você desejar definir o PWM para ter uma frequência específica, poderá usar o seguinte relacionamento:
pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange.
Se você usar os valores máximos permitidos para pwmSetClock()
e pwmSetRange()
, terá a frequência PWM mínima possível de hardware de ~ 1,14 Hz. Isso certamente dará uma cintilação visível (mais um flash, na verdade) a um LED. Confirmei a equação acima com um osciloscópio, e parece que isso vale. O limite de frequência superior será afetado pela resolução necessária, conforme descrito acima.
pwmWrite()
. Não é algo que eu esperaria acontecer