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

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.