16F88 ile 4 motorun akım kontrolü

Başlatan . Kağan, 03 Şubat 2014, 22:01:26

ete

#60
ICL7660 entegresi +5V dan -5V üretiyor. Bu durumda OPAMP beslemesini artı eksi simetrik besleme yapmak için kullandınız diye düşünüyorum. Ama bağlantınız yanlış. Opamp + besleme ucuna +5V bağlamanız ve 4 nolu GND bağladığınız pine ise ICL7660 çıkışını bağlamanız gerekirdi. O şekilde bağlayınca çalışıyor.

Bu durumda öyle çalışıtırmayı tercih edelim. Verdiğim şemayı değiştiriyorum.

Ete

. Kağan

#61
Evet farkettim uyarı için teşekkürler. Şemayı zipleyip proteus formatında yüklermisin?

Ete Edit: Dene.rar olarak ekledim

. Kağan

#62

. Kağan

Arkadaşlar bu iş tek kanaldan olmayacak sanırım. Her motoru picin bir kanalına sokup kanalları karşılaştırsak nasıl olur?

Yani picin kanalları gelen voltajları karşılaştıracak ve en küçükten belli bir miktar büyük olanlar için led yakacak.

Ufff. sıktım heralde ama  :)

Hattuşa

çok hassas bir ölçüm aralığınız var, yani 100-200mV luk dediğiniz gibi hepsine ayrı devre kursanız faydalı olur

. Kağan

#65
Öyle yapacağım.

DEFINE ADC_BITS 10      ' ADCIN resolution  (Bits)   
DEFINE ADC_CLOCK 1      ' ADC clock source  (Fosc/8)   
DEFINE ADC_SAMPLEUS 10  ' ADC sampling time (uSec)

ADCON1 = %10011000  ' 1024 (10 BİT) hesaplanacak, AN0, AN1, AN02, AN03 VE AN04 ANALOG, DİĞERLERİ DİJİTAL
ADCON0 = %11000000
OSCCON = %01101100 ' İNTERNAL OSİLATÖRÜ 4mhz' E AYARLA
ANSEL =  %10011111  ' AN0, AN1, AN02, AN03 VE AN04 ANALOG, DİĞERLERİ DİJİTAL    
CMCON = 7           ' KOMPARATÖRLER KAPALI   
TRISA = %11111111   ' RA tamamı GİRİŞ   
TRISB = %00000000   ' HEPSİ ÇIKIŞ
PORTA = 0           ' PORTA SIFIRA ÇEK
PORTB = 0           ' PORTB SIFIRA ÇEK

Bu başlıkta AN00 ile AN04 arası 5 port giriş ve analog ayarlamak istedim. Yanlış bir yer varmı? Proteus " Clock period hatası veriyor. ???

Bu arada http://etepic.com/index.php?topic=368.0 okudum.

. Kağan

Öncelikle basit bir çizim oluşturdum. Bu devrede 2 ledin yanması lazım mesela.

. Kağan

Ayrıca birde şunu sorayım.
Alttaki tablo her PIC için farklımıdır ve pdf sindemi bulunur? Yoksa standart bir tablomudur?

ete

Bu tablo her pic için farklıdır. Bazıları bir birine uyabilir ama yinede data sheetlerine bakmak gerekir. Bu tür bilgiler yalnızca işlemcinin data sheetinde bulunur.

Ete

est32

Çok bilmişlik gibi algılanmasın ama 3-5 bişey yazmak istiyorum.
Evet her işlemcinin kendi datasheetine bakmak gerek. Bu tahminim 877'nin kataloğundan alınmış. Burada 8 analog kanal var. peki 12f675 kullanacak olsak ne olacak. Zaten toplamda 8 bacağı var. 16f84 de analog kanal yok, bu tablo neden olsun. 16F887 de ise 14 adet analog kanal var, bazısında 6 adet PWM kanalı var... sürer gidir. Bu nedenle her işlemcinin ayrı kataloğu vardır, kılavuz onlardır.
Bir işlemci ile projeye başlamadan önce size neler lazım; örneğin 2 analog kanal, 2 HPWM, seri port(sadece RX veya sadece TX veya her ikisi de),5 giriş 10 çıkış, usb, tahmini olarak kullanabileceğiniz bellek miktarı, eeprom ihtiyacı var mı?... bunun gibi.

Önce bu  ihtiyaçları belirleyeceksiniz ve buna göre işlemci seçeceksiniz. Bunlara ek bir de mantığınızı kullanacaksınız. Örneğin bir projemde 7 segment ledlerin parlaklığını PWM ile ortam ışığına göre ayarlayacağım. bunun için bir LDR ve analog işlemci kanalı lazım bana. LDR kolay ama kullanacağım işlemcide analog kanal yok, bu durum da ben de POT komutu ile bir dijital kanalı analog kanala çevirmiş olacağım ve bunun için daha pahalı ve özellikli işlemciden tasarruf etmiş olacağım(bakalım çalışacak mı)...

Bir projeye başlamadan önce işlemcinin tüm özelliklerini gözden geçirmeniz gerek.
İşinize yarasın yaramasın tüm özelliklerine bakmak zorundasınız. En basit örnek şöyle. Bazı işlemciler(analog içeren piclerin sanırım hepsinde kural bu) ilk çalıştırmada analog kanal ile açılış yaparlar. bazıları da analog komparatör ile açılırlar. Benim analogla işim yok deyip datasheetten analog bölümü atlarsanız, yaptığınız cihazın başında saatlerce günlerce dönüp durursunuz neden çıkış alamıyorum diye. Çünkü işlemci pinleri analog olarak açılmıştır ve giriştir, çıkış yapmaz...

Yani kataloğun her kısmına bakmak lazım, cihaz nasıl açılış yapıyor, hangi pini nasıl kullanırım diye...

. Kağan

#70
Aslında tabiki hepsinde aynı tablo olmadığını biliyorum. En azından bacak sayılarından. :)

Ama şu ADCON sayfasını bir arkadaş açıklar diye söyledim.



Kataloğunda 115. sayfada ADCON1: A/D Kontrol register sayfasına bakıyorum. Ama bu tabloyla alakası yok. Baya uğraşıp yukarda ki mesajımda ki ayarları yaptım. Aslında bana 5 analog giriş lazım. Ama A portlarının hepsini açmaya çalıştım. Çünkü nasıl açılacağını anlamakta zorlandım. Aslında AN0-AN4 arasını açabilsem yeterli. Bunun ayarı datasheet in neresinde ???

ete

#71
Data sheet bölüm 12.0. Analog to Digital Converter Modul  diye başlıyor ilgili bölüm. Bu bölüme en baştan bakmak lazım. Zira bu ilk sayfada konuyla ilgili önce hangi registerler var onları açıklıyor. Bunlardan biriside ANSEL yani Analog Select Registeridir. Bir kanalın analog mu yoksa digital mi olacağına bu register karar veriyor. Bu registerin sıfır ile altı bitleri ve arasındakiler kanalların seçimini yapıyor. High olan bitler analog olmuş oluyor.

Ete

. Kağan

#72
  ansel kısmını inceledim. yukarıdaki kodda ANSEL= %10011111 AN0-AN4 arası açık şeklinde anladım. Doğrumu?

Birde kodu 4 kanaldan giriş yapılacak şekilde değiştirdim.

@ __config _CONFIG1, _INTRC_IO & _WDT_ON & _LVP_OFF & _CP_OFF & _MCLR_OFF & _PWRTE_ON  & _WRT_PROTECT_OFF

DEFINE ADC_BITS 10      ' ADCIN resolution  (Bits)   
DEFINE ADC_CLOCK 1      ' ADC clock source  (Fosc/8)   
DEFINE ADC_SAMPLEUS 10  ' ADC sampling time (uSec)

ADCON1 = %10011000  ' 1024 (10 BİT) hesaplanacak, AN0, AN1, AN02, AN03 VE AN04 ANALOG, DİĞERLERİ DİJİTAL
ADCON0 = %11000000
OSCCON = %01101100 ' İNTERNAL OSİLATÖRÜ 4mhz' E AYARLA
ANSEL =  %10011111  ' AN0, AN1, AN02, AN03 VE AN04 ANALOG, DİĞERLERİ DİJİTAL, DİĞERLERİ DİJİTAL    
CMCON = 7           ' KOMPARATÖRLER KAPALI   
TRISA = %00011111   ' RA0-RA4 arası tamamı GİRİŞ   
TRISB = %00000000   ' HEPSİ ÇIKIŞ
PORTA = 0           ' PORTA SIFIRA ÇEK
PORTB = 0           ' PORTB SIFIRA ÇEK

Pause 100 ' 100 ms AÇILIŞ GECİKMESİ

               
        LED_SOL_ON      VAR PORTB.4  ' UYARI LEDLERİNİN ÇIKIŞ UÇLARI
        LED_SAG_ON      VAR PORTB.5   
        LED_SOL_ARKA    VAR PORTB.6
        LED_SAG_ARKA    VAR PORTB.7  
        
    
        OLCUM_A       VAR WORD         ' HESAPLAMA İŞLEMLERİNDE VERİ ALACAK
        OLCUM_B       VAR WORD
        OLCUM_C       VAR WORD
        OLCUM_D       VAR WORD
        BATT_OLCUM    VAR WORD    ' PİL SEVİYESİ ÖLÇÜMÜ İÇİN ANALOG GİRİŞ PİNİ PORTA.1 ve GİRİŞE AÇIK OLACAK.
        
        FARK_A        VAR BYTE
        FARK_B        VAR BYTE
        FARK_C        VAR BYTE
        FARK_D        VAR BYTE
        EN_KUCUK      VAR byte
        I             VAR WORD    ' DIŞARDAN ALINACAK VERİLERİN ADLANDIRMALARI
        

        I               = 0
        OLCUM_A         = 0
        OLCUM_B         = 0
        OLCUM_C         = 0
        OLCUM_D         = 0
        FARK_A          = 0
        FARK_B          = 0
        FARK_C          = 0
        FARK_D          = 0
        EN_KUCUK        = 0
        BATT_OLCUM      = 0
       
              

'*******************************************************************************            
     MAIN:  

      ' BURADAN SONRA AKIM HESAPLAMA BAŞLIYOR.
                               
                 
            FOR I = 0 TO 50         '50 KEZ OKU VE ADCIN 0 DEN OKUYUP OLCUM_A'YA YAZ..
                ADCIN 0 , OLCUM_A
                NEXT I
            IF OLCUM_A < 10 THEN OLCUM_A = 0   'EĞER ÖLÇÜM OLCUM_A "10" DAN KÜÇÜKSE SIFIR KABUL ET 
                PAUSE 2
                
                           
'*******************************************************************************     
       
                           
            FOR I = 0 TO 50           '50 KEZ OKU VE ADCIN 1 DEN OKUYUP OLCUM_B'YE YAZ.
                ADCIN 1 , OLCUM_B
                NEXT I
            IF OLCUM_B < 10 THEN OLCUM_B = 0
            
                PAUSE 2
        
'*******************************************************************************             
            
      
            FOR I = 0 TO 50             '50 KEZ OKU VE ADCIN 2 DEN OKUYUP OLCUM_C'YE YAZ.
                ADCIN 2 , OLCUM_C  
                NEXT I
            IF OLCUM_C < 10 THEN OLCUM_C = 0 
               
                PAUSE 2
         
'*******************************************************************************             
            
                        
            FOR I = 0 TO 50              '50 KEZ OKU VE ADCIN 3 DEN OKUYUP OLCUM_D'YE YAZ.
                ADCIN 3 , OLCUM_D
                NEXT I
                IF OLCUM_D < 10 THEN OLCUM_D = 0
            
                PAUSE 2
                
            
'*******************************************************************************            
     ' BURADAN SONRA SONUÇ YORUMLAMA BAŞLIYOR.     
'*******************************************************************************            
       
'************************************************************************
  
  ' BURADA EN_KUCUK DEĞER İLE DİĞER 3 DEĞER ARASINDAKİ FARK BULUNUYOR.
  ' EN KÜÇÜKTEN DAHA BÜYÜK OLANLARI BUL
                 
               
    EN_KUCUK=255
    
            IF OLCUM_A<EN_KUCUK THEN EN_KUCUK = OLCUM_A        '4 DEĞERDEN EN KÜÇÜK OLANI BUL
            IF OLCUM_B<EN_KUCUK THEN EN_KUCUK = OLCUM_B
            IF OLCUM_C<EN_KUCUK THEN EN_KUCUK = OLCUM_C
            IF OLCUM_D<EN_KUCUK THEN EN_KUCUK = OLCUM_D
            
        
'*******************************************************************************
            
      ' BURADAN SONRA DEĞERLENDİRME SOMUT RAKAMLAR ve SONUCA DÖNÜŞÜYOR. 
      ' HANGİLERİ EN KÜÇÜK DEĞERDEN 3 BÜYÜKSE O LEDLERİ YAK.
            
              IF FARK_A > 1 THEN  LED_SOL_ON=1 
                  
              IF FARK_B > 1 THEN  LED_SAG_ON=1 
                   
              IF FARK_C > 1 THEN   LED_SOL_ARKA =1
  
              IF FARK_D > 1 THEN   LED_SAG_ARKA =1

              IF LED_SOL_ON=1 OR LED_SAG_ON=1 OR LED_SOL_ARKA =1 OR LED_SAG_ARKA =1 THEN  
              
              PAUSE 20000 
                    
                    LED_SOL_ON=0:LED_SAG_ON=0:LED_SOL_ARKA =0: LED_SAG_ARKA =0
              ENDIF      
                
 GOTO MAIN

'***********************************************
PIL:

        ADCIN 4, BATT_OLCUM        'AN1 DEN GİREN 5V BATT_OLCUM'E YAZ
        
        IF BATT_OLCUM < 683 AND BATT_OLCUM > 400 THEN     'EĞER BATT_OLCUM 633 DEN (9 VOLTTAN 6 VOLTA) AŞAĞI DÜŞERSE
            HIGH LED_SOL_ON        'TÜM LEDLERİ FLAŞ YAPTIR.
            PAUSE 300
            toggle LED_SOL_ON
            
            HIGH LED_SAG_ON 
            PAUSE 300
            toggle  LED_SAG_ON
            
            HIGH LED_SOL_ARKA 
            PAUSE 300
            toggle LED_SOL_ARKA 
            
            HIGH LED_SAG_ARKA 
            PAUSE 300
            toggle  LED_SAG_ARKA
        ENDIF
        
        
        GOTO MAIN
'***********************************************    



Bu bağlantıda yukardaki kodla 4 ve 4,5v olan portların birer led yakması lazım ama yanmıyor. :(

EDİT: Bu devrede komparatör kullanmak gerekir mi?

EDİT: Evreka  Bulduum.! Kodların arasından fark satırlarını yanlışlıkla silmişim.

  IF OLCUM_A > 0 THEN 
                    FARK_A = OLCUM_A - EN_KUCUK
                ELSE
                    FARK_A = 0
                ENDIF
                
                IF OLCUM_B > 0 THEN 
                    FARK_B = OLCUM_B - EN_KUCUK
                ELSE
                    FARK_B = 0
                ENDIF
                
                IF OLCUM_C > 0 THEN 
                    FARK_C = OLCUM_C - EN_KUCUK
                ELSE
                    FARK_C = 0
                ENDIF
                
                IF OLCUM_D > 0 THEN 
                    FARK_D = OLCUM_D - EN_KUCUK
                ELSE
                    FARK_D = 0
                ENDIF

satırlarını ekleyince yandııııı. Şimdi çok mutlu oldum işte. Teşekkürler arkadaşlar.

Powered by EzPortal