Este es un simple programa que lee un LM35 y con eso controla el pwm de un motor
#include "16f877a.h"
#device adc=8
#fuses HS, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOPROTECT
#use delay(clock = 20000000)
#use standard_io (A)
#use standard_io (B)
#use standard_io (C)
#use standard_io (D)
#use standard_io (E)
/*
Definición de pines:
AO: INPUT ANALOG
A3: VREF
B4: MOTOR ENABLED
C2: PWM OUTPUT
D0: EN LCD
D1: RS LCD
D2: RW LCD
D4: D4 LCD
D5: D5 LCD
D6: D6 LCD
D7: D7 LCD
*/
#include "lcd.c"
void main()
{
int analogico;
lcd_init(); //Inicializamos el LCD
setup_ccp1(CCP_PWM); //Configuramos CCP1 como PWM
/*
El ciclo de tiempo se calcula como: (1 / clock) * 4 * t2div * (periodo + 1).
En este caso: (1/20000000) * 4 * 16 * 128 = 409.6 us o 2.441 Khz.
*/
setup_timer_2(T2_DIV_BY_16, 127, 1); //Configuramos el timer 2 para 2.441 Khz
setup_port_a(AN0_AN1_VSS_VREF); //Seteamos el puerto analógico
setup_adc(adc_clock_internal);
set_adc_channel(0);
lcd_gotoxy(1, 1);
lcd_putc("Frec: 2.441 Khz"); //Mostramos la frecuencia en el LCD
lcd_gotoxy(1, 2);
lcd_putc("Temp:"); //Mostramos "Temp:" en el LCD
while(TRUE)
{
delay_ms(1000);
analogico = read_adc(); //Leemos la temperatura
lcd_gotoxy(6, 2);
lcd_putc(" ");
lcd_gotoxy(6, 2);
printf(lcd_putc," %d ºC", analogico); //Mostramos el valor de la temperatura en el LCD
if(analogico > 18)
output_high(pin_b4); //Habilitamos el PWM
else
output_low(pin_b4); //Deshabilitamos el PWM
/*
El tiempo en que el pulso esta en alto durante el ciclo
esta determinado por: analogico * 4 * (1 / clock) * t2div.
*/
set_pwm1_duty(analogico); //Seteamos el valor del PWM
}
}
Te adjunto la simulacion en proteus. y te aconsejo que leas la reglas del foro porque sino te van a retar.
Saludos