Eu estou usando a saída PWM de hardware com a fiaçãopi. Ele fornece a função pwmSetClock que deve permitir alterar a frequência. ( https://projects.drogon.net/raspberry-pi/wiringpi/functions/ ). Acredito que, como o padrão é 200 Mhz, a configuração do divisor para 200000000 deve fazer um LED ligado à saída piscar visivelmente, mas esse não é o caso.
Isso pode ser alterado?
pwmWrite()
. Não é algo que eu esperaria acontecerRespostas:
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:
O restante da resposta assume que estamos no modo de espaço de marca.
Também experimentei a faixa de valores permitida para
pwmSetClock()
epwmSetRange()
. Conforme observado em uma das outras respostas, o intervalo válido parapwmSetClock()
parece variar de 2 a 4095, enquanto o intervalo válidopwmSetRange()
é 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:
Se você usar os valores máximos permitidos para
pwmSetClock()
epwmSetRange()
, 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.fonte
De acordo com esta fórmula:
Podemos definir
pwmClock=1920
epwmRange=200
obterpwmFrequency=50Hz
:Eu testo em alarmpi:
Nota: Meu servo espera um sinal de 50Hz .
fonte
Este é o código que estou usando. Estou tentando ver o que mudará à medida que altero as configurações.
Pelo que testei, parece que o divisor passa de 2 para um número menor que 5000. Eu acho que tem algo a ver com a representação binária daqueles números que estão sendo diretamente definidos no registro. Uma vez que a representação binária dos números possui mais bits do que o registro pode suportar, apenas os primeiros bits e os interpretam dessa maneira. É por isso que o comportamento estranho ocorre quando passa de 4000 para 5000.
fonte