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.
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.