sábado, 28 de julho de 2012

Utilizando o PWM no Netduino


Agora que eu tranquei o mestrado to tento alguns meses para escrever mais no blog e utilizar a placa do Netduino direito e uma das coisas que me deixaram bem feliz foi a permanência de PWM em hardware que, a pesar do Netduino não conseguir temporizar em microsegundos, o PWM do hardware vai nesse nível, o que é bem interessante dependendo da aplicação.

O PWM (Pulse-Width Modulation) que siginifica em português modulação por largura de pulso (MLP) trata-se de um sinal modulado em função de sua razão cíclica (duty cycle) para transportar qualquer informação sobre um canal de comunicação ou controlar o valor da alimentação entregue a carga.
Do site http://aquaticus.info

É comum encontrar comunicação entre dispositivos feita por PWM. Nestes casos a largura dos pulsos corresponde a valores de dados específicos codificados a um fim e decodificou ao outro.  Pulsos de largura variadas será enviada em intervalos regulares, isso acontece especialmente quando o sinal é analógico como um sinal de um controlador.

Outra aplicação muito comum - e uma das minhas preferidas -  é a construção de ondas senoidais para  transferência de potência entregue a uma carga, ou seja, conversores estáticos senoidais. Em um sistema controlado a disparo o pulso PWM atua sobre chaves de estado sólido (normalmente IGBT, MOSFET, GTO, transistor bipolar) tendo como efeito final o controle do fluxo de corrente dentro dos estados de corte e condução da chave. Com uma frequência elevada, filtros passivos RLC são podem ser utilizados para suavizar o trem de pulsos das chaves e prover o aspecto final - processo de integração passiva do sinal de potência. Esse método é normalmente empregado no controle de velocidade de motores de corrente contínua, e esse é uma aplicação que pretendo demonstrar controlado um carrinho autônomo.

Outras aplicações mais modestas como dimmers de luz comuns também podem ser feitos utilizando essa técnica onde a modulação é feita sobre a própria corrente alternada (CA) através dos convencionais TRAIC's . Um simples ajuste na quantidade de luminosidade pode ser implementado estabelecendo-se a que tensão do ciclo CA o dimmer começa a conduzir a eletricidade à lâmpada, claro que isso está ficando mais raro porque as lâmpadas fluorecentes, que hoje dominam o mercado, não aceitam bem esse tipo de técnica de dimerização. Como o ciclo ativo da modulação é o mesmo que a frequência de 60Hz (no Brasil), o olho humano percebe apenas a intensidade média.

Agora vamos ao código n

o Netduino. Diferente de um microcontrolador convencional onde dezenas de registros devem ser configurados ao estilo Indiana Jones o Netduino isso pode ser feito com apenas 2 linhas de comando, criando o objeto e depois setando o PWM.


__________________________________________________________________________________
using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;

namespace MotorControl_01
{
    public class Program
    {

        public const UInt32  PWMSTEP  = 200 ;

        public static void Main()
        {
            // As portas PWM disponíves são os pinos digitas
            PWM motor1 = new PWM(Pins.GPIO_PIN_D5);
            //PWM motor1 = new PWM(Pins.GPIO_PIN_D6);
            //PWM motor1 = new PWM(Pins.GPIO_PIN_D9);
            //PWM motor1 = new PWM(Pins.GPIO_PIN_D10);

            //Fazendo uma Inicialização da placa (para saber se está funcionando ok!)
            OutputPort board_led = new OutputPort(Pins.ONBOARD_LED, false);

            for (uint j = 0; j < 10; j++)
            {
                //Pisca o Led da placa para dar um sinal
                //que está vivo!
                board_led.Write(!board_led.Read());
                Thread.Sleep(200);
             }


            //Fazendo o PWM aumentar e diminuir em
            //Zig-e-zag
            while (true)
            {
                uint i = 0;
                for (i = 0; i < PWMSTEP; i++)
                {
                    //a função: SetPulse( tempo_pulso [us], tempo_ativo [us])
                    motor1.SetPulse(2000, i * 10);
                    //Espera 50 [ms]
                    Thread.Sleep(50);
                }

                for (i = 0; i < PWMSTEP; i++)
                {
                    motor1.SetPulse(2000, (PWMSTEP - i) * 10);
                    Thread.Sleep(50);
                }
            }
           
        }

    }
}
__________________________________________________________________________________
Tive duas dificuldade porque não estava encontrado informação e documentação como sempre... A primeira foi descobrir qual a unidade dos tempos que devem ser colocados no SetPulse(period ,duration) porque não diz em lugar nenhum - mas como sempre alguém já teve o mesmo problema - não foi difícil descobrir no fórum do Netduino. As duas unidades estão em microssegundos.


A segunda dificuldade que eu tive foi em descobrir porque eu não podia setar o pino D0 como PWM. a partir daí eu comecei a investigar pelo datasheet do AT91SMA7X512, mas o que salvou mesmo foi o esquemático. Observe que os pinos I/O/PWM são apenas os pinos D5, D6, D9 e D10.



Tratei de fazer um vídeo (house made) mostrando como foi que funcionou.




O circuito que eu fiz para ligar a lâmpada foi bem simples: um transistor que tinha aqui NPN com 10k na base e um resistor de 10k no coletor com um N-MOSFET em cascata com o gate ligado no coletor do transistor. A lâmpada foi uma lampada simples de carro mesmo.


Espero que o post tenha ajudado - se quiser o código pode fazer download do projeto aqui!

Nenhum comentário:

Postar um comentário