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
Tags:
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
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por