collapse

* Links de Robótica

* Posts Recentes

Feira de electricidade e eletrónica por artur36
[Ontem às 23:07]


Power_OK Enermax por almamater
[Ontem às 12:10]


Recomendação de um opamp para um DAC r2r por jm_araujo
[23 de Novembro de 2017, 10:48]


RN42 e TP-Link MR3020 por doiga
[22 de Novembro de 2017, 19:22]


Ajuda Projecto IR / RF por senso
[22 de Novembro de 2017, 13:15]


Ideias para construir um quadrúpede simples por dropes
[21 de Novembro de 2017, 22:43]


Ajuda com TRIAC por senso
[17 de Novembro de 2017, 18:00]


TV LG White Screen por almamater
[15 de Novembro de 2017, 08:37]


Pergunta sobre prototipagem ( Pesquisa ) por luisjustin
[14 de Novembro de 2017, 23:22]


Medir Agua que está no Poço por Njay
[14 de Novembro de 2017, 13:28]

Autor Tópico: duvida em fast PWM  (Lida 1661 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
duvida em fast PWM
« em: 19 de Maio de 2011, 17:37 »
boas

estou a tentar diminuir a luminosidade de um led com fast PWM num attiny25, o que acontece é que o led nunca chega a apagar completamente quando o a instrução deixa de ser verdadeira, alguém me sabe dizer onde é que está o erro?

Código: [Seleccione]
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
OCR0A = 255;
TCCR0A = (1<<COM0A1) | (1<<WGM01) | (1<<WGM00);
TCCR0B = (1<<CS01);
DDRB |= (1<<PB0);

while(OCR0A > 0)
{
_delay_ms(10);
OCR0A--;
}
}


Offline msr

  • Mini Robot
  • *
  • Mensagens: 795
Re: duvida em fast PWM
« Responder #1 em: 19 de Maio de 2011, 18:24 »
Quando a condição deixa de ser verdadeira (OCR0A > 0) pões logo o PWM ao máximo (OCR0A = 255;), nem sequer existe o delay de 10ms. Isto porque quando ele sai do ciclo while o MCU faz um reset e volta a correr o programa.

Experimenta por um while(1); a seguir ao teu ciclo while para ver se o LED não fica permanentemente apagado.

De qualquer das maneiras valores baixos (proximos de zero) do duty cycle já deveriam dar para ver o LED apagado...


Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: duvida em fast PWM
« Responder #2 em: 19 de Maio de 2011, 18:33 »
não, neste caso quando a condição deixa de ser verdadeira pára, se a condição for while(OCR0A >= 0) é que reinicia...

de qualquer maneira já testei o código seguinte e é igual, não desliga completamente:

Código: [Seleccione]
while(1)
{
OCR0A = 0;
}

tenho que ir ler melhor a datasheet para ver se é algum register mal definido...

Offline msr

  • Mini Robot
  • *
  • Mensagens: 795
Re: duvida em fast PWM
« Responder #3 em: 19 de Maio de 2011, 18:40 »
Nos PICs quando o programa atinge o fim do código é feito reset automaticamente. Nos AVRs não?

Mas realmente se lhe pões OCR0A=0; deveria desligar...
Tens o ânodo do LED ligado directamente à saída do PWM ou estás usar algum transistor como switch?

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: duvida em fast PWM
« Responder #4 em: 19 de Maio de 2011, 18:42 »
apenas uma resistência para limitar a corrente, 1k, era o que tinha à mão...

se o loop for infinito é claro que reinicia, mas neste caso não é...

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.402
  • Helpdesk do sitio
Re: duvida em fast PWM
« Responder #5 em: 19 de Maio de 2011, 18:43 »
Não, o gcc quando detecta o fim do main, entra num loop infinito com as interrupções desligadas, porque um micro-controlador não tem para onde retornar, logo fica num ciclo infinito para não ficar a fazer resets para sempre.
Isso é porque >0 é 1, logo ainda dá impulsos.
Avr fanboy

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: duvida em fast PWM
« Responder #6 em: 19 de Maio de 2011, 18:52 »
então porque é que quando eu substituo o loop por isto:

Código: [Seleccione]
while(1)
{
OCR0A = 0;
}

retirando "OCR0A = 255;" do inicio do programa o resultado é exactamente o mesmo?

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.402
  • Helpdesk do sitio
Re: duvida em fast PWM
« Responder #7 em: 19 de Maio de 2011, 18:56 »
Pode ser por a resistência ser muito elevada, mas já vou ver se o código está certo.
Tens o programador ligado á placa?
O PB0 é o MOSI do ISP.
« Última modificação: 19 de Maio de 2011, 19:02 por senso »
Avr fanboy

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: duvida em fast PWM
« Responder #8 em: 19 de Maio de 2011, 19:38 »
sim é o MOSI, também já tinha pensado nisso, mas mesmo desligando o programador fica igual

alterei a resistência para 470r, é igual...

entretanto vou testar com um mega328...
« Última modificação: 19 de Maio de 2011, 19:42 por CBX »

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.402
  • Helpdesk do sitio
Re: duvida em fast PWM
« Responder #9 em: 19 de Maio de 2011, 19:45 »
Experimenta baixar o clock do pwm, só porque sim.
Avr fanboy

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: duvida em fast PWM
« Responder #10 em: 19 de Maio de 2011, 20:42 »
fica igual  ::)

por ex:
Código: [Seleccione]
TCCR0B |= (1<<CS01); // Fcpu/64
« Última modificação: 19 de Maio de 2011, 21:05 por CBX »

Offline GnGz

  • Mini Robot
  • *
  • Mensagens: 665
Re: duvida em fast PWM
« Responder #11 em: 19 de Maio de 2011, 21:13 »
fica igual  ::)

por ex:
Código: [Seleccione]
TCCR0B |= (1<<CS01); // Fcpu/64

Quando está 1 no CS01 não é fcpu/8 ?

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: duvida em fast PWM
« Responder #12 em: 19 de Maio de 2011, 21:26 »
sim é, copiei o errado, mas também não interessa o problema não é dai  ???

o correcto seria ((1 << CS10) | (1 << CS11));

Offline GnGz

  • Mini Robot
  • *
  • Mensagens: 665
Re: duvida em fast PWM
« Responder #13 em: 19 de Maio de 2011, 21:33 »
Sim

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: duvida em fast PWM
« Responder #14 em: 25 de Maio de 2011, 18:57 »
boas

lembrei-me de testar o código com umas modificações no timer1 só porque sim e, bem funciona como deve:

Código: [Seleccione]
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
OCR1A = 255;
DDRB |= (1<<PB1);
TCCR1 |= ((1<<PWM1A) | (1<<COM1A1) | (1<<CS01));

while(OCR1A>0)
{
_delay_ms(10);
OCR1A--;
}
}

só não consigo perceber é porque é que não funciona no, PB0, timer0  ???

obrigado a todos...