Mudanças entre as edições de "MCO018703 2018 2 AULA08"
Linha 47: | Linha 47: | ||
conectado no pino PWM 3 do Arduino. | conectado no pino PWM 3 do Arduino. | ||
− | [[imagem:Fig045_MCO018703.jpg| | + | [[imagem:Fig045_MCO018703.jpg|300px|center]] |
Edição das 14h25min de 25 de setembro de 2018
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 (0 ou 1). 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.
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.
/* 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);
}
Portas Analógicas
É possível ler grandezas analógicas com o Arduino, além de valores digitais.
Para isto, existem 6 Portas analógicas para ENTRADA de dados:
- 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.
A função de leitura das portas analógicas é a analogRead( PORTA )
O microcontrolador do Arduino dispõe de um Conversor Analógico-Digital (ADC) de 10 bits, o que significa capacidade de quantificar 1024 patamares de valor: 0 a 1023.
Ou seja, as tensões analógicas de entrada, que devem variar de 0 a 5 V, são quantificadas como:
- 0 - correspondente ao valor de 0 V (GND)
- 1 - correspondente ao valor de 1x(5 V - 0 V)/1024 = 0,0048828125 V
- 2 - correspondente ao valor de 2x(5 V - 0 V)/1024 = 0,009765625 V
- 3 - correspondente ao valor de 3x(5 V - 0 V)/1024 = 0,0146484375 V
- ...
- 1023 - correspondente ao valor de 5 V (VCC)
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).
ADC de 10 bits - 1024 patamares de quantificação.
EXEMPLO 1: Lendo dados de um potenciômetro
1) Esquemático:
Para ler os valores diretamente em Volts:
2) Código fonte:
void setup()
{
Serial.begin(9600);
}
void loop()
{
float valt;
int val = analogRead(0);
valt = (val*5.0)/1023;
Serial.println(valt);
}
EXEMPLO 2: Lendo dados do potenciômetro para temporizar o LED
1) Esquemático:
2) 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);
}
EXEMPLO 3: Lendo um NTC e utilizando a equação de Steinhart-Hart
1) Esquemático:
2) Código fonte (5V):
#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);
}
Referências
[1] https://www.embarcados.com.br/pwm-do-arduino/