PWM, do inglês Pulse Width Modulation, é uma técnica utilizada
por sistemas digitais para variação do valor médio de uma forma de onda
periódica. A técnica consiste em manter a frequência de uma onda
quadrada fixa e variar o tempo que o sinal fica em nível lógico alto.
Esse tempo é chamado de duty cycle, ou seja, o ciclo ativo da forma de onda. No gráfico abaixo são exibidas algumas modulações PWM:
Analisando as formas de onda nota-se que a frequência da forma de onda tem o mesmo valor e varia-se o duty cycle da forma de onda. Quando o duty cicle está em 0% o valor médio da saída encontra-se em 0 V e consequentemente para um duty cycle de 100% a saída assume seu valor máximo, que no caso é 5V. Para um duty cycle de 50% a saída assumirá 50% do valor da tensão, 2,5 V e assim sucessivamente para cada variação do duty cycle.
PWM pode ser usado para diversas aplicações, como por exemplo:
- controle de velocidade de motores;
- variação da luminosidade de leds;
- geração de sinais analógicos (controle da corrente);
- geração de sinais de áudio.
Pinos PWM
A
placa Arduino possue pinos específicos para saídas PWM e que normalmente são indicados pelo caracter ‘~’ na frente de seu número, conforme exibido a
seguir:

indicação dos pinos PWM no Arduino UNO
Os pinos PWM no Arduino UNO e NANO são: 3, 5, 6, 9, 10 e 11.
A resolução de cada pino é de 8 bits, ou seja, valores de 0 a 255 poderão ser utilizados para determinar o duty cycle do pino.
Não é necessário declarar em Setup() o pino a ser utilizado para PWM, basta escrever nele utilizando a função AnalogWrite(), porém a declaração pode ser uma boa prática para a melhor organização do seu Sketch.
Função AnalogWrite()
A função analogWrite()
escreve um valor de PWM em um pino digital que possui a função PWM.
Após a chamada dessa função, o pino passa a operar com uma onda quadrada
de frequência fixa e com duty cycle conforme valor passado
pela função. A frequência dessa onda, na maioria dos pinos é em tordo de
490 Hz, porém, os pinos 5 e 6 da Arduino UNO operam em 980 Hz.
É
interessante notar que as saídas PWM não são conversores
digital-analógico como o nome sugere, e estes pinos não estão
relacionados às entradas analógicas.
A função analogWrite() deve ser utilizada da seguinte forma:
Sintaxe: analogWrite(pino, valor);
Onde:
- pino corresponde ao pino que irá gerar o sinal PWM;
- valor corresponde ao duty cycle, ou seja, o valor que permanecerá em nível alto.O valor deve ser entre 0 e 255 onde com 0 a saída permanece sempre em nível baixo e 255 a saída permanece sempre em nível alto.
Saída Analógica
Arduino UNO, motores DC e ponte H

A onda quadrada representa também um controle da corrente fornecida pelo pino, assim uma saída PWM pode também ser utilizada como saída analógica de corrente.
A limitação da corrente será útil para controlar motores DC por exemplo.
Importante lembrar que um motor não pode ser acionado diretamente da porta do Arduino, é necessário uma ponte H ou outro meio para esse acionamento.
Exemplo
Entre os exemplos originais do Arduino, o programa Fade representa a utilização do PWM para controlar a luminosidade de um LED.
Para tópicos mais avançados, busque por Secrets of Arduino PWM, ou clique aqui.
Vídeo Aula
Exercícios:
1) Crie um Sketch que aumenta a intensidade de um LED sempre que um botão é apertado.
2) Crie um Sketch que utiliza um buzzer para tocar uma música. Mais informação: https://www.arduino.cc/reference/en/language/functions/advanced-io/tone/