LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: SJD22 em 04 de Abril de 2011, 20:40

Título: Gerar sinal com Arduino
Enviado por: SJD22 em 04 de Abril de 2011, 20:40
Boa noite,

Com um arduino, é possível gerar um sinal com frequência de 1 MHz, correcto?

O que eu queria era gerar um conjunto de impulsos (110011001100110011 por exemplo) onde cada bit dura 1us (1 microsegundo).

Uso a saida de PWM do arduino, certo? Mas consigo essa duração de impulso?

Obrigado
Título: Re: Gerar sinal com Arduino
Enviado por: senso em 04 de Abril de 2011, 20:52
O pwm mais rápido que podes fazer é usando um timer de 8 bits, e a 16Mhz a frequência máxima é de 16Mhz/256 = 62,5Khz.
Se pensares que o teu micro corre a 16Mhz, 1Mhz dá-te no máximo 16 instruções, se fores de um ciclo, se for um branch demora 2 ciclos, logo é algo impossivel em C, e mesmo em assembly é muito complicado.
Título: Re: Gerar sinal com Arduino
Enviado por: SJD22 em 04 de Abril de 2011, 21:20
Portanto, estou agarrado!

Como posso gerar um sinal desses entao?
Título: Re: Gerar sinal com Arduino
Enviado por: microbyte em 04 de Abril de 2011, 21:31
Essa frequência que falaste é fixa, ou queres que seja regulável?

É que para gerar frequências costuma usar-se um 555.
Título: Re: Gerar sinal com Arduino
Enviado por: SJD22 em 04 de Abril de 2011, 21:35
É fixa, os bits duram sempre 1us.

Mas eu queria, por programação, dizer que trama escrever e com um 555 tinha de ter sempre a mesma sequência.
Título: Re: Gerar sinal com Arduino
Enviado por: senso em 04 de Abril de 2011, 21:55
1Mhz não é assim uma coisa super comum, já é uma frequência relativamente elevada.
Qual é o uso final?
Título: Re: Gerar sinal com Arduino
Enviado por: SJD22 em 05 de Abril de 2011, 16:10
O uso final era só mesmo ver o sinal no osciloscópio USB que comprei :) Sendo assim tenho de gerar sinais mais baixos.
Título: Re: Gerar sinal com Arduino
Enviado por: senso em 05 de Abril de 2011, 17:57
Se quiseres um simples 01010101, podes fazer, agora sinais mais complexos não dá.
Título: Re: Gerar sinal com Arduino
Enviado por: SJD22 em 05 de Abril de 2011, 18:50
Pois... mas fazer com que esses impulsos durem 1us nunca dá... :(
Título: Re: Gerar sinal com Arduino
Enviado por: SJD22 em 05 de Abril de 2011, 18:51
Com um 555 consegue-se de alguma forma definir a trama que pretendemos?
Título: Re: Gerar sinal com Arduino
Enviado por: senso em 05 de Abril de 2011, 18:54
Dá sim, é uma questão de usar acesso directo aos portos e fazer toogle dos pins escrevendo no registo PINx, assim fazes toggle num ciclo de relógio, como disse para fazer 10101010101, dá para fazer a mais de 1Mhz até.
Título: Re: Gerar sinal com Arduino
Enviado por: StarRider em 05 de Abril de 2011, 19:04
Boas,

Se a finalidade é criar uma onda em quadratura fixa não existe necessidade de recorrer à modulação, por isso usar PWM é overkill. PWM serve, tal como o nome indica, quando se pretende modular o comprimento da onda e quando existe um ciclo de trabalho (duty clice) que pode/deve ser ajustado.

Ora, nos AVR podes usar o OCR (output compara register) para alternar o estado de um pino IO (pino correspondente ao timer que estiveres a usar).

Para obteres o efeito desejado, quer com um timer de 8 ou 16 bits e com 16Mhz de clock, basta configurar o timer com um prescaler de 1 e o OC output mode = toogle, o que em termos de registos dá:

TCCR0 = 0x00;  // stop
TCNT0 = 0xF0;  // valor inicial do timer 0 counter
OCR0   = 0x10;  // valor do comparador
TCCR0 = 0x11;  // iniciar timer, OC0 mode=toogle

Entre cada pulso tens 16 ciclos mas como a manipulação da porta IO é feita em wardware, transparente para o código e não gera interrupts, podes correr qualquer código no AVR sem grandes problemas.

Só uma nota em termos de PWM, o máximo para um clock de 16Mhz é de 31Khz para um PWM com correcção de fase, que é o que normalmente se usa.

Abraços,
PA
Título: Re: Gerar sinal com Arduino
Enviado por: SJD22 em 05 de Abril de 2011, 21:03
Bom, já consegui meter o meu arduino mega 2560 e mandar bits com 1us de duração. Código:

  digitalWrite(13, HIGH);
  delayMicroseconds(1);
  digitalWrite(13, LOW);
  delayMicroseconds(20);

Agora quero ir mais longe... quero ligar esse pino a outro arduino para ler esses mesmos bits.

Sugestões? No fundo é estar sempre a ler o estado da porta...
Título: Re: Gerar sinal com Arduino
Enviado por: senso em 05 de Abril de 2011, 21:38
Tens a certeza disso?
É que um digitalWrite demora uns 40 ciclos de relógio.
Título: Re: Gerar sinal com Arduino
Enviado por: SJD22 em 05 de Abril de 2011, 21:54
Ou seja, o digitalWrite demora 2,5us (1/16000000 * 40)...

Pois... o osciloscopio diz mais ou menos o mesmo... :)