PWM: emulando pinos analógicos com sua placa Arduino

Sinais PWM

Com os pinos digitais e analógicos, que você pode usar em sua placa Arduino, você pode receber ou enviar sinais elétricos para controlar ou obter dados de seus projetos eletrônicos. Além disso, existem outros sinais muito interessantes neste tipo de placa, e esses são os PWM, que pode emular um sinal analógico sem realmente ser analógico. Ou seja, são pinos digitais que podem atuar de maneira semelhante (não igual) a um sinal analógico.

Esses tipos de sinais são muito práticos para quando você não deseja apenas usar sinais digitais HIGH e LOW, ou seja, 1 ou 0, ON e OFF, mas deseja ir além e descrever sinais um pouco mais complexos. Por exemplo, é possível modular a velocidade de um Motor DC, ou a intensidade da luz de uma luz, para um solenóide, etc.

Sistema analógico x digital

Sinal analógico vs digital

Os circuitos eletrônicos podem ser divididos em duas grandes famílias ou categorias: digital e analógico. Quando falamos em eletrônica digital, estamos utilizando grandezas com valores discretos, ou seja, um sistema binário representado por sinais elétricos de baixa ou alta tensão para interpretar o estado dos bits que são manipulados. Por outro lado, quando se trata de um circuito analógico, estão sendo utilizadas grandezas com valores contínuos.

Dentro dos sistemas digitais podem ser encontrados por sua vez aqueles do tipo combinacional e aqueles do tipo sequencial. Ou seja, os primeiros são aqueles em que a saída do sistema depende apenas do estado das entradas. Já nas sequenciais, são incluídos elementos de memória, e a saída dependerá do estado atual das entradas e do estado anterior armazenado.

No caso dos análogos não existem esses dois grandes grupos ou variantes, pois aqui são sinais contínuos que sempre dependerão de la senhor sistema atual. Por exemplo, em um alto-falante, o sinal que é fornecido a ele dependerá do som que você deseja reproduzir. O mesmo acontece com um microfone, que irá gerar um sinal analógico dependendo do som que está recebendo. Certamente você também viu isso com muitos outros sensores que descrevemos neste blog e que atuam com sinais analógicos (e portanto, uma fórmula teve que ser criada para que posteriormente os valores pudessem ser calculados ou condicionados nos esboços do IDE do Arduino ) ...

Essas características de um e do outro fazem com que alguns tenham seus próprios vantagens e desvantagens, como é comum em quase tudo. Por exemplo, os digitais costumam ser mais baratos, mais rápidos, mais fáceis de desenvolver, as informações podem ser armazenadas com mais facilidade, têm maior precisão, podem ser programados, não são tão vulneráveis ​​aos efeitos do ruído, etc. Mas também é verdade que com analógicos você pode operar com sinais mais complexos.

Por exemplo, um sensor de efeito Hall do tipo digital só pode detectar a presença ou ausência de um campo magnético próximo. Em vez disso, um sensor de efeito Hall analógico pode fazer isso e também determinar a densidade do referido campo magnético graças a um sinal analógico que ele gera em sua saída. Sabendo interpretar bem aquele sinal de maior ou menor voltagem, você pode facilmente conhecer essa magnitude. Você tem outros exemplos em uma infinidade de magnitudes da natureza que você pode medir quantitativamente com um sistema analógico, como temperatura, tempo, pressão, distância, som, etc.

Sinal analógico vs digital

Dito isto, um sinal analógico Será uma tensão ou corrente elétrica que varia com o tempo e continuamente. Se representado graficamente, o sinal analógico seria uma onda senoidal de frequência única.

Quanto à sinal digital, é uma tensão que varia de forma gradativa com relação ao tempo. Ou seja, se for representado em um gráfico, será um sinal de degrau que não varia continuamente, mas muda em degraus ou incrementos discretos.

Você deve saber que existem circuitos para ir de um sinal analógico para um digital ou vice-versa. Esses conversores eles são conhecidos como DAC (conversor digital para analógico) e ADC (conversor analógico para digital). E são muito comuns em muitos dispositivos que usamos hoje, como TV, computadores, etc. Com eles você pode converter os sinais digitais usados ​​por esses equipamentos para um nível eletrônico para trabalhar com outros periféricos ou peças que funcionam em analógico.

Por exemplo, um alto-falante ou microfone com sinais analógicos que funcionam com placa de som, ou placas gráficas digitais que possuíam o famoso chip RAMDAC para as portas de monitor analógico ... No Arduino este tipo de conversores também são usados ​​para vários projetos, como veremos ...

O que é PWM?

ciclo de trabalho gráfico

Embora PWM (modulação por largura de pulso), ou modulação por largura de pulso, tem uma base digital, a forma de seu sinal se assemelha a um sinal analógico um tanto "quadrado". Permite por meio de pulsos digitais variar o sinal para emular um sistema analógico como já comentei anteriormente. Na verdade, se você olhar o nome, já dá pistas do que faz, através da largura dos pulsos digitais.

Isso é benéfico para Arduino uma vez que existem muitos automatismos ou componentes eletrônicos que você pode adicionar aos seus projetos e que não são capazes de fornecer um verdadeiro sinal analógico, mas eles usam esse PWM para operar. Tampouco podem usar um sinal analógico discretizado, ou seja, que passa por saltos de tensão para se parecer com um digital. O que eles podem fazer é usar uma saída digital -Vcc ou Vcc do tipo digital para gerar este sinal peculiar ...

Portanto, PWM é uma espécie de "truque" com o qual o Arduino e outros sistemas podem interoperar com este tipo de sinais que eles não são totalmente analógicos nem digitais convencionais. Para isso, eles mantêm uma saída digital ativa por um determinado tempo ou desligada, dependendo do interesse em todos os momentos. Isso está longe de ser um relógio digital ou sinal de código binário, cujos pulsos têm a mesma largura.

Em seus projetos com o Arduino, você pode verificar este tipo de sinais PWM nos quais uma frequência constante de gatilhos de pulso é mantida ao longo do tempo, mas a largura desses pulsos é variada. Na verdade, é chamado de Ciclo de Trabalho quando um sinal é mantido alto em relação ao total do ciclo. Portanto, o Ciclo de Trabalho é dado em%.

Lembre-se que em um PWM você não trabalha como em um sinal analógico, entre vários valores de tensão e oscila entre eles. No caso do PWM é um sinal quadrado no estilo digital e cujo valor máximo é Vcc. Por exemplo, se você trabalha com uma fonte de alimentação de 3 V, pode fornecer pulsos de 3 V ou 0 V, mas não 1 V ou qualquer outro valor intermediário como ocorreria em um analógico real. O que variaria nesse caso é a largura do pulso, que podemos manter 30% naquele valor Vcc alto, ou 60% para dar mais potência, etc.

Mas tenha cuidado, porque se um dispositivo suportar um limite Vcc e for excedido com PWM, ele pode ser danificado. Portanto, seria sempre necessário respeitar os valores das fichas fornecidas pelos fabricantes. Além disso, em alguns dispositivos, como motores DC, relés, eletroímãs, etc., uma retirada de tensão após um ciclo de trabalho pode significar que cargas indutivas podem causar danos. É por isso que proteções oportuno.

PWM no Arduino

Barramento Arduino I2C

Agora que você sabe como funciona, vamos ver o caso específico do PWM no mundo do Arduino ...

PWM: pinagem no Arduino

Nas placas Arduino, você pode encontrar vários pinos que implementam PWM de hardware. Você pode identificá-los no próprio PCB porque eles têm um símbolo ~ (cabeça pequena) junto com a numeração do pino. Também poderia ser feito por software no código do Arduino, mas isso sobrecarregaria o microcontrolador de trabalho, algo absurdo quando pode ser feito nativamente e por hardware ...

  • Arduino UNO, Mini e Nano- Você tem 6 saídas PWM de 8 bits nos pinos 3, 5, 6, 9, 10 e 11, que terão esse ~ bem na frente do número.
  • Arduino Mega- Nesta placa Arduino mais poderosa, você tem 15 saídas PWM de 8 bits. Eles estão nos pinos 2 a 13 e 44 a 46.
  • Arduino devido: neste caso, existem 13 saídas PWM de 8 bits. Eles estão nos pinos 2 a 13, mais duas outras saídas analógicas discretizadas por DAC com resolução de 12 bits.

Quando você fala em resolução de 8 bits ou 12 bits, etc., neste tipo de saídas PWM, você está se referindo à margem de manobra que você tem. Com 8 bits têm 256 níveis Entre os quais você pode variar, e os 12 bits vão até 4096 níveis.

Controle com temporizadores

Para controle de hardware PWM, Arduino vai usar os temporizadores para isso. Cada Timer presente pode servir 2 ou 3 saídas PWM. Um registro de comparação para cada saída complementa este sistema de forma que quando o tempo atinge o valor do registro, o estado ou valor da saída é alterado para interromper aqueles Ciclos de Trabalho. Embora existam duas saídas controladas pelo mesmo Timer, ambas podem ter Ciclos de Trabalho diferentes, embora compartilhem a mesma frequência.

No caso dos temporizadores associados a cada pino PWM, isso irá variar dependendo do tipo de placa Arduino que tenha:

  • Arduino UNO, Mini e Nano:
    • Temporizador 0 - 5 e 6
    • Temporizador 1 - 9 e 10
    • Temporizador 2 - 3 e 11
  • Arduino Mega:
    • Temporizador 0 - 4 e 13
    • Temporizador 1 - 11 e 12
    • Temporizador 2 - 9 e 10
    • Temporizador 3 - 2, 3 e 5
    • Temporizador 4 - 6, 7 e 8
    • Temporizador 5 - 44, 45 e 46

O registro pré-escalado dividirá o tempo por um inteiro e o Timer fará o resto para controlar cada uma das saídas PWM associadas. Modificar o valor do registro pode alterar a frequência. As frequências Eles também serão diferentes dependendo do temporizador e da placa:

  • Arduino UNO, Mini e Nano:
    • Timer0: permite pré-escalonamento de 1, 8, 64, 256 e 1024. A frequência é 62.5 Khz.
    • Timer1: com pré-escalonado 1, 8, 64, 256 e 1024. Com uma frequência de 31.25 Khz.
    • Timer2: igual a Timer1, só que adiciona uma pré-escala de 32 e 128 além das anteriores.
  • Arduino Mega:
    • Timer0, 1, 2: igual ao anterior.
    • Temporizador 3, 4 e 5: com frequência de 31.25 Khz e pré-escalonado de 1, 8, 64, 256 e 1024.

Incompatibilidades e conflitos

The Timer associado com as saídas não é apenas para essa função, também é usado por outros. Portanto, se eles estão sendo usados ​​por outra função, você deve escolher entre um ou outro, você não pode usar os dois ao mesmo tempo. Por exemplo, estas são algumas das incompatibilidades que você pode encontrar em seus projetos:

  • Biblioteca Servo: Quando você usa servo motores, os temporizadores são usados ​​intensamente, o que pode levar a conflitos. Use especificamente Timer1 para UNO, Nano e Mini, ou seja, você não pode usar os pinos 9 e 10 enquanto estiver usando um esboço com aquela biblioteca. No Mega vai depender da quantidade de servos ...
  • SPI: Se a comunicação SPI for usada na placa Arduino, o pino 11 está sendo usado para a função MOSI. É por isso que o pino PWM não pode ser usado.
  • Tom: esta função usa Timer2 para operar. Portanto, se for usado, você tornará os pinos 3 e 11 (ou 9 e 10 para Mega) inúteis.

Teste prático com Arduino

Esquema Arduino PWM com LED

Se você quiser ver no local como o PWM funciona no Arduino, a melhor coisa a fazer é conectar os cabos de medição de um voltímetro ou multímetro (em função de medir a tensão) entre o pino PWM que você escolheu usar e o pino de aterramento ou GND da placa Arduino. Desta forma, na tela do dispositivo de medição você poderá ver como a tensão está mudando com uma saída que é digital graças a este truque PWM.

Você pode substituir o voltímetro / multímetro por um LED para ver como a intensidade da luz varia, por um motor DC ou por qualquer outro elemento que você queira. Simplifiquei no diagrama com o Fritzing com um LED sem mais, mas você sabe que também pode representar as pontas de um multímetro ...

Se você usar um LED, lembre-se da resistência no cátodo e no GND.

Pára o código fonte Para controlar o microcontrolador da placa Arduino e fazer tudo funcionar, você deve inseri-lo no IDE do Arduino (neste caso, usei o pino 6 do PWM Arduino UNO):

const int analogOutPin = 6;
byte outputValue = 0;  
 
void setup()
{  
   Serial.begin(9600);        
   pinMode(ledPIN , OUTPUT); 
 
   bitSet(DDRB, 5);       // LED o voltímetro
   bitSet(PCICR, PCIE0);       
   bitSet(PCMSK0, PCINT3);     
}
 
void loop() 
{
   if (Serial.available()>0)  
   {
      if(outputValue >= '0' && outputValue <= '9')
      {
         outputValue = Serial.read();   // Leemos la opción
         outputValue -= '0';      // Restamos '0' para convertir a un número
         outputValue *= 25;      // Multiplicamos x25 para pasar a una escala 0 a 250
         analogWrite(ledPIN , outputValue);
      }
   }
}  
 
ISR(PCINT0_vect)
{
   if(bitRead(PINB, 3))
   { 
      bitSet(PORTB, 5);   // LED on 
   }
   else
   { 
      bitClear(PORTB, 5); // LED off  
   } 
} 
Aconselho você a brincar com os valores e ver os resultados na luz ou voltímetro. O programa pode receber valores de 0 a 9 para que você veja como tudo varia. Para mais informações, aconselho o curso do arduino que temos em download gratuito ...

Um comentário deixe o seu

Deixe um comentário

Seu endereço de email não será publicado. Campos obrigatórios são marcados com *

*

*

  1. Responsável pelos dados: Miguel Ángel Gatón
  2. Finalidade dos dados: Controle de SPAM, gerenciamento de comentários.
  3. Legitimação: Seu consentimento
  4. Comunicação de dados: Os dados não serão comunicados a terceiros, exceto por obrigação legal.
  5. Armazenamento de dados: banco de dados hospedado pela Occentus Networks (UE)
  6. Direitos: A qualquer momento você pode limitar, recuperar e excluir suas informações.

      Jose dito

    Olá, bom dia. Em primeiro lugar quero agradecer pelo tempo dedicado a esta explicação para o mais novo.
    Eu gostaria de lhe fazer uma pergunta. Estou tentando executar o código em um emulador proteus 8 para Arguino Mega. Eu conecto um voltímetro no pino 6, Proteus está conectado a uma porta serial, mas não sei como ou o que variar para que diferentes tensões sejam emitidas. Tive que fazer pequenos ajustes no código para compilá-lo. Muito obrigado por sua ajuda