desktop

Pic 16f876 como digital signal processor

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;
	}
 
Para empezar olvídate de los floats, eso consume mucho. Utiliza integuers.
Tampoco utilizar el coseno es la mejor forma, mejor utilizar una tabla, normalmente un cuarto de onda, despues se juega recorriendola de arriba abajo, abajo arriba, derechaizquierda....hasta conseguir los 4 cuadrantes.
.
Aunque en C se puede hacer, mejor el asembler.#ASM
Ademas para la rutina de fabricación de la onda mejor utilizar interrupciones y el timer.

Si solo debe hacer la modulación en FM, por que no cambias el timer, sumando y restando el valor del ADC varias la frecuencia.
(idealmente en el paso por cero).

Si quieres velocidad mejor utilizar un DAC paralelo aunque sea hecho con resistencias.

En cuanto al ADC=10 prueba de subirlo arriba, mira en el help no sea que le falte el punto y coma o le sobre.
 
Atrás
Arriba