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.
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.__________________________________________________________________________________
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 digitasPWM 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-zagwhile (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);}}}}}
__________________________________________________________________________________
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!