Acil yardım gerekiyor analog sensorler sureklı bir gonderiyor

Başlatan muratak, 20 Nisan 2013, 12:35:53

muratak

Merhaba arkadaşlar  dısardan qtr serisi beyaz renge duyarlı analog 3 adet sensorle okuma yaparak iki adet motorun sağ sol çalışma ve hızını yvaslatma işlemi yapmaya çalışıyorum ama adc okunulan senorler sacmalaıyor sıze kodlarımı gonderıyorum bir bakıp nerde hata olduğunu soylersenız sevınırım.


#include <16F877A.h>
#fuses NOWDT                    //No Watch Dog Timer                     //Crystal osc <= 4mhz
#device ADC=10
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected

#use delay(clock=20000000)
int16 sen0=0,sen1=0,sen2=0,sen3=0,sen4=0,sen5=0,sen6=0,sen7=0;
unsigned int toplam1;
signed int16 sag=0,sol=0;
signed int16 hata=0; 
signed int16 PWM=0;
signed int16 toplam=0;
signed int16 kp=13;
void main(void)
{setup_timer_2( T2_DIV_BY_16,249,1);
setup_CCP1(CCP_PWM);
setup_CCP2(CCP_PWM);
setup_adc(adc_clock_internal); //bunumu kullanmlayım
setup_adc(adc_clock_div_2); // yoksa bunumu kullanmalıyım
set_tris_e(0xFF);
set_tris_c(0x00);
set_tris_b(0x00);
output_c(0x00);
output_high(pin_C3);
output_high(pin_C0);

set_pwm2_duty(0);
  set_pwm1_duty(0);

setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); // Timer0 ayarları yapılıyor
   setup_adc_ports(ALL_ANALOG);
   
  // Kp=30;
  // output_high(pin_C3);
  // output_low(pin_C4);
   //output_high(pin_D0);
   //output_low(pin_D1);
   while(true){ 
   set_adc_channel(0);
   sen0=read_adc();
   delay_us(10);
 
   set_adc_channel(1);
  sen1=read_adc();
  delay_us(10);
   set_adc_channel(2);
  sen2=read_adc();
  delay_us(10);
   set_adc_channel(3);
  sen3=read_adc();
  delay_us(10);
   set_adc_channel(4);
  sen4=read_adc();
  delay_us(10);
   set_adc_channel(5);
  sen5=read_adc();
  delay_us(10);
   set_adc_channel(6);
  sen6=read_adc();
  delay_us(10);
   set_adc_channel(7);
  sen7=read_adc();
  delay_us(10);
   

 
   if(sen0>100)sen0=1;
   else sen0=0;
   if(sen1>100)sen1=1;
   else sen1=0;
   if(sen2>100)sen2=1;
   else sen2=0;
     
if(sen0>0||sen2>0||sen1>0){

if(sen0==1){set_pwm1_duty(500);
set_pwm2_duty(1023);}
if(sen1==1){set_pwm1_duty(1023);
set_pwm2_duty(500);}
if(sen2==1){set_pwm1_duty(500);
set_pwm2_duty(500);}
  }
   }

   
}

esensoy

sensör çıkışları çok oynak ise yazılımsal ya da donanımsal filtre uygulanabilir,
ilk gözüme çarpan delay_us ler yanlış yerde, kanal seçiminden sonra olmalı,

ben olsam adc okuma için start verir, okumayı da adc interruptını kurarak yapardım,

filtre için basitçe ortalama alınabilir, ya da algoritmalar kullanılabilir,
https://www.picproje.org/index.php/topic,42574.msg308707.html#msg308707
burada ki filtreyi ben uyguladım, bayağı işe yarıyordu,
En tehlikeli an "zafer" anıdır.

hakansefau

Merhaba, qtr nin modeli nedir acaba? digital olanı olabilir mi ? analog yerine digital olanını kullanıyor olabilir misiniz

muratak

sensorler analog emınım dijital değil bır yardımcı olursanız sevınırım

xoom

sensörler saçmalıyor derken neyi kastediyorsunuz.. Esensoy hocamın dediği gibi adc okuması yaptıktan sonra değil.. yapmadan önce ufak bir bekleme koymalısınız.. birde isis şemanız varsa  ekleyin ne gibi sapıtma var..

fbasaris

.
.
.
.
int qtr_veri;
.
.
.

int adc_oku()
{
set_adc_channel(0);  delay_us(20);   data0=read_adc();
set_adc_channel(1);  delay_us(20);   data1=read_adc();
set_adc_channel(2);  delay_us(20);   data2=read_adc();
set_adc_channel(3);  delay_us(20);   data3=read_adc();
set_adc_channel(4);  delay_us(20);   data4=read_adc();
set_adc_channel(5);  delay_us(20);   data5=read_adc();
set_adc_channel(6);  delay_us(20);   data6=read_adc();
set_adc_channel(7);  delay_us(20);   data7=read_adc();

if(data0<deger) output_bit( PIN_B0, 0); else output_bit( PIN_B0, 1);
if(data1<deger) output_bit( PIN_B1, 0); else output_bit( PIN_B1, 1);
if(data2<deger) output_bit( PIN_B2, 0); else output_bit( PIN_B2, 1);
if(data3<deger) output_bit( PIN_B3, 0); else output_bit( PIN_B3, 1);
if(data4<deger) output_bit( PIN_B4, 0); else output_bit( PIN_B4, 1);
if(data5<deger) output_bit( PIN_B5, 0); else output_bit( PIN_B5, 1);
if(data6<deger) output_bit( PIN_B6, 0); else output_bit( PIN_B6, 1);
if(data7<deger) output_bit( PIN_B7, 0); else output_bit( PIN_B7, 1);

qtr_veri = input_b();
.
.
.

şeklinde veriyi alabilirsiniz..

main içindeki aadc için ayarlarınızda

setup_adc_ports(ALL_ANALOG);// Eğer 8 bit çevrim yapacaksanız analog girişlerin hepsini açmalısınız..
setup_adc(ADC_CLOCK_DIV_2); //

Umarım probleminizi çözersiniz...


muratak

teşekkür ederım ılgınız ıcın bırsey kafama takıldı cevaplandırısanız sevınırım neden PİN B ye yonlendırıyorum onun yerıne herhangı bır degsıkene akatsam olmazmı yoksa pin b ye yonlendırmem dahamı ıyı olur

esensoy

değeri okuduktan sonra ne isterseniz onu yaparsınız
En tehlikeli an "zafer" anıdır.