Hola a todos, alguien sabe como hacer un oscilador controlado por voltaje con el pic 16f876 yo he pensado lo siguiente pero no va y yo creo que el problema está en el bucle for anidado.¿alguien puede ayudarme?
Código:
//En este programa vamos a realizar un oscilador controlado por tensión.
//Un oscilador de este tipo será el que nos permita relizar; por ejemplo, una
//modulación FM.
// Autor: Francisco Ramos
/*/* ZONA DE DECLARACIÓN DE LIBRERIAS Y PALABRA DE CONFIGURACION */
#include<16F876.h> //modelo de pic utilizado
#include<math.h>
#use i2c(master,sda=PIN_C4,scl=PIN_C3) //Configuración del i2c como Master y los pines //del sda y scl
#fuses NOPROTECT,NOCPD,NOLVP,NOWDT,XT
// Con estas directivas las funciones "input" y "output_bit" no reprograman
// el pin de la puerta cada vez que son utilizadas. Si no se indica el
// modo fast_io se asume por defecto standard_io el cual reprograma el pin
// siempre antes de ser utilizadas estas funciones.
#use delay(clock=4000000)
/*#device ADC=10*/ /*aquí me produce un error de compilacion que no a que es debido*/
#use fast_io(A)
/* PROTOTIPOS DE FUNCIONES USADAS */
float conv_da(int16 numero, int resolucion, int referencia);
float conv_ad(float numero, int resolucion, int referencia);
main() {
/* Variables generales */
int16 amplitud_mod; //amplitud de moduladora en digital
float amp_mod_analog; //amplitud de moduladora en analogico
float modulada; //amplitud moduladora en digital para salir fuera
int referencia=5; //variables para la conv ad y da
int resolucion=10;
float i; //variable que controla la frecuencia de la señal
float j; //variable que controla la amplitud de la señal
float portadora; //señal portadora
setup_adc(adc_clock_div_32); //Ajusta frecuencia de muestreo del ADC
i2c_start(); //poner en marcha comunicación via i2c con el //DAC
i2c_write(0b10010000); // Envío Dirección I2C del PCF8591
i2c_write(0b01000000); // Envío Configuración del PCF8591 para Conv. DA
while(1)
{
setup_adc_ports(AN0); //RA0 entrada analógica
set_adc_channel(0); //Selección del canal 0 (RA0)
delay_us(10); //Temporiza 10uS
amplitud_mod=read_adc(); //Inicia la conversión y lee el resultado
amp_mod_analog=conv_da(amplitud_mod, resolucion, referencia); //valor analogico interno
for(i=0; i<amp_mod_analog; i+=0.01){
for(j=0; j<6.28; j+=0.01){
portadora=2*cos(j);
return portadora;
}
}
modulada=(int8)conv_ad(portadora, resolucion,referencia); //valor digital para i2c
/*modulada se convierte a un entero de 8 bits porque por el bus i2c se transmiten 8bits*/
do {
i2c_write(modulada); // Envío Valor digital a través del i2c
} while (TRUE); //terminación de envío de datos al DAC externo
} //terminación bucle principal
} //terminación main
/* Programación de las funciones usadas */
float conv_ad(float numero,int resolucion, int referencia)
{
float valor;
valor = floor(numero*(pow(2,resolucion))/referencia);
return valor;
}
float conv_da(int16 numero,int resolucion, int referencia)
{
float valor;
valor= numero*referencia/pow(2,resolucion);
return valor;
}