Vous êtes sur la page 1sur 5

#include <16F887.

h>
#device adc=10

#FUSES NOWDT //No Watch Dog Timer


#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES NOBROWNOUT //No brownout reset
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOWRT //Program memory not write protected
#FUSES BORV40 //Brownout reset at 4.0V

#use delay(clock=8000000)
#include "LCD.c"
#include <math.h>

#define LSB 4.88e-3 //5.0/1023


#define KI 4.40762e-3
//#define KI 2.0176e-2
#define TA 500

int16 CAD;
float VOLTAJELM35;
float TEMLM35, TEMPERATURA;
float E;
float T;

int1 bandera = 1;
int8 contador = 0;/*int8 es por variable de 8 bits*/
float Tdeseada = 0;
int16 cuentas = 0;

float Angulo = 60; //ojo


float error = 0;
float Tdes = 0;

#INT_EXT

void isr_int_ext() /*para habilitar flanco de subida o bajada*/


{
if (bandera == 1)
{
bandera = 0;
EXT_INT_EDGE(H_TO_L);
}
else
{
bandera = 1;
EXT_INT_EDGE(L_TO_H);

}
contador++;
//output_d(contador);
set_timer1(~cuentas);
SETUP_TIMER_1( T1_INTERNAL | T1_DIV_BY_2 );

}
#INT_TIMER1
void isr_timer1()
{
setup_timer_1(T1_DISABLED);
output_high(PIN_C0);//PONIENDO EN ALTO ESTE PINe
delay_us(25);//us es en micoseg
output_low(PIN_C0);
}

void main()
{

//Setup_Oscillator parameter not selected from Intr Oscillator Config tab


setup_oscillator( OSC_8MHZ );
// TODO: USER CODE!!
SETUP_ADC(ADC_CLOCK_INTERNAL);//configuro el tiempo de conversion por bit
SETUP_ADC_PORTS(sAN0|sAN1 |sAN2 |VSS_VDD );//configuro canales analogicos y referencias
lcd_init(); //inicializar el lcd

lcd_gotoxy(1,1);
lcd_putc("TA=");

lcd_gotoxy(1,2);
lcd_putc("TD=");

lcd_gotoxy(10,1);
lcd_putc("A=");

lcd_gotoxy(10,2);
lcd_putc("E=");

delay_ms(2000);

bandera = 1; //esto va antes del while


EXT_INT_EDGE(L_TO_H ); /*aqui esta hablitado el flanco de subida*/
enable_interrupts(INT_TIMER1);/*habilitar varias interrupciones*/
enable_interrupts(int_ext);
enable_interrupts(GLOBAL);

while(true){ //ciclo infinito o iclo de descanso

SET_ADC_CHANNEL(0);//selecciono canal cero


delay_us(5);// 5
cad=READ_ADC();//cad es un valor crudo
VOLTAJELM35 = LSB * CAD;
TEMLM35=VOLTAJELM35*100;

SET_ADC_CHANNEL(1);//selecciono canal uno


delay_us(5);
cad=READ_ADC();//cad es un valor crudo
E=cad*KI;
T=(2.508355e1)*E+(7.860103e-2)*pow(E,2)-(2.503131e-1)*pow(E,3)+(8.315270e-2)*pow(E,4)-
(1.228034e-2)*pow(E,5)+(9.804036e-4)*pow(E,6)-(4.413030e-5)*pow(E,7)+(1.057034e-
6)*pow(E,8)-(1.052755e-8)*pow(E,9);

TEMPERATURA= T + TEMLM35;

lcd_gotoxy(4,1);

printf(lcd_putc, "%.1f",TEMPERATURA);

SET_ADC_CHANNEL(2);//selecciono canal dos


delay_us(5);

Tdes=READ_ADC(); // dado por el pot

Tdeseada = 22+0.068*Tdes;

lcd_gotoxy(4,2);

printf(lcd_putc, "%.1f",Tdeseada);

error=Tdeseada-TEMPERATURA;

lcd_gotoxy(12,2);
printf(lcd_putc, "%.1f",error);

Angulo = 160-10*error;

lcd_gotoxy(12,1);
printf(lcd_putc, "%.1f",Angulo);

if(Angulo<60) { // prueba 1 grafuca de voltaje/angulo

Angulo = 60;
lcd_gotoxy(12,1);
printf(lcd_putc, "%.1f",Angulo);
}

cuentas = (int16)(49.07*Angulo);
delay_ms(250);

}
}
Formula para encontrar la resistencia del moc3010

𝐼 = 17𝑚𝐴

𝑣𝑜𝑢𝑡 − 𝑣𝑅 − 𝑣𝐷 = 0

5 − 17𝑚𝐴 𝑅 − 1.3 = 0

−17𝑚𝐴 𝑅−= −5 + 1.3

−3.7
𝑅=
−17𝑚𝐴

𝑅 = 217.64Ω ≈ 220Ω

valores OPTOCOPLADOR NPN considerando VDopto=1.5v, VD=0.7v, If =10mA, Ifrms=(10mA/2)=5mA,


ICmin=0.1mA

𝑣𝑠 − 𝐼𝑓 𝑅𝑆 − 𝑣𝐷 − 𝑣𝐷𝑜𝑝𝑡𝑜 = 0

−𝐼𝑓 𝑅𝑆 = −𝑣𝑠 + 𝑣𝐷 + 𝑣𝐷𝑜𝑝𝑡𝑜

−𝑣𝑠 + 𝑣𝐷 + 𝑣𝐷𝑜𝑝𝑡𝑜
𝑅𝑆 =
−𝐼𝑓

−180𝑣 + 0.7𝑣 + 1.5𝑣 177.8𝑣


𝑅1 = 𝑅𝑆 = = = 17780Ω ≈ 20𝐾Ω
−10𝑚𝐴 −10𝑚𝐴
2
𝑃𝑅𝑟𝑚𝑠 = 𝑅𝐼𝑟𝑚𝑠 = 17.78𝐾Ω ∗ 5𝑚𝐴 = 0.4445𝑤

𝑣𝐶𝐶 −𝑣𝐶𝐸𝑠𝑎𝑡 −𝑉𝑅 = 0

𝑣𝐶𝐶 −𝑣𝐶𝐸𝑠𝑎𝑡 − 𝑅𝐼 = 0

−𝑣𝐶𝐶 +𝑣𝐶𝐸𝑠𝑎𝑡
𝑅=
−𝐼

−5𝑣 + 0.2𝑣
𝑅2 = 𝑅 = = 48000Ω = 48𝑘Ω ≈ 47𝑘Ω
−0.1𝑚𝐴

Vous aimerez peut-être aussi