Página 1 de 1

Gerador de Frequencia

MensagemEnviado: 09 Fev 2011 08:02
por Cleber
Ola Caros.

Preciso gerar uma onda quadrada e variar a frequencia de 100 a 10Khz, via teclado a resolução pode ser de 100 em 100 Hz.
Estou apanhando disso ai.

OBS: compilador uC e o pic é o 16F1938 rodando a 32Mhz.

Desde já vlw.

Re: Gerador de Frequencia

MensagemEnviado: 09 Fev 2011 08:09
por andre_luis
Cleber,

Para multiplos de 1Hz, se su uC não fizer nada mais além disso, avalia a possibilidade de utilizar um Cristal de 32.768Hz, pois assim terá um valor preciso.

Utilize também interrupção de timer, para gerar as bordas do sinal.
Pode ser que para frequencias maiores tenha de ter lguma compensação para o tempo consumido pelo tratamento da interrupção.

+++

MensagemEnviado: 09 Fev 2011 09:58
por barboza
Cristal de 32kHz para gerar 10kHz?

MensagemEnviado: 09 Fev 2011 10:17
por fabim
O crebis é uma mula cheia de pena.

Ele esta workando com display de 7 segmentos... E outras coisas na interrupt...

Chegou no maximo 4khz, após isso o pic trava...

MensagemEnviado: 09 Fev 2011 10:26
por andre_luis
Falei besteira...foimal.....só pensei no fato de ser multiplo de 1Hz

MensagemEnviado: 09 Fev 2011 10:27
por Cleber
barboza escreveu:Cristal de 32kHz para gerar 10kHz?

O pic ta com clock de 32Mhz

MensagemEnviado: 09 Fev 2011 10:40
por barboza
Cleber escreveu:
barboza escreveu:Cristal de 32kHz para gerar 10kHz?

O pic ta com clock de 32Mhz


andre_teprom escreveu:Cleber,

Para multiplos de 1Hz, se su uC não fizer nada mais além disso, avalia a possibilidade de utilizar um Cristal de 32.768Hz, pois assim terá um valor preciso.

+++

MensagemEnviado: 09 Fev 2011 11:53
por fabim
workando com o timer 1.
que vai de 0 a 65535 + 1.
vem que.
F = Ton+Toff = (1/F)/2.

100hz = 0.010S = 5mS on + 5mS off.
10khz = 0.0001S = 50uS on + 50uS off.

se esta usando o timer1, o incremento dele sem preescaler se dá a cada 1/4 CPUCLCK.
32mhz / 4 = 8mhz.
Ou seja, o tempo de incremento de cada valor logico do timer1 = 1/8000 000 = 0.000 000 125S.
Ou seja, 125nS....

Agora vem aquele calculo simples.

oras se eu quero gerar 1000hz. Sabendo que Ttotal = 1mS, e Ton+Toff = 500uS + 500uS.
o timer tem que contar até qual valor para estourar e gerar estes tempos ?

0.000 500 / 0. 000 000 125 = 4000!!!
porque a cada 500uS voce inverte os pinos!!! 1+0||500+500.. etc

Ou seja, Se eu utilizar o timer1.

Sabendo que ele estoura na passagem de zero.

int valor;

valor = 65535 - 4000 - (ajuste fino);

TMR1H = hi(valor);
TMR1L = lo(valor);


Se for utilizar o timer2 com o compare fica mais facil.. Tu não precisa ficar fazendo reload. Mais se não me engano tu ta usando o timer2 para o MODISBUNDA.

Abraçxsho !!!

MensagemEnviado: 09 Fev 2011 12:35
por Cleber
Vlw fabim

MensagemEnviado: 09 Fev 2011 12:45
por barboza
fabim escreveu:
Sabendo que ele estoura na passagem de zero.

int valor;

valor = 4000;

TMR1H = hi(valor);
TMR1L = lo(valor);




O contador no PIC não é incremental?

No 8051 faço assim:

Exemplo para tic de 1ms.

Código: Selecionar todos
// Clock do Sistema
#define SYSCLK   12E6

#define CLK_REAL     SYSCLK / 12

#define TAXA_AMOSTRAGEM     1000      // 1 ms

#define   TIMER_RELOAD   -(CLK_REAL/TAXA_AMOSTRAGEM)

#define   RELOAD_HI   hi( TIMER_RELOAD )
#define   RELOAD_LO   lo( TIMER_RELOAD )


Para o PIC, se for incrmental seria, conforme seu exemplo:


Código: Selecionar todos
// Clock do Sistema
#define SYSCLK   32E6

#define CLK_REAL     SYSCLK / 4
#define TAXA_AMOSTRAGEM     2000      // 500us

#define   TIMER_RELOAD   -(CLK_REAL/TAXA_AMOSTRAGEM)

#define   RELOAD_HI   hi( TIMER_RELOAD )
#define   RELOAD_LO   lo( TIMER_RELOAD )

MensagemEnviado: 09 Fev 2011 12:59
por ze
confere isso.
programe o timer para interrupt 20KHz 50uS e vá reprogramando de 100 em 100 Hz
algo como FOSC internal clock 32MHz e prescaler 1:1
sinal em RB0, teclas em RB1,RB2 atenção ao deboucing
#define F_OSC 32000000
...
unsigned int tmr1=0xf9c0; //default para 20Khz
e na isr:
...
TMR1L=tmr1; //LSB
TMR1H=tmr1>>8;//MSB
...
RB0^=1;//aqui está o sinal. freq da isr/2
...
e no
main()
{
unsigned int f=300; //de ~300 a 10kHz isto deve dar algum resultado satisfatório. abaixo disto o prescaler não pode mais ser 1:1. descubra o porquê e se autoproponha a solução.
...
TMR1L=tmr1; //reload LSB
TMR1H=tmr1>>8;//MSB
for(; ; )
{
...
if (f>10000) f=300;//pra não dividir por 0
if (!RB1) f+=100; //teclado
if (!RB2) f-=100; //de 100 em 100 Hz
while(!RB0);while(!RB1);//solte a tecla por gentileza. atenção ao debouncing
tmr1=0xffff-(F_OSC/f*2); //nem sei como o compilador vai reagir. talvez casting vá bem. talvez se colocar depois do if pra não ficar calculando o tempo todo
...
}
confereaê!

MensagemEnviado: 09 Fev 2011 13:15
por Andre_Cruz
Cleber,

Você precisa fazer uma onda quadrada com qual duty cycle ? Se for 50% fixo você pode gerar a interrupção e usar o toggle no pino pra inverter a saída, mas a CPU vai funcionar em função do timer.
Não sei se seu PIC tem o CCP, se tiver você pode gerar onda quadrada pelo modo ccp configurado como PWM, assim sua CPU fica livre pra executar outras tarefas.

Passe mais informações.

André Cruz

MensagemEnviado: 09 Fev 2011 16:45
por Cleber
Oww quanta informação vlw pessoal. O duty é de 50% outra coisa utilizo o timer 0 pra um display de 7 segmentos.Bom com meu PIC estou conseguindo 7,8Khz depois disso o pic trava e da pau estou pensando em utilizar um pic com um clock maior o que vcs acham.