Go Down

Topic: Borda de Subida não funciona (Read 288 times) previous topic - next topic

PauloMatos

Estou querendo controlar o brilho de uma lampada usando o Arduino
A questão que queria fazer a interrupção nada borda de subida.
Mudando para RISING a lampada só esta ficando ligada, não variando o brilho. Tem algo de errado com o código?

Quote
#include <TimerOne.h>

#define PINO_PASSAGEM_ZERO 2
#define PINO_SAIDA_LAMPADA 8
#define PINO_BOTAO_MAIS 4

#define DELTA_BRILHO_BTN 10

int brilho = 0;
long tempo_acionamento = 0;
bool travamento_btn_mais = false;

void calcula_tempo(){
  tempo_acionamento = (long)((100 - brilho) * 83.3333);
}

void liga_lampada(){
  digitalWrite(PINO_SAIDA_LAMPADA, HIGH);
  Timer1.detachInterrupt();
 
}
void passagem_zero(){
  if(brilho > 0 && brilho < 100){
    digitalWrite(PINO_SAIDA_LAMPADA, LOW);
    Timer1.attachInterrupt(liga_lampada, tempo_acionamento);
  }
}

void setup() {
  pinMode(PINO_PASSAGEM_ZERO, INPUT);
  pinMode(PINO_BOTAO_MAIS, INPUT);
 
  pinMode(PINO_SAIDA_LAMPADA, OUTPUT);

  calcula_tempo();
 
  //Inicializa o temporizador
  Timer1.initialize();

  //Executa a função passagem_zero na borda de subida
  attachInterrupt(digitalPinToInterrupt(PINO_PASSAGEM_ZERO), passagem_zero, RISING);

}

void loop() {
  if(digitalRead(PINO_BOTAO_MAIS) == HIGH){
    if(travamento_btn_mais == false){
      brilho += DELTA_BRILHO_BTN;
      if(brilho > 90){
        brilho = 100;
        //digitalWrite(PINO_SAIDA_LAMPADA, HIGH);
      }
      calcula_tempo();
      travamento_btn_mais = true;
    }
  }
  else{
    travamento_btn_mais = false;
  }
}

luisilva

Se eu estou a entender bem a sua ideia, se a lâmpada está a ser ligada é porque a o programa está a executar a rotina de interrupção externa, portanto a subida está a ser detectada. Sendo assim, o problema é que a lâmpada não está a ser desligada, ou seja, ou o tempo é muito grande, ou então, a rotina de interrupção do timer não está a ser executada. A minha sugestão é que execute uma depuração enviando para a porta série o valor do tempo de accionamento e/ou fazendo piscar um LED cada vez que entra dentro da rotina de interrupção do timer. Já agora, tem a certeza que o valor de 8.3 segundos está correcto?

PauloMatos

Então.
Meu calculo foi assim.
A frequência da rede é 60Hz
Se consideramos o numero de vez q passa por zero temos 120Hz
Q da 0.00833s
A função Timer1.attachInterrupt tem como entrada o tempo em microsegundos
temos então 8333.33

O Brilho da lampada vai de 0 a 100

tempo = (100 - brilho) /100 * 8333.33 = (100 - brilho) * 83.3333

luisilva

Então.
Meu calculo foi assim.
A frequência da rede é 60Hz
Se consideramos o numero de vez q passa por zero temos 120Hz
Q da 0.00833s
A função Timer1.attachInterrupt tem como entrada o tempo em microsegundos
temos então 8333.33

O Brilho da lampada vai de 0 a 100

tempo = (100 - brilho) /100 * 8333.33 = (100 - brilho) * 83.3333
Certo. O tempo é em microsegundos, não tinha percebido isso.
De qualquer forma o resto mantém-se. Uns LED a piscar quando entra dentro do calback da interrupção externa e da interrupção do timer e fica com uma ideia do que se passa.

bubulindo

Ontem passei algum tempo nisto e acabei por não perceber porque é que a temporização não funcionava.

Dito isto, não olhei com muita atenção ao datasheet nem ao código da Timer1. No entanto, o propósito dessa classe era criar PWM e não usar o temporizador como um temporizador normal... logo não ajuda.
This... is a hobby.

Go Up