Gerando PWM na Raspberry Pi

raspberry-pi

Introdução

 

A modulação por largura de pulso (MLP), mais conhecida pela sigla em inglês PWM (Pulse-Width Modulation), é uma técnica de modulação que gera uma onda quadrada, baseada na variação da largura de pulso de acordo com um valor chamado de duty cycle. Embora essa técnica de modulação possa ser utilizada para codificar a informação para transmissão, a sua utilização principal é permitir o controle da energia fornecida aos dispositivos elétricos, especialmente motores. Neste artigo apresentarei como implementar o PWM na Raspberry Pi.

 

Em dois posts anteriores foi referenciada a modulação PWM. No artigo de Fabio Souza foi abordado o controle de saídas PWM em um Arduino, e no artigo de Rodrigo Almeida, com a colaboração de seus alunos, também foi estudado o controle de motores utilizando PWM.

 

O termo duty cycle (ciclo de trabalho) descreve a proporção de tempo em nível alto de tensão em um intervalo regular ou período de tempo. O tempo em baixo nível de tensão corresponde à baixa potência, quando o duty cycle fica abaixo de 50%, porque a potência está desligada pela maior parte do tempo. E para valores acima de 50% temos uma potência maior conforme o duty se aproxima de 100%. O duty cycle é expresso em porcentagem, sendo 100% o valor máximo.

 

A modulação por largura de pulso usa uma onda de pulso retangular cujo pulso é modificado resultando em uma variação do valor médio da forma de onda. Se nós considerarmos um pulso de forma de onda f(t), com período T, valor mínimo Ymin, valor máximo Ymax e duty cycle D, a valor médio da onda é dado por:

 

valor_media_PWM

(Eq. 1)

 

Como f(t) é um pulso de onda, seu valor é Ymax para 0 < t < D*T e Ymin para D*T < t < T. A expressão se torna:

 

valor_media_PWM02

 

(Eq. 2)

 

 

Aplicações

 

As aplicações de PWM são inúmeras. Veremos apenas algumas no texto a seguir.

 

Servo Motor

 

O PWM pode ser usado para controlar servo motores. O ângulo é determinado pela duração de um pulso que é aplicado ao fio de controle. A posição do servo não é definida pelo ciclo PWM (isto é, tempo de ON vs OFF), mas apenas pela duração do pulso. O servo espera um pulso a cada 20 ms, no entanto, isto pode variar dentro de uma ampla gama que difere de servo para servo. O comprimento do pulso determina a distância que o motor irá percorrer. Por exemplo, um pulso de 1,5 ms irá fazer motor girar para a posição de 90 graus (posição neutra).

 

Telecomunicações

 

Em telecomunicações, PWM é uma forma de modulação de sinal em que as larguras dos pulsos correspondem a valores específicos de dados codificados em uma extremidade e descodificados na outra. Pulsos de vários comprimentos, a própria informação, serão enviados em intervalos regulares (a frequência portadora da modulação).

 

Entrega de Potência

 

PWM pode ser utilizado para controlar a quantidade de energia fornecida a uma carga, sem incorrer nas perdas que resultam da entrega de potência linear por meios resistivos. Desvantagens potenciais para esta técnica são as pulsações definidas pelo ciclo de trabalho, a freqüência de comutação e as propriedades da carga. Com uma frequência de comutação suficientemente elevada e, quando necessário, utilizando filtros eletrônicos passivos suplementares, o trem de pulsos pode ser suavizado e a forma de onda média analógica recuperada.

 

Este é o método usado em fontes chaveadas, como as fontes de computadores. Dessa forma ela entrega apenas a potência “exigida” pela carga, economizando energia elétrica quando possível e proporcionando um melhor controle da potência.

 

Reguladores de Tensão

 

PWM é também usado em reguladores de tensão eficientes. Ao mudar a tensão para a carga, com o ciclo de trabalho adequado, a saída se aproximará de uma tensão do nível desejado. O ruído de comutação é geralmente filtrado com um indutor e um capacitor.

 

PWM na Raspberry Pi
Figura 1: Raspberry Pi

 

 

PWM na Raspberry Pi

 

O controlador PWM incorpora as seguintes características:

  • Duas saídas independentes de bit-streams, alimentadas por uma frequência fixa;
  • Bit-streams configuradas individualmente para saída PWM ou uma versão serializada de uma palavra de 32 bits;
  • As saídas PWM têm resoluções de saída e entrada variáveis;
  • Modo serializado configurado para carregar dados e/ou ler dados de um bloco FIFO, que pode armazenar até oito palavras de 32 bits;
  • Ambos os modos são alimentados por clk_pwm que normalmente é 100MHz, mas pode ser variado pelo gerenciador de clock.

 

 

Gerando PWM na Raspberry Pi

 

Utilizando a biblioteca wiringPI é possível gerar PWM por software ou por hardware na Raspberry Pi. Vamos nos focar no uso do PWM por hardware. Para iniciarmos o uso do PWM por hardware chamamos a função: 

 

 

Para configurar a frequência do sinal PWM devemos usar as funções pwmSetClock() e pwmSetRange(). O intervalo válido para pwmSetClock() parece ir de 2 a 4095, enquanto o intervalo válido para pwmSetRange() é de até 4096. Tanto o intervalo (range) quanto o clock afetam a frequência.

 

O intervalo (range) também afeta a resolução, por isso, embora possa ser possível a utilização de valores muito baixos, há um limite prático para o quão baixo você provavelmente vai querer ir. Por exemplo, se você usa o intervalo de 4, você poderia alcançar altas frequências, mas estaria habilitado apenas a configurar o ciclo de trabalho para 0/4, 1/4, 2/4, 3/4 or 4/4.

 

O clock do PWM da Raspberry Pi tem uma frequência base de 19,2 MHz. Essa frequência, divida pelo argumento de pwmSetClock(), é a frequência em que o contador PWM é incrementado. Quando o contador atinge um valor igual ao intervalo especificado, ele reinicia para zero. Enquanto o contador é menor do que o ciclo de trabalho especificado, a saída é alta, caso contrário, a saída é baixa.

 

Isso significa que, se você deseja definir o PWM para ter uma freqüência específica, você pode usar a seguinte relação:

 

 

Código fonte de um exemplo:

 

 

Para compilar na própria Raspberry, digite:

 

 

 

Referências

 

PWM - Wikipedia

Driver de PWM pra Rasp

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Vinicius Maciel
Cursando Tecnologia em Telemática no IFCE. Trabalho com programação de Sistemas Embarcados desde 2009. Tenho experiência em desenvolvimento de software para Linux embarcado em C/C++. Criação ou modificação de devices drivers para o sistema operacional Linux. Uso de ferramentas open source para desenvolvimento e debug incluindo gcc, gdb, eclipse.

12
Deixe um comentário

avatar
 
5 Comment threads
7 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
3 Comment authors
Vinicius MacielMauro AssisFlavio AndradeComunicação SPI em Linux - Embarcados - Sua fonte de informações sobre Sistemas EmbarcadosO que pedir pro papai noel? Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Mauro Assis
Visitante
Mauro Assis

Vinícius,

Muito bom o seu post, parabéns.

Vc acha que seria possível controlar o movimento de quatro servos somente usando o Pi? Quer dizer, vc acha que ele geraria os pulsos com a precisão necessária?

[],

Mauro

Mauro Assis
Visitante
Mauro Assis

Pois é, o problema é justamente esse, os servos trabalham com frequências em torno de 2 kHz. Não creio que ele controlará os servos direito. Fiz um projeto com dois servos pequenos e ele não deu conta. Achei que pudesse ter um outro jeito, mas acabei de crer que rola não.

O bom e barato é colocar um Arduino mini do lado do Pi, plugar um no outro via i2c ou serial ou whatever e cada um no seu quadrado...

Tks!

Mauro Assis
Visitante
Mauro Assis

Pois é, Vinicius, mas isso é em um pino, tanto é que no exemplo ele nem define o onde o servo será ligado.

Por outro lado, a resolução é grande, ou seja, daria para fazer uma brincadeira com um 74HC595 para multiplexar a saída.. como o 595 trabalha a até 100 Mhz, ele não interferiria. Aí moveria-se um servo de cada vez, e se bobear daria para fazer isso até "simultaneamente", ou seja, dando a ilusão que os servos se movem juntos. Tem que ver só como ele funciona com 3V3.

Vou testar isso no finde...

Mauro Assis
Visitante
Mauro Assis

Uai, bicho, não é que vc tem razão??? Vou testar lá, depois dou notícias.

Tks!

trackback
Comunicação SPI em Linux - Embarcados - Sua fonte de informações sobre Sistemas Embarcados

[…] Gerando PWM com a Raspberry PI, artigo escrito por Vinicius Maciel […]

trackback
O que pedir pro papai noel?

[…] Gerando PWM com a Raspberry Pi [13], escrito por Vinicius […]

trackback
Raspberry Pi A+

[…] PWM com a Raspberry PI [19], escrito por Vinicius […]

Flavio Andrade
Membro
Flavio Andrade

kra, post muito interessante e bem explicado....