MCO018703 2018 2 AULA08

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar

PWM no Arduino

Na aula anterior falamos que os Pinos Digitais são usados para detecção ou transmissão de controles digitais, normalmente associados aos sinais HIGH ou LOW (1 ou 0). Mas alguns pinos podem também gerar um sinal analógico com a função analogWrite() utilizando a técnica de modulação chamada PWM.

Mas o que é PWM?

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. A figura abaixo mostra o gráfico onde são exibidas algum exemplos de modulações PWM.


Fig044 MCO018703.jpg

Fonte: http://arduino.cc/en/Tutorial/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 no duty cycle. Portanto, para calcular o valor médio da tensão de saída de um sinal PWM pode-se utilizar a seguinte equação:



Onde:

Vout - tensão de saída em V;
duty cycle - valor do ciclo ativo do PWM em %;
Vcc - tensão de alimentação em V.


PWM pode ser usada para diversas aplicações, como por exemplo:

controle de velocidade de motores;
variação da luminosidade de leds;
geração de sinais analógicos;
geração de sinais de áudio.

O Arduino Uno assim como o Diecimila possui 6 pinos PWM (3,5,6,9,10,11). Sendo que a função analogWrite(), escreve um valor de PWM em um pino digital somente se possuir 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 torno de 490 Hz, porém, os pinos 5 e 6 da Arduino UNO operam em 980 Hz. Para utilizar a função analogWrite(), deve-se configurar o pino correspondente como saída digital. É interessante notar que essas saídas não são conversores digital-analógico como o nome sugere, e estes pinos não estão relacionados às entradas analógicas.

Exemplo

Abaixo vemos o circuito com exemplo de um programa em Arduino que aumenta e diminui gradativamente o brilho de um LED conectado no pino PWM 3 do Arduino.

Esquemático
Fig045 MCO018703.jpg
Código
/* Esse programa escrito em C do Arduino aumenta e diminui gradativamente o brilho de um LED 
conectado no pino PWM 3 do Arduino. */
int i=0;  // declaração da variável global inteira i iniciada com 0
void ledOn( );  // declaração da função criada ledOn do tipo void
void setup( )  
{
   pinMode(3,OUTPUT); // aqui 2 parâmetros são passados à função pinMode( )
}
void loop( ) 
{
   for (i=0; i <= 255; i++) ledOn( ); // aumenta o brilho do led
   for (i=255; i >= 0; i--) ledOn( ); // diminui o brilho do led
}
void ledOn( ) // função que acende o led
{  
   analogWrite (3, i); // o nº do pino e o valor de i são passados à função analogWrite( )
   delay (10);      
}
Exemplo 2
void setup() {
  // put your setup code here, to run once:
    pinMode(5,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  analogWrite (5, 64); // 25%
  delay(1000);
  analogWrite (5, 127); // 50%
  delay(1000);
  analogWrite (5, 191); // 75%
  delay(1000);
  analogWrite (5, 255);   // 100%
  delay(1000);
}

Portas Analógicas

As entradas digitais só podem assumir dois estados, HIGH e LOW, ou seja, 0 V ou 5 V. Dessa forma só é possível ler apenas dois estados. Por exemplo, verificar se uma porta está aberta ou fechada, identificar se um botão está pressionado ou solto. Com as entradas digitais você aplica em lógica discreta para controle de seus projetos, porém em muitas situações a variação das grandezas envolvidas acontece de forma analógica. Ou seja, variam continuamente em relação ao tempo e podem assumir infinitos valores dentro de uma faixa. Como exemplo a temperatura, luminosidade, pressão e umidade são grandezas que variam dessa forma.

O microcontrolador Arduino trabalha internamente com dados digitais, portanto é necessário traduzir um sinal analógico para um valor digital. A técnica utilizada para leitura de um sinal analógico pelo Arduino é a conversão analógica digital. Essa técnica consiste em converter o sinal analógico para um valor digital, dessa forma se pode quantificar o sinal presente no pino. Esse processo é feito pelo conversor Analógico digital, ADC ou conversor A/D.

Um conversor A/D quantifica o valor analógico conforme a quantidade de bits da sua resolução. A resolução de um conversor A/D é dada pela seguinte equação:

onde:

Vref - tensão de referência do conversor A/D;
n - número de bits do conversor.


Conversor A/D do Arduino

O conversor A/D do microcontrolador ATmega328 possui 10 bits de resolução, a sua tensão de entrada pode variar de 0 V até o valor de VCC.

Resolução = 5 V/1024 = 4,88 mV

Esse é o valor de degrau para uma conversão em 10 bits com referência em 5 V.

A placa Arduino UNO possui 6 canais de conversor analógico digital. Essas entradas são nomeadas de A0 a A5:

A0 (pino 14),
A1 (pino 15),
A2 (pino 16),
A3 (pino 17),
A4 (pino 18) e
A5 (pino 19).

Não é necessário definir-se na função setup( ) se as portas serão usadas como entrada, ou saída.


Funções para Entradas Analógicas

A plataforma Arduino possui duas funções para trabalhar com entradas analógicas, que configuram os registradores do conversor A/D, assim como selecionam o canal conforme o pino passado como parâmetro.

analogReference(tipo)


Configura a referência de tensão para a conversão analógica/digital, usando esse valor como o máximo para a entrada analógica.

Os tipos possíveis parâmetros de configurações (tipo) são:

DEFAULT: a tensão padrão para conversão é a tensão de alimentação da placa. 5 V para placas alimentadas com 5 V e 3,3 V para placas alimentadas com 3,3 V;
INTERNAL: referência interna de 1,1V no Atmega168 e Atmega328, e 2,56 V no ATmega8;
INTERNAL1V1: referência de 1,1V, apenas no Arduino Mega;
INTERNAL2V56: referência interna de 5,6 V, apenas no Arduino Mega;
EXTERNAL: referência de tensão aplicada no pino AREF (valor entre 0 e 5V).


int analogRead(pino)


Lê o valor presente em um pino configurado como entrada analógica. Internamente o Arduino possui um conversor A/D de 10 bits. Dessa forma o valor retornado por esta função estará na faixa de 0 a 1023 conforme o valor presente no pino.


O tempo para leitura pela função analogRead() é por volta de 100us, dessa forma a máxima frequência de leitura que se pode ter é de 10kHz.


O programador deve saber como interpretar o número digital da conversão. Desta forma, podem ser lidos os mais variados sensores, desde que eles gerem um sinal de tensão de até 5V (limite permitido).

Fig026 MCO18703.jpg

ADC de 10 bits - 1024 patamares de quantificação.

EXEMPLO 1: Lendo dados de um potenciômetro

Esquemático
Fig027 MCO18703.jpg

Para ler os valores diretamente em Volts:

Código fonte
void setup()
{ 
   Serial.begin(9600);
}
 
void loop()
{ 
    float valor;
    int val = analogRead(0);
 
    valor = (val*5.0)/1023;
 
    Serial.println(valor);
}

EXEMPLO 2: Lendo dados do potenciômetro para temporizar o LED

Esquemático


Fig028 MCO18703.jpg


Código fonte
const int led=6;

void setup()
{
   pinMode(led, OUTPUT);
   Serial.begin(9600);
}

void loop()
{
   int val=analogRead(0);
   Serial.println(val);
   digitalWrite(led, HIGH);
   delay(val);
   digitalWrite(led, LOW);
   delay(val);
}

Termistor NTC

Termistor é um tipo de componente eletrônico que tem sua resistência elétrica alterada termicamente, ou seja, apresentam um valor de resistência para cada temperatura absoluta. A Figura abaixo mostra a foto de um termistor.


Fig046 MCO18703.jpg

Fonte: [3]


Os Termistores comumente são utilizados para controlar ou alterar a temperatura em dispositivos eletrônicos. Há duas categorias de termistores: PTC, que aumenta sensivelmente sua resistência elétrica com o aumento da temperatura e o NTC, que diminui sensivelmente a resistência elétrica com o aumento da temperatura. Vale ressaltar que Termistores não são polarizados. A Figura abaixo mostra a curva característica de resposta de NTC de 10k omhs.


Fig047 MCO18703.jpg

Fonte: [4]


Em destaque no gráfico, encontra-se o valor da resistência de 10k quando a temperaturo é de 25°C. Quando a temperatura cai a resistência aumenta e quando a temperatura sobe a resistência cai.


Especificações e características
– Tensão de operação: 3,3 ou 5V
– Faixa de medição: -55°C a 125° Celsius
– Precisão: ±1%
– Dissipação típica constante: 2mW/° Celsius
Aplicações

Projetos com finalidade de medir temperatura ambiente utilizando Arduino ou outras plataformas microcontroladas.




EXEMPLO 3: Lendo um NTC

Utilizar o Termistor NTC 10k em conjunto com resistor de 10k no Arduino e medir a temperatura ambiente. O valor da temperatura será exibido no monitor serial do ambiente de programação do Arduino.


Esquemático
Fig048 MCO18703.jpg


Código fonte (utilizando biblioteca do Arduino)
#include <Thermistor.h>

Thermistor temp(0); 

void setup() {
    Serial.begin(9600);
}
void loop() {
    int temperature = temp.getTemp();
    Serial.print("Temperatura: ");
    Serial.print(temperature);
    Serial.println("°C");
    delay(1000);
}


Código fonte (Equação Steinhart-Hart)
#include <math.h>

const int sensor = A0;

double tempCelsius(int valorNTC)
{
   double temp;

   temp = log(((10240000/valorNTC)-10000)); // para NTC de 10k
   temp = 1/(0.001129148+(0.000234125+(0.0000000876741*temp*temp))*temp);

   temp=temp-273.15; // Coonverte Kelvin para Cesius
   
   return temp;
}

void setup()
{
    Serial.begin(9600);
}

void loop()
{
   int valor=analogRead(sensor);
   double c=tempCelsius(valor);
   Serial.println(valor);
   Serial.println(c);
   delay(250);
}

Sensor LDR

Um LDR (Resistor Dependente da Luz) é um tipo especial de resistor que apresenta uma mudança em sua característica de resistência elétrica quando submetido à ação da luz. Também chamados de fotorresistores, apresentam um valor de resistência elevada em um ambiente escuro, e quando expostos à luz, têm a condutividade aumentada. Ou seja, oferecem baixa resistência elétrica quando iluminados. A Figura abaixo mostra um LDR de 5mm.


Fig034 MCO018703.png

Figura - LDR Sensor de luminosidade. [6]


Os LDRs são fabricados com materiais de alta resistência, como por exemplo o Sulfeto de Cádmio (CdS) ou o Sulfeto de Chumbo (PbS). Esses materiais possuem poucos elétrons livres quando colocados em ambiente escuro, e liberam elétrons quando há incidência de luz sobre eles, aumentando sua condutividade. Chamamos a esse efeito de Fotocondutividade.

Quando cessa a incidência de luz sobre o componente, os elétrons retornam à camada de valência e a resistência do material volta a aumentar.

No geral, os LDRs possuem resistências entre 1 MΩ e 10 MΩ no quando em ambiente escuro, e resistências que podem chegar a menos de 100 Ω quando iluminados.

Alguns LDRs são projetados para responder em luz infravermelha (como os de Sulfto de Chumbo - PbS) ou ainda em luz ultravioleta. Abaixo é mostrado o circuito básico do divisor de tensão para ser lido pelo pino A0 do Arduíno. Abaixo vemos o circuito elétrico do LDR de 10kΩ em série com um resistor de 10kΩ.


Fig035 MCO018703.png

Figura - Circuito elétrico do divisor de tensão do LDR e resistor de 10kΩ.

Esquemático
Fig049 MCO18703.jpg


Código fonte


const int sensor=A0;

void setup()
{
    Serial.begin(9600);
}
 
void loop()
{
   int valor=analogRead(sensor);
   Serial.println(valor);
}
Desafio
Alterar o circuito, também o código fonte de modo a adicionar um LED ao circuito para simular a acendimento das luzes quando o valor lido do LDR indicar que está escuro suficiente.

Referências

[1] https://www.embarcados.com.br/pwm-do-arduino/

[2] https://www.embarcados.com.br/arduino-entradas-analogicas/

[3] http://blogmasterwalkershop.com.br/arduino/como-usar-com-arduino-termistor-ntc-10k-sensor-de-temperatura/

[4] http://squids.com.br/arduino/index.php/projetos-arduino/projetos-squids/basico/153-projeto-41-usando-o-sensor-de-temperatura-termistor-ntc-10k-com-lcd

[5] https://www.filipeflop.com/produto/sensor-de-luminosidade-ldr-5mm/

[6] https://portal.vidadesilicio.com.br/sensor-de-luz-com-ldr/


Icone voltar.png Icone menu.png Icone prox.png