Você está na página 1de 4

#include "C:\Users\samsung\Desktop\PI Temp FTW\PIftw.

h"
#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_TYPE 2
#include <lcd.c>
#include <KBD.C>
#include <stdlib.h>
//teclado
//******************************************************************
char d,*p;
int16 t=250; // ANTIRREBOTE TECLADO
int puerto=0x06; // puerto teclado (puerto D)
int16 temp = 0;
float step;
float Ek;
float Uk;
float Uk1 = 0; // salida anterior del controlador uk-1
float Ek1 = 0; // entrada de error anterior ek-1
float Yk; // salida del sistema
int sal_binaria = 0;
float sal_float;
int16 adc;
float real_t;
float real_temp;

// PARA IMPLEMENTAR EL TECLADO
//--------------------------------------------------------
char teclado (int16 R,t) // R corresponde a la direccion
del registro del puerto usado para
{ // el teclado, por ejemplo para
el puerto D es 0x08 o 8 en decimal

char teclas[4][4]={{'1','2','3','/'}, // valores correspondientes al
teclado matricial
{'4','5','6','*'},
{'7','8','9','-'},
{'C','0','=','+'}};

int i,k;
while(1)
{
for(i=0;i<4;i++)
{
output_high(R*8+4+i);
for(k=0;k<4;k++)
{
delay_us(1000); // retardo para no recargar al proteus
if(input(R*8+k))
{
while(input(R*8+k)==1);
output_low(R*8+4+i);
delay_ms(t);
return teclas[k][i];
}
}
output_low(R*8+4+i);
}
}
}
void ingtemperatura()
{
lcd_init();
lcd_gotoxy(1, 1);
printf(lcd_putc," SISTEMA DE ");
lcd_gotoxy(1, 2);
printf(lcd_putc," CONTROL PI ");
delay_ms(2000);
lcd_init();
printf(lcd_putc,"INGRESE T EN(\337C):");



p = &d; // puntero a d
int i = 0;
int16 dato[]= {0,0,0};
while(true)
{
d = teclado(puerto,t); // recoge la tecla en d
//un numero se convierte a entero debido a que est en ASCII
if((i!=3)&&((d=='0')||(d=='1')||(d=='2')||(d=='3')||(d=='4')||(d=='5')||(d
=='6')||(d=='7')||(d=='8')||(d=='9'))){

dato[i] = atoi(p);

if(i==0){temp = dato[0];}
if(i==1){temp = dato[0]*10 + dato[1];}
if(i==2){temp = dato[0]*100 + dato[1]*10 + dato[2];}
if(i==3){temp = dato[0]*1000 + dato[1]*100 + dato[2]*10 + dato[3];}
lcd_gotoxy(1,1);
printf(lcd_putc,"Temperatura: %f",real_temp);
lcd_gotoxy(1,2);
printf(lcd_putc,"%Lu (\337C)",temp);
i++;



}
if((d=='C')&&(i!=0)){
return;
}
}
}
void proceso() {
Ek = 0; // error
Uk = 0; // salida del controlador
Uk1 = 0;
Ek1 = 0;
Yk = 0;
int i =0;
while(true){
set_adc_channel(0); // canal por donde se recibe la seal
adc =read_adc();
delay_us(30);
Yk = adc*5.0/512;
Ek = step - Yk;
Uk = 2.2*Ek - 2.04*Ek1 + Uk1; // ECUACION EN DIFERENCIAS DEL CONTROLADOR
if(step>8.5){
while(1){}} //En caso de sobrepasar el limite de v
oltate
if(Uk > step)
{ Uk = step;}
if(Uk < 0 )
{ Uk = 0; }
Ek1 = Ek;
Uk1 = Uk;
sal_float = Uk*238.5; //binarios para los puertos de DAC
if(sal_float > 255 && (Ek > 0.051))
{ sal_float = 255; }
if((Ek < 0.051) )
{ sal_float = Uk*238.5; }
sal_binaria = sal_float;
output_c(sal_binaria); //valores prar el DAC

output_high(PIN_D4);
if(input(PIN_D3)==1){
output_c(0);
return;
}

i++;
if(i==50)
{
real_temp = Yk*10; //Linealizacin
lcd_init();
lcd_gotoxy(1,1);
printf(lcd_putc,"Temp: %f (\337C)",real_temp);
lcd_gotoxy(1,2);
printf(lcd_putc,"Setpoint:%Lu (\337C)",temp);
i = 0;
}
}
}
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_CLOCK_DIV_2);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_adc_ports(AN0); // AN0 como entrada analgica
setup_adc(ADC_CLOCK_INTERNAL);
// TODO: USER CODE!!
output_c(0);
lcd_init();

while(true){
lcd_putc('\f');
lcd_gotoxy(1,1);
printf(lcd_putc,"Valor NIVEL mm: ");
ingtemperatura();



step = temp*0.022;
proceso();
}
}

Você também pode gostar