zonnamtao
18-10-2009, 09:12 PM
Em đang làm đề tài điều chỉnh độ sáng đèn led bằng PWM thông qua cảm biến quang đưa tín hiệu vào kênh AN0. Mong các bác góp ý dùm.
[code]
#include <16F877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device 16F877a*=16 ADC=8
#include <def_877A.h>
#use delay(clock=4000000)
#include <def_877a.h>
int8 mode=0,somode;
int8 value,aa;
int8 duty;
int8 const a[11] = {192,249,164, 176,153,146,130,248,128,144,136};
#INT_EXT //khai bao ngat ngoai
EXT_ISR()
{//KHAI BAO NGAT
mode++;
if (mode==11) mode = 0;
}
// End of INT
void pro1();
void main() {
set_tris_b(0x01);
set_tris_d(0x00);
set_tris_c(0x00);
setup_port_a(ALL_ANALOG);//Đọc giá trị ánh sáng môi trường từ //cảm biến quang trở
setup_adc(adc_clock_internal);
set_adc_channel( 0 );
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_4, 249, 4);
enable_interrupts(int_EXT);//ngắt ngoài dùng để đặt mức sáng
ext_int_edge(L_TO_H); //
enable_interrupts(GLOBAL);
portd=192;set_pwm1_duty(0);
while(1)
{
switch(mode)
{
CASE 0: portd=a[mode];set_pwm1_duty(0);BREAK;
default: pro1() ; break;
}
}
}
void pro1()
{
portd=a[mode];
value=(float)read_adc();
delay_us(10);
somode=(mode*25.5);//22.5=0.5V*255/5V // 5V/0.5V=10 muc
if (value<somode)
{
duty=(somode-value);
set_pwm1_duty(duty);
}
else set_pwm1_duty(0);
}
[code]
#include <16F877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device 16F877a*=16 ADC=8
#include <def_877A.h>
#use delay(clock=4000000)
#include <def_877a.h>
int8 mode=0,somode;
int8 value,aa;
int8 duty;
int8 const a[11] = {192,249,164, 176,153,146,130,248,128,144,136};
#INT_EXT //khai bao ngat ngoai
EXT_ISR()
{//KHAI BAO NGAT
mode++;
if (mode==11) mode = 0;
}
// End of INT
void pro1();
void main() {
set_tris_b(0x01);
set_tris_d(0x00);
set_tris_c(0x00);
setup_port_a(ALL_ANALOG);//Đọc giá trị ánh sáng môi trường từ //cảm biến quang trở
setup_adc(adc_clock_internal);
set_adc_channel( 0 );
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_4, 249, 4);
enable_interrupts(int_EXT);//ngắt ngoài dùng để đặt mức sáng
ext_int_edge(L_TO_H); //
enable_interrupts(GLOBAL);
portd=192;set_pwm1_duty(0);
while(1)
{
switch(mode)
{
CASE 0: portd=a[mode];set_pwm1_duty(0);BREAK;
default: pro1() ; break;
}
}
}
void pro1()
{
portd=a[mode];
value=(float)read_adc();
delay_us(10);
somode=(mode*25.5);//22.5=0.5V*255/5V // 5V/0.5V=10 muc
if (value<somode)
{
duty=(somode-value);
set_pwm1_duty(duty);
}
else set_pwm1_duty(0);
}