Autor Tema: Programa para pic 16f873a  (Leído 6361 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado lhyaz

  • PIC10
  • *
  • Mensajes: 11
Programa para pic 16f873a
« en: 08 de Mayo de 2008, 00:00:11 »
Bueno, les consulte hace un par de dias en este post para solicitar ayuda como les comento en el mismo. En fin, hoy por la mañana tengo ya bien claro lo que necesito (en teoria) para la materia de control digital de la carrera de Ing. Electronica.

Les dejo un diagrama para explicarme mejor...


Ya en el programa del PIC realizaria la conversion A/D, el algoritmo de control PID (que se realiza con calculos matematicos y ecuaciones que se introducen al mismo programa para que las resuelva de acuerdo a los valores digitalizados de consigna y del sensor) y tambien se obtendria una señal analogica en voltaje para controlar al actuador final y llevar el proceso al valor deseado.

Las ecuaciones de control serian:

en=in+u1

out=b0*en+b1*u1+b2*u2

De las cuales matematicamente se calculan los valores de "b0", "b12 y "b2"; "in" y "m" son las señales de entrada y salida (analogicas) y "en" es una suma de 2 variables.
Como el control del proceso va a ser constante, debe haber un ciclo infinito que se repita. Cada ciclo tambien debería haber un corrimiento de variables de b2 a bi y de bi a b0, antes de comenzar el nuevo ciclo.

En fin, se que les estoy cargando la mano, pero creo que para darme a entender mejor es importante comentarles para que seria el codigo.

Como habran observado en la imagen, necesito convertir no una, si no 2 señales de analogo a digital para aplicar las ecuaciones de control, y posteriormente utilizar el modulo PWM para poder "controlar" un actuador que trabaja con un voltaje de CD (señal analoga de nuevo).
El diagrama que habia planeado es algo asi:



Alguna idea distinta a la mia? creen que al menos tengo idea o simplemente está mal la forma en que estoy tratando de analizar el problema?

En fin, espero no causarles muchas molestias.

Por cierto, el lenguaje en el que me gustaria programar seria el C, tengo el CCS C Compiler para trabajar con el, y el Proteus para simular antes de grabar el PIC.

Un saludo y de antemano gracias por sus respuestas.
« Última modificación: 08 de Mayo de 2008, 00:41:23 por lhyaz »

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Programa para pic 16f873a
« Respuesta #1 en: 08 de Mayo de 2008, 00:43:49 »
Saludos Ilyaz, bienvenido al foro!  :-)

Bueno tú conoces mejor que yo tu proyecto, así que asumo que ese diagrama que colocas esta bien (que de hecho se ve muy lógico y ordenado)...
Aun así, hay algunas cosas que necesito me aclares:

1- Dices que M es la salida, entonces M = out y se calcula con la ecuación que colocas?
2- Esas variables U1, U2, en... ok, en=in + u1... pero... y u1, u2? Cuáles son sus ecuaciones, o de qué dependen?
3- Mencionas que tienes que hacer dos conversiones A/D, del sensor y la referencia... "in" es el sensor? si es así...cuál es la variable que representa la referencia, y qué afecta esta?
4- A qué frecuencia trabaja la PWM que necesitas?

Ok en cuanto aclares esos puntos ponemos manos a la obra!
Nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado lhyaz

  • PIC10
  • *
  • Mensajes: 11
Re: Programa para pic 16f873a
« Respuesta #2 en: 08 de Mayo de 2008, 23:11:14 »
gracias por tu respuesta

Bueno, comienzo de abajo hacia arriba ;)

La frecuencia del PWM no la tengo definida aun, de modo que se podria dejar a comodidad (osea, proponerla para que vaya de acuerdo con el muestreo den convertidor).

Efectivamente "in" es el sensor, y lo de la rerferencia ha sido un fallo mio en el diagrama :?. Idealmente la variable M se va a comparar con la referencia para obtener el valor del error para obtener la señal de control que se aplicaria al actuador final. En el diagrama me faltó ese bloque que iria hasta abajo, antes de regresar al tercer bloque:


U1 y U2 son variables que cambian en cada ciclo de trabajo, pero no tengo claro aun que valor tienen al principio y como se obtiene el valor de U2 que será el que se vaya corriendo a las otras variables. En este punto si te pediria una disculpa y sobre todo un dia mas para preguntarle al maestro.

La salida (que seria la señal de control del actuador final) es la diferencia entre la referencia y el error.

Un saludo!

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Programa para pic 16f873a
« Respuesta #3 en: 09 de Mayo de 2008, 00:13:11 »
Saludos Lhyaz!  :-)
Aquí te dejo algo para que te animes:  :D

Código: [Seleccionar]
#include <16f873A.h>
#device ADC=10                                 //conversión a 10 bits     
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT //Los fuses más comunes
#use delay (CLOCK=4000000) //No lo especificaste, pero supongo que tu cristal es 4MHz

//////////////////////////////////////////////////////////////
//// Declaración de constantes ///////////////////////////
//////////////////////////////////////////////////////////////

const int b0=0;   //
const int b1=0;   //
const int b2=0;   // Aquí define el valor de tus constantes

//////////////////////////////////////////////////////////////
//// Declaración de variables globales //////////////////
//////////////////////////////////////////////////////////////

int U1;
int U2;
int en;
int16 M;
int16 in;
int16 ref;
int16 out;

// Para conversión Analógico / Digital
int16 conversion_ad (int canal)
{
   int16 value=0;
   set_adc_channel(canal);
   value=read_adc();
   return(value);
}

//Asigna aquí los valores a tus variables
void asignar_variables ()
{
   //coloca tus ecuaciones para U1, U2 y en...
}

//Lee las señales de entrada (referencia y sensor)
void leer_entradas()
{
      in=conversion_ad(0); //Suponiendo que el sensor está en RA0
      delay_us(50);
      ref=conversion_ad(1);//Suponiendo que el sensor está en RA1
      delay_us(50);
}
//para calcular M... entonces la ecuación anterior era para calcular
//                   el valor de M y no de out?
void calcular_M()
{
      en=in+U1;
      M=b0*en+b1*u1+b2*u2;
}

//Corre tus valores. No lo especificaste, pero me imagino que en pasa a U2
//O sea: U2>U1>en>U2... o U2 permanece con su mismo valor?
void corrimiento_valores()
{
   int temp_1;
   int temp_2;
   
   temp_1=U1;
   U1=U2;
   temp_2=en;
   en=temp_1;
   U2=temp_2;
}

void main(void)
{
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_adc_ports(RA0_RA1_RA3_ANALOG);
   setup_ccp1(CCP_PWM);
   setup_timer_2(T2_DIV_BY_1,255,1);
   while(TRUE)
   {
      asignar_variables();
      leer_entradas();
      calcular_M();
      corrimiento_valores();
      out=ref-M;
      set_pwm1_duty(out);
   }
}

Lo compilé y no da errores... ahora falta que lo simules a ver qué tal...
Y bueno, también falta la parte de el acondicionamiento de las variables U1, U2 y en, que dices vas a preguntar a tu profesor....

Como verás hice en el programa una función para cada bloque que colocaste en el diagrama...
Espero haberme explicado bien...
Ok, no más pues... nos leemos!  :mrgreen:

"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web