Gerador de Frequencia

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Gerador de Frequencia

Mensagempor Cleber » 09 Fev 2011 08:02

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.
Cleber
Bit
 
Mensagens: 10
Registrado em: 16 Jun 2008 11:06

Re: Gerador de Frequencia

Mensagempor andre_luis » 09 Fev 2011 08:09

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.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor barboza » 09 Fev 2011 09:58

Cristal de 32kHz para gerar 10kHz?
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor fabim » 09 Fev 2011 10:17

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...
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor andre_luis » 09 Fev 2011 10:26

Falei besteira...foimal.....só pensei no fato de ser multiplo de 1Hz
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Cleber » 09 Fev 2011 10:27

barboza escreveu:Cristal de 32kHz para gerar 10kHz?

O pic ta com clock de 32Mhz
Cleber
Bit
 
Mensagens: 10
Registrado em: 16 Jun 2008 11:06

Mensagempor barboza » 09 Fev 2011 10:40

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.

+++
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor fabim » 09 Fev 2011 11:53

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 !!!
Editado pela última vez por fabim em 09 Fev 2011 12:54, em um total de 1 vez.
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Cleber » 09 Fev 2011 12:35

Vlw fabim
Cleber
Bit
 
Mensagens: 10
Registrado em: 16 Jun 2008 11:06

Mensagempor barboza » 09 Fev 2011 12:45

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 )
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor ze » 09 Fev 2011 12:59

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ê!
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Andre_Cruz » 09 Fev 2011 13:15

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
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor Cleber » 09 Fev 2011 16:45

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.
Cleber
Bit
 
Mensagens: 10
Registrado em: 16 Jun 2008 11:06


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x