Regulador de pwm con 16f876a para fuente buck, problemas con la lectura adc

Hola estoy pensando un regulador del mosfet de un buck con este 876a, programo en ccs y este es mi código:


Mi pregunta es, que os parece?? es un borrador asi lo mas importante pero tengo problemas al leer el puerto A0 como analogico. No tengo experiencia en lecturas analógicas de puertos, lo que puse lo saque de información que encontre por ai pero lo escribi yo. Os pido que me echeis una mano. Mas adelante, si la cosa va bien tengo pensado ponerle tambien un LCD indicando el voltaje y, porque no, la corriente.


La idea es con los botones seleccionar un voltaje, que de momento no se ve en ningun lcd, pero se verá, y luego ese voltaje compararlo con la salida de la fuente debidamente acondicionada a 5v, esa circuiteria externa no me plantea miedo. Luego se compara si el voltaje es mayor o menor para saber si debemos aumentar o reducir D.

El problema tambien esta en la linea donde se convierte el codigo de 0 a 1024 en (voltios o proporcional). A ver que ideas se os ocurren.


#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
long int TON = 10, V = 100, TOFF=49900, salida;
int rapidoa=1, rapidob=1, rapidoc=1, rapidod=1;
float vsalida;

void main()
{

setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
SET_ADC_CHANNEL(0);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,166,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);



//R0 como salida del pwm
//C1 subir voltios
//C2 bajar voltios
do
{

output_high(PIN_B0); //inicio pwm
delay_us(TON);
output_low(PIN_B0);
delay_us(TOFF=50000-TON); // fin pwm, aprox unos 20Khz

if (input(PIN_C1)) //boton para subir volts
{
V++; // 100 = 1v

}


if (input(PIN_C2)) // lo mismo para diminuir voltaje
{
V--;


}

salida = read_adc(ADC_START_AND_READ); //leo el valor de ADC con 10 bits y lo meto en salida

vsalida = ((salida * 500) / 1023);
//se trata de pasar "salida" a voltios*100

if (vsalida > V); //comparamos la salida en mv con el voltaje pedido en mv
{
TON = (TON - 10);
}

if (vsalida < V); //comparamos la salida en mv con el voltaje pedido en mv
{
TON = (TON + 10);
}


} while (1);



}


cuando esto funcione por software tengo pensado ponerle algo para cuando pulsas un boton continuamente que valla aumentando mas rápido, y alguna entrada que corte todo a modo de emergencia o sobrecalentamiento.



Es muy crítico que varie levemente la frecuencia del PWM, es que unas veces al ejecutar un u otro if, pues espera mas en el ciclo de D=0 que otras.

A todo esto, no busco una precisión extrema, mas bien estaba pensando en una fuente de potencia.
 
Bueno cuando me fui a cama pense una mejor forma para hacerlo y aqui esta, o por lo menos creo que me funciona mejor, solo tengo un problema



long volt, salida;
int d=0; //de 0 a 132

void main()
{

setup_adc_ports(AN0_AN1_AN3);
setup_adc(ADC_CLOCK_INTERNAL);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,32,1);
setup_ccp1(CCP_PWM);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_init();

do

{

set_adc_channel( 0 );
volt = read_adc(); // esto esta bien asi?
set_adc_channel(1);
salida = read_adc();

if (volt<salida)
{
if (d< 132)
d++;
}

if (volt>salida)

{
if (d>0)
d--;
}

set_pwm1_duty(d);

// ahora empezamos con las tareas del LCD

lcd_putc("\f");
lcd_putc("%i", volt) //(( en esta linea me dice que faltan parentesis))
}while (1);



}


tiene sentido el código? porque me da ese error, el formato de las variables long no era tambien %i ?
 
Atrás
Arriba