• Welcome to LusoRobótica - Robótica em Português.
 

Gerar sinal com Arduino

Started by SJD22, 04 de April de 2011, 20:40

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

SJD22

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

senso

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.
Avr fanboy

SJD22

Portanto, estou agarrado!

Como posso gerar um sinal desses entao?

microbyte

Essa frequência que falaste é fixa, ou queres que seja regulável?

É que para gerar frequências costuma usar-se um 555.

SJD22

É 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.

senso

1Mhz não é assim uma coisa super comum, já é uma frequência relativamente elevada.
Qual é o uso final?
Avr fanboy

SJD22

O uso final era só mesmo ver o sinal no osciloscópio USB que comprei :) Sendo assim tenho de gerar sinais mais baixos.

senso

Se quiseres um simples 01010101, podes fazer, agora sinais mais complexos não dá.
Avr fanboy

SJD22

Pois... mas fazer com que esses impulsos durem 1us nunca dá... :(

SJD22

Com um 555 consegue-se de alguma forma definir a trama que pretendemos?

senso

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é.
Avr fanboy

StarRider

#11
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

SJD22

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...

senso

Tens a certeza disso?
É que um digitalWrite demora uns 40 ciclos de relógio.
Avr fanboy

SJD22

Ou seja, o digitalWrite demora 2,5us (1/16000000 * 40)...

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