Olá Pessoal

Alguém sabe me disser  como fazer um gerador de frequência com as seguintes características

Saída de Frequência de 0 a 250Hz ajuntável com precisão de  1 Hz

Saída de uma onda quadrada de 5V

Este código que gera esta frequência deve em CCS para pic 16fxxxx

Sei tem ci pronto com esta saída de frequência mas o meu objetivo é fazer um código em C capaz de gerar uma frequência de saída em um pino

 

Se alguém puder me ajudar eu agradeço

 

Saudações 

Exibições: 2555

Responder esta

Respostas a este tópico

O caminho seria:

Dado a frequência desejada calcular o intervalo de um semiciclo = 1/(frequencia*2). O x2 se deve ao fato de vc precisar de um evento para zerar e outro pra setar o pino de saida.

Com essa intervalo em mãos programar os timers. Muito possivelmente apenas os timers nao sao suficientes para contar tanto tempo. Entao vc precisa de alguns contadores em memoria para dividir mais.

Mas precisa ver qual a sua real necessidade. Quem sabe um 555 ou um ICL8038 nao resolvem melhor ???

Olá Eduardo

Obrigado pela dica 

Já comecei a desenvolver um codigo emC está com alguns pequenos erros mas 98 % já esta funcionando 

Segue o codigo abaixo 

Quando eu terminar o codigo pretendo deixar aqui registrado para futuras consultas

//*********************************************************************************************


#include <12F675.h>
#device adc=8

#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOCPD //No EE protection
#FUSES NOPROTECT //Code not protected from reading
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPUT //No Power Up Timer
#FUSES NOBROWNOUT //No brownout reset

#use delay(clock=4000000)

int32 FreqSelecionada=0,aux=0, comparador=0,analogica=0, tempo=0, tempo1=0;
int8 incrementa=0;


#int_TIMER1
void TIMER1_isr(void)
{
if (aux>=62500)
{
set_timer1 (aux);
output_toggle(pin_A2);// saida para gerar frequencia de 0 a 250 Hz
}

}

void main()
{
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
setup_adc_ports(sAN0|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_64);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
setup_comparator(NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);


while(true)
{





for ( incrementa=0; incrementa<100; incrementa++)//Faz um loop
{
analogica =analogica+read_adc();//soma porta analogica 100 vezes
// delay_us(10);
}





FreqSelecionada=analogica/100; // variavel analogica não pode passar de INT32 4294967296





if (FreqSelecionada>=250) // se fre
{
FreqSelecionada=250;// FreqSelecionada for maio do que 250 Hz trava em 250
tempo = 62500/FreqSelecionada;
tempo1 = 65536 - tempo;
aux = tempo1;
}


else
{
tempo = 62500/FreqSelecionada;
tempo1 = 65536 - tempo;
aux = tempo1;
comparador=FreqSelecionada;
}




}

}

//*************************************************************************************************

int frequencia(unsigned char f)

{

if (f>250){break;}

porta_tal_pino_tal = high;

delay_ms( 1000 / f ); //-.> (1000/250) = 4 ms     1000ms/4ms=f250

porta_tal_pino_tal = low;

}

Olá Almir 

Obrigado pela dica mas não sou muito fã de usar delay pois o mesmo trava o seu programa pois pretendo mostrar em display esta a frequencia selecionada e utilizando co camonado delay vai dar difernça entre um ciclo e outro

Estou disponivel a novas sugestão

Saudações

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço