quinta-feira, 15 de maio de 2014

Raspberry Pi como gerador de sinais


No post Transmitindo RF com o Raspberry Pi expliquei como emitir rádio frequência somente com seu Raspberry Pi e transmitir em FM. O controle da frequência como explicado no post é feito controlando um divisor MASH que utiliza uma frequência vinda de um PLL de 500Mhz. O tema desse post é relacionado a algo que já vimos anteriormente, mas com foco diferente. Assim como um DDS, podemos gerar diversas frequências diretamente com o Raspberry Pi e utiliza-las não só para RF, mas também para testes ou clock para outros dispositivos.
O esquema para configurar as frequências utiliza a mesma base utilizada no pifm, mapear /dev/mem na memória e alterar manualmente os valores de controle de clock, divisor e configurar o GPIO4 como ALT0 que é a função alternativa para funcionar como GPCLK0, o output do clock.

Enquanto outros projetos como pifm utilizam somente o PLL de 500Mhz, resolvi testar outras fontes de clock disponíveis, com isso foi possível conseguir frequências de 5Khz à 500Mhz.

As fontes de clock ativas que encontrei em meu Raspberry Pi foram as seguintes:

XTAL 19.2Mhz - Esse é o cristal que fica abaixo da placa.
PLLC 1000Mhz
PLLD 500Mhz
HDMI auxiliary 216Mhz

Outro possível seria o PLLA mas que parece estar inativo.

Algo que descobri ao fazer testes com diversas fontes de clock, foi que o PLLC tinha clock de 1000Mhz, algo que não é citado em referência alguma na internet, as únicas que encontrei eram informações de que possivelmente seriam os clocks de exemplo da página 105 no datasheet do BCM2835.

Para configurar e ativar a frequência utilizaremos o código abaixo. Existe como fazer também pela wiringpi, isso foi adicionado a um tempo, entretanto não é possível a utilização de outras fontes de clock.

Todos os testes foram feitos com a revisão 2.0 da placa.


Salve o código, compile com gcc freq_g.c -o freq_g

Ao rodar o programa sem qualquer argumento é apresentado as seguintes opções: 

#./freq_g

  GPCLK0 Frequency Controller by blog.everpi.net

    Usage: freq_g [frequency] [source]

         [frequency] in Mhz with or without float pointing
         [source]    number is the frequency source argument

    Supported sources:   1 - XTAL 19.2Mhz
                                      5 - PLLC 1000Mhz
                                      6 - PLLD 500Mhz default
                                      7 - HDMI aux 216Mhz



Por padrão é utilizado o PLLD de 500Mhz se nada for especificado no source. Se você quer 433.9Mhz por exemplo, será preciso especificar o uso do PLLC, pois a divisão miníma é por 2, exemplo:

#./freq_g 433.9 5


Algumas observações se fazem necessárias,a precisão dos Khz não será a mesma em todas as frequências, quanto mais baixa em relação ao PLL menor ela será, o valor do divisor contém uma parte inteira e outra em ponto flutuante, entretanto o problema é que a parte do ponto flutuante tem somente 12 bits, dependendo da frequência que necessita, você pode tentar outros PLLs para ver qual chega mais perto.

A menor frequência que consegui por exemplo, foi de 5Khz e somente utilizando como source o XTAL de 19.2Mhz.

Quanto menor a frequência, mais quadrado o sinal irá ficar e vice versa.






Outra questão é nos problemas em relação a vários tipos de ruídos, no final do post Transmitindo RF com o Raspberry Pi apresentei um projeto chamado PiHat de automação residencial usando a frequência de 433.92Mhz, naquele caso o criador se aproveitou da harmônica gerada nessa frequência e criou um filtro para utiliza-la em seu projeto. Além de harmônicas, no uso de certas frequências temos vários tipos de ruídos, como nos exemplos abaixo.



Segundo o datasheet do BCM2835 página 105, um dos efeitos do filtro MASH na frequência está na variação quando utilizado divisores fracionários e que essa variação aumenta quanto menor for o número divisor. A exemplo, utilizando 16Mhz que para ser obtida precisa de um número divisor relativamente grande de 31,25 com PLL de 500Mhz, a frequência foi relativamente estável no osciloscópio, entretanto não tenho em mãos um frequencímetro para testes mais precisos.

No post Controlando módulo DDS AD9850 com Raspberry Pi demonstrei ele sendo usado como gerador de clock para um Atmel retirado do meu arduino, o mesmo pode ser feito com o clock gerado no GPIO4 do Raspberry Pi.


Vimos que o progresso nesse tipo de utilização e frequência não estava estagnado aos 250Mhz, acredito que ainda exista muito a se desenvolver e a tirar do Raspberry Pi.

Referências:
http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf
http://www.icrobotics.co.uk/wiki/index.php/Turning_the_Raspberry_Pi_Into_an_FM_Transmitter
http://www.skagmo.com/page.php?p=projects/22_pihat

Está gostando do blog? Ajude-nos a divulgar e curta nossa página no Facebook ou siga-nos no Twitter.

Um comentário:

  1. Excelente informação. Vou testar com o mixer NE612 para receber sinal de rádio.

    ResponderExcluir