Listagem 3.3 - Código para projeto 7 "Lâmpada pulsante"(Arduino Básico-Michael Mcroberts)

Olá pessoal,

Estou com uma dúvida sobre o funcionamento matemático do código abaixo:

// Project 7 - Pulsating lamp
int ledPin = 11;
float sinVal;
int ledVal;

void setup() {
pinMode(ledPin, OUTPUT);
}

void loop() {
for (int x=0; x<180; x++) {
// convert degrees to radians then obtain sin value
sinVal = (sin(x*(3.1412/180)));
ledVal = int(sinVal*255);
analogWrite(ledPin, ledVal);
delay(25);
}
}

de acordo com o livro o resultado de sinVal é um número que varia de -1 a 1 e depois é multiplicado por 255(teoricamente simulando a onda senoidal com valor inicial de acordo com o x=0 e máximo com x=179, ou seja, de 0 a 255 escrito no analogWrite) mas quando faço na calculadora os valores não chegam nem perto.
gostaria de ajuda para entender.
grato.

Exibições: 1118

Responder esta

Respostas a este tópico

Cara, se for faze na calculadora, os valores vão sim variar de -1 a 1(Falando de sinVal) pois supondo que x = 2:
180/3,1412 = 57,302941550999617980389660002547
57,302941550999617980389660002547 * 2 = 114,60588310199923596077932000509
sin(114,60588310199923596077932000509) = ~0,9
0,9 * 255 = 229,5 que pode ser representado em PWM

Realmente se fosse nessa ordem até que seria lógico, se não fosse por 2 fatores.

1º a divisão dentro do parêntese no código é (3,1412/180), o contrário do cálculo que você fez.

2º quando x=2 o valor PWM tem que dar bem próximo de zero pois o "brilho" do LED é diretamente proporcional com seu valor, se o "brilho" do LED já inicia quase no máximo não irá ter o efeito pulsante.

como está no código:

(3,1412/180) = 0,01745111111111111111111111111111

179 * 0,01745111111111111111111111111111 =  3,1237488888888888888888888888889

sin(3,1237488888888888888888888888889) = 0,05449269808741837782958297485007

0,05449269808741837782958297485007 * 255 = 13 (que dá um valor máximo muito baixo e teoricamente o LED não conseguiria dar o efeito de pulso) mas na realidade ele faz o efeito perfeitamente e eu não consigo compreender o por que.

É fácil entender.

O PWM no pino 11 do arduino tem um ciclo de aproximadamente 490 Hz ou seja um período de 2,04081 ms.

A função analogWrite determina o duty cicle do PWM, ou seja, período em que o pino fica em nível 1 e pode variar de 0 a 255 avos do ciclo do PWM, que para o seu exemplo é 13:

2,04081 ms / 255 * 13 = 0,104 ms com o LED aceso e 

2,04081 ms - 0,104 ms  = 1,936 ms com o LED apagado  

A figura abaixo pode te ajudar a entender melhor o funcionamento do PWM:

http://arduino.cc/en/Tutorial/PWM

Abraço.

Grato pela explicação Wiechert,

mas ainda tenho dúvida pois o LED só apaga quando termina o ciclo, como consigo relacionar o Duty cycle com a equação sin(x*(3,1416/180)?

exemplo do LED em operação:

https://www.facebook.com/photo.php?v=568914646534910&set=vb.100... 

a sensação é que ela realmente acompanha uma onda senoidal que sai do zero chega ao topo e desce.

Abraço.

Como relacionar o Duty cycle com a equação sin(x*(3,1412/180)?

O semiciclo positivo de uma senoide corresponde ao período dos ângulos entre 0° e 180°, o semiciclo negativo corresponde ao período dos ângulos entre 180° e 360°, mas este não é usado por causa de serem números negativos.

A equação sinVal=sin(x*(3,1412/180) calcula o seno do angulo (x varia de 0 a 179) sinVal varia de 0 (em 0°, x=0) aumentando até 1 (em 90°, x=90) e diminui novamente até 0 (em 180° x=180), portanto, sinVal é igual ao seno do angulo x, ok até aqui?

A equação ledVal=int(sinVal*255) calcula o duty cycle do PWM em função do seno do angulo de x (sinVal). Como a função seno varia entre 0 e 1, os valores do ledVal estarão compreendidos entre 0 e 255, ou seja a equação normaliza o PWM em função do angulo de x que é uma função senoidal.

O delay no final do for faz com que possamos observar cada variação no duty cycle, gerando uma base de tempo para cada angulo, o programa calcula o duty cycle para o angulo x, ajusta o PWM e aguarda 25ms, depois calcula novamente o duty para o próximo valor de x até o fim do for.

O duty cycle do PWM realmente acompanha o valor da senoide, como mostra o gráfico abaixo:

Se quiser conferir, segue a planilha com os valores das equações em Excel.

Abraço.

Anexos

Wiechert muito obrigado!
Entendi finalmente.
Abraço.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço