DEAR ALL!
chả là thế này, em đang lập trình ADC cho pic 16f887, và có 1 vấn đề nhờ các bác hỗ trợ. em xin cảm ơn!
em có 1 thiết bị tải ngoài với mức điện trở quy định là 30-40kΩ. và chân AN0(PIN2) lấy tìn hiệu ANALOG.
với tải là 35kΩ thì mức điện áp hiển thị trên AN0 là 3.3v và em lấy 1 tải có điện trở là 60kΩ thì áp trên AN0 là 4.1v. nếu oke thì hiển thị led . ko oke thì led tắt.
mời các bác xem đọan code.
#include<16f887.h> //khai bao ten VDK
#device 16F877*=16, ADC=10 // 10 bit
#fuses HS,NOLVP,NOWDT,PUT
#use delay (clock=20000000)
#include <stdio.h>
#include <math.h>
int16 adcsensor;
int16 adcMIC;
int mok;
int sensorok;
int16 i,count;
void checksensor() //////////////////////////// kiem sensor ////////////////////////////////
{
set_ADC_channel(3);
delay_us(20);
adcsensor=read_adc();
if (adcsensor<200)
{
sensorok=0;
}
if (adcsensor>200)
{
sensorok=1;
}
}
void checkMIC()
{
set_ADC_channel(0);
delay_us(20);
adcMIC=read_adc();
if (adcMIC<680) // tuong ung voi 40kΩ
{
if (adcMIC>635) // tương ứng 30kΩ
{
mok=1;
}
if (adcMIC<635)
{
mok=0;
}
}
if (adcMIC>680)
{
mok=0;
}
}
void check()
{
if(mok==1)
{
output_bit(pin_b1,1); // led ok sang
}
if (mok==0)
{
output_bit(pin_b1,0); //led tat
}
count=mok;
}
void checkHP()
{
checksensor();
if (sensorok==0)
{
checksensor();
output_bit(pin_e0,0);
while (sensorok==0)
{
checksensor();
}
}
if (sensorok==1)
{
output_bit(pin_e0,1); // cylinder push jig on
checkMIC();
check();
if (count<1)
{
checkMIC();
check();
while (count<1)
{
checkMIC();
check();
}
}
if (count==1)
{
delay_ms(2500);
output_bit(pin_e0,0); // cylinder push jig oFF
checkMIC();
check();
for (i=1; i<50; i++)
{
delay_ms(10);
checkMIC();
check();
}
checkMIC();
check();
}
}
}
void main()
{
setup_adc_ports(sAN0|sAN1|sAN2|sAN3|VSS_VDD);
set_tris_b(0x00);
set_tris_e(0x00);
set_tris_a(0xff);
setup_adc(adc_clock_internal);
output_b(0x00);
output_e(0x00);
count=0;
while (true)
{
checkHP();
}
}
nhưng ko hiểu tại sao khi em thử với tải 60KΩ thì led vẫn sáng.( mặc dù mức ADC của tải này 4.1v=843)
nhờ các bác chỉ giáo.
thanks
chả là thế này, em đang lập trình ADC cho pic 16f887, và có 1 vấn đề nhờ các bác hỗ trợ. em xin cảm ơn!
em có 1 thiết bị tải ngoài với mức điện trở quy định là 30-40kΩ. và chân AN0(PIN2) lấy tìn hiệu ANALOG.
với tải là 35kΩ thì mức điện áp hiển thị trên AN0 là 3.3v và em lấy 1 tải có điện trở là 60kΩ thì áp trên AN0 là 4.1v. nếu oke thì hiển thị led . ko oke thì led tắt.
mời các bác xem đọan code.
#include<16f887.h> //khai bao ten VDK
#device 16F877*=16, ADC=10 // 10 bit
#fuses HS,NOLVP,NOWDT,PUT
#use delay (clock=20000000)
#include <stdio.h>
#include <math.h>
int16 adcsensor;
int16 adcMIC;
int mok;
int sensorok;
int16 i,count;
void checksensor() //////////////////////////// kiem sensor ////////////////////////////////
{
set_ADC_channel(3);
delay_us(20);
adcsensor=read_adc();
if (adcsensor<200)
{
sensorok=0;
}
if (adcsensor>200)
{
sensorok=1;
}
}
void checkMIC()
{
set_ADC_channel(0);
delay_us(20);
adcMIC=read_adc();
if (adcMIC<680) // tuong ung voi 40kΩ
{
if (adcMIC>635) // tương ứng 30kΩ
{
mok=1;
}
if (adcMIC<635)
{
mok=0;
}
}
if (adcMIC>680)
{
mok=0;
}
}
void check()
{
if(mok==1)
{
output_bit(pin_b1,1); // led ok sang
}
if (mok==0)
{
output_bit(pin_b1,0); //led tat
}
count=mok;
}
void checkHP()
{
checksensor();
if (sensorok==0)
{
checksensor();
output_bit(pin_e0,0);
while (sensorok==0)
{
checksensor();
}
}
if (sensorok==1)
{
output_bit(pin_e0,1); // cylinder push jig on
checkMIC();
check();
if (count<1)
{
checkMIC();
check();
while (count<1)
{
checkMIC();
check();
}
}
if (count==1)
{
delay_ms(2500);
output_bit(pin_e0,0); // cylinder push jig oFF
checkMIC();
check();
for (i=1; i<50; i++)
{
delay_ms(10);
checkMIC();
check();
}
checkMIC();
check();
}
}
}
void main()
{
setup_adc_ports(sAN0|sAN1|sAN2|sAN3|VSS_VDD);
set_tris_b(0x00);
set_tris_e(0x00);
set_tris_a(0xff);
setup_adc(adc_clock_internal);
output_b(0x00);
output_e(0x00);
count=0;
while (true)
{
checkHP();
}
}
nhưng ko hiểu tại sao khi em thử với tải 60KΩ thì led vẫn sáng.( mặc dù mức ADC của tải này 4.1v=843)
nhờ các bác chỉ giáo.
thanks