Pic-Adc-Akü

Başlatan oguztkn, 22 Şubat 2020, 02:05:30

oguztkn

#15
o zaman hocam,

ACS çıkışını 2k2 -> 10k ile
                 -bu aradan ise pic e girsem.5 voltta karşılık 4098mv'a geliyor ve işimi görecektir.
Ama bunu yaptığımda da ABS de yaptığım işlem değişmesi gerek sanırım

ete

#16
ABS işlemi değişmeyecek. Değişmeyecek derken orta noktan elbette değişecek. Boşta yani 2,5 v un gerilim bölme ile kaça düştüğünü bul yada hesapla ona karşılık gelen adc seğerini bul ve abs formülünü bu değere göre yeniden ayarla..

Ete

oguztkn

ABS işlemini hallettim hocam. 512 yerine 502 çıkarınca sağlıklı çalışmaya başladı.

Şimdi ise sırada motor sürücüyü pwm ile kullanmaya geldi. İşlemcim 16f1938 ve pinim ise PORTC.7 yani CCP3 kanalı.

sırasıyla


DEFINE CCP3_REG PORTC
DEFINE CCP3_BIT 6
 
APFCON.6=0 bu ayar ile CCP3'ün PORTC.6 dan kullanılmasını sağlıyorum

CCP3AS.7=0
CCP3AS.6=0
CCP3AS.5=0  Bu satırlar PWM AutoShutdown diye geçiyor hepsini kapattım
CCP3AS.4=0

CCPTMRS0.5=0
CCPTMRS0.4=0 Bu iki satır ile de CCP3 kanalının timer2 için ayarlıyorum.

T2CON=%00000110
PR2=249            Timer2'yi açıp önyükleme yapıyorum.

Sonrasında ise ;
            PORTA.1=1:PORTA.2=0 -> Yön seçiyorum
            X=(PR2+1)* PWMDEGER /25                     
            CCP3CON.4=X.0
            CCP3CON.5=X.1
            CCPR3L=x>>2     
            CCP3CON.2=1
            CCP3CON.3=1     ' Durdurmak için ise bu iki satırı 0 yapıyorum

Bu komutlarla çıkışı başlatıyorum. Fakat çıkış sanki güç kaynağı göçüyormuş gibi sürekli aç-kapa şeklinde çalışıyor tepe noktaya hiç gelemiyor.Hatta bu durum timer1'in çalışmasını engelliyor ve program buga giriyor. Beslemem 15A smps ve yüküm 2A lik bir lamba halbuki.

Bunun nedenini bulamadım bu konuda yardımcı olabilir misiniz acaba ?


 

ete

#18
Bu işlemcide üçüncü pwm kanalı olduğundan eminöisin yoksa enhanced pwm si mi vr acaba . Öyle ise pwm3 yalnızca h-köprü sürmede kullanılabiliyor. Normal pwm ler için pwm1 ve pwm2 kanallarından birini dene anlarsın.
Ete

Not: şimdi baktım Data sheet'e normal olarak bu işlemcide PWM3 kanalı mevcut. Biraz gelişmiş bir işlemci gibi gözüküyor. Bu nedenle standart PWM işlemlerine de baktım. Data sheet aşağıdaki şekilde yapın diyor. BU arada sen Bir PORTC.7 bir PORTC.6 demişsin. Doğru pin PORTC.6 olacak burada bir hata olmasın dikkat et.

1. Önce TRISC.6=1 vererek PWM pininin çıkış özelliğini kapatıyoruz.
2. Timer Seçme registeri olan CCPTIMERSx registerinden C3TSEL biti üzerinden Bu kanal için hangi timer kullanılacak seçiyoruz.CCPTIMERS0=%00000000
3. PRx registerine (x burada seçtiğimiz seçtiğimiz Timer olacak) gerekli değeri vererek frekansı belirliyoruz.PR2=249, Burada T2CON registerine de T2CON=%00000110 değerini vermek gerekir.
4. CCP3CON registerine değer vererek PWM yi aktif ediyoruz. Burası önemli . Diğer lerinde PWM modülünü buradan aktif ederken çok özellikli olması nedeni ile burada registere dikkatlice değer vermek gerekiyor. Benim tespitim şu şekilde oldu, CCP3CON=%11110000
5. CCPRXL ve DCxBx bitlerine Duty değerini vereceğiz.
   Duty=(PR2+1)*%DUTY/25) şeklinde hesaplanacak. %Duty=50 olsun diyelim.
   Duty=(250*50)/25=500 olarak hesaplanacaktır. Duty değişkeninin Word cinsinden olması gerekir buna dikkat etmek gerekiyor.
Böylece önce DCxBx bitleri olan CCP3CON registeri 5 ve 4 nolu bitlerine Duty değerinin ilk iki bitini vermemiz gerekiyor. CCP3CON.4=Duty.0 ve CCP3CON.5=Duty.1 şeklinde bunu yapıyoruz.
Ardından Duty değerini 2 bit sağa kaydırıp 10 bit den 8 bite indirgiyoruz ve bunu da CCPR3L registerine veriyoruz. DUTY=DUTY>>2,  CCPR1L = DUTY
6.PIR1TMR2IF bitini temizleyip PIR1.1=0 ardından
7. OUTPUT PORTC.6 komutu ile PWM3 pinini aktif etmek gerekiyor.
Hepsi bu kadar.
Yön seçme vs bu seçimde olmamalı. Diğer parametrelerde bu seçimde geçersiz.
Bu açıklamalara göre yeniden dene istersen.

Ete


oguztkn



Buradan yola çıkmıştım hocam h-köprüsü icin olan PA özelliği sanırım. Ccp3 diye belirtmiş ayrıca

ete

Mesajında,  PORTC.7 yani CCP3 kanalı. şeklinde bir cümle kullanmışsın. Yanlışlıkla oldu belkide. Buradaki PORTC.7 yerine PORTC.6 yazman gerekir.
Yukardaki mesajıma ekleme yaptım. Onları yeniden oku tekrar dene istersen. Standart PWM ile Enhanced PWM yi ayırmak gerekiyor.
Ete

oguztkn

#21
Hocam, pwm konusunda dediğiniz şekilde yok alınca sorunu hallettim yalnız şöyle bir problemim var.

Motor kormas marka 24v redüktör, ekte resmi mevcut. Bu motoru BTS7960 ile sürüyorum. Pwm olmadan direk enable high ve sağ sol için yön seçip çalıştırıyorum. Motorun yönünü ben anahtar ile belirlediğimden enkoderin tek kanalını PORTB.0 kesmesine bağlıyorum. Programda enkoderi bağlamazsam normal bir şekilde çalışıyor fakat enkoderin bağlayıp PORTB.0 kesmesini açınca puls'i sayıyor ama motor arada tık tık tekliyor gibi sanki butonu bırakmış gibi davranıyor. Aklıma şu geldi enkoder 100puls acaba pic sürekli puls saymaktan ana programı aksatıyor olabilir mi ? Bts'yi isis te simüle edemeyeceğimden direk devre üzerinde deniyorum.

;  PORTC.6 BTS_EN CCP3   
;  PORTB.1 ENKODER A
;  PORTB.0 ENKODER B     
;  PORTA.1 BTS_LEFT         
;  PORTA.2 BTS_RIGHT 


ASM
    __config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_ON & _CPD_ON & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF 
    __config _CONFIG2, _WRT_OFF & _VCAPEN_OFF & _PLLEN_ON & _STVREN_OFF & _BORV_19 & _LVP_OFF
endasm

define OSC 32
DEFINE LCD_DREG PORTC
DEFINE LCD_DBIT 0
DEFINE LCD_EREG PORTA
DEFINE LCD_EBIT 6
DEFINE LCD_RSREG         PORTA
DEFINE LCD_RSBIT     7
DEFINE LCD_BITS 4
DEFINE LCD_LINES     2

OSCCON =%11110000:OSCSTAT=%00000000:OSCTUNE=%00011111
APFCON.6=0

TRISA=%00110000:ANSELA=%00000000:PORTA=%00000001
TRISB=%00110101:ANSELB=%00110000:PORTB=0
TRISC=%00110001:PORTC=%10000001:WPUB=%00000000
                      
INTCON=%11010000
PIE1=%00000000
PIE2=%00000000
PIE3=%00000000
PIR1=%00000000
PIR2=%00000000
PIR3=%00000000
IOCBP=%00000000
IOCBN=%00000000

FVRCON=%10000011
ADCON0=%00000001:ADCON1=%10100011
DACCON0.7=0:CM1CON0.7=0:SRCON0.7=0
CCPTMRS0.5=0:CCPTMRS0.4=0:CCP3AS=%00000000:CPSCON0.7=0:LCDCON.7=0:RCSTA.7=0
lcdout $FE,1
pause 300

on interrupt goto KESME

Basla:

      lcdout $FE,$C0,dec5 sayac

      if PORTC.5=0 and PORTC.4=1 then        
            
            PORTA.1=0:PORTA.2=1:PORTC.6=1
      endif

    if PORTC.5=1 and PORTC.4=0 and aku_kilit=0 and minlimit=0 then
            PORTA.1=1:PORTA.2=0:PORTC.6=1
              endif
    
  if  PORTC.5=1 and PORTC.4=1 then
            PORTA.1=0:PORTA.2=0:PORTC.6=0
  endif


goto basla


DISABLE
KESME:
        if INTCON.1=1 then
          sayac=sayac+1
        INTCON.1=0
        endif
RESUME
ENABLE
end

     

Bu hali ile çalıştırırsam dediğim sorun oluyor ama kesmeyi kapatırsam sorun yok


ete

Kesme kısmında gecikme yaratacak bir komut göremedim. Ancak komut satırları bence kusurlu.
KESME:
        if INTCON.1=1 then
          sayac=sayac+1
        INTCON.1=0
        endif
RESUME
ENABLE
Kesme için yalnızca INT kesmesini aktive etmiş isen artık kesme içinde bir de IF kulanmak yersiz ve boşuna zaman kaybı olur. O satırları şöyle değiştir
KESME:
          sayac=sayac+1
        INTCON.1=0
RESUME
ENABLE
Motor akımına dikkat ediyorsun değilmi. O motor 60 watt lık ve en azından 24 Volt da 2,5A akım çeker.
Ete

ahmet_zxc

#23
...

oguztkn

#24
Alıntı yapılan: ete - 02 Nisan 2020, 15:47:01Kesme kısmında gecikme yaratacak bir komut göremedim. Ancak komut satırları bence kusurlu.
KESME:
        if INTCON.1=1 then
          sayac=sayac+1
        INTCON.1=0
        endif
RESUME
ENABLE
Kesme için yalnızca INT kesmesini aktive etmiş isen artık kesme içinde bir de IF kulanmak yersiz ve boşuna zaman kaybı olur. O satırları şöyle değiştir
KESME:
          sayac=sayac+1
        INTCON.1=0
RESUME
ENABLE
Motor akımına dikkat ediyorsun değilmi. O motor 60 watt lık ve en azından 24 Volt da 2,5A akım çeker.
Ete
( TMR0 kesmesini de kullanacağım ama bu sorunla karşılaşınca onu kaldırdım o yüzden if satırı kaldı hocam)

24v 15 amper smps ile besliyorum hocam. O konuda rahatım. Enkoder ucunu tmr1 girişine bağlayınca sorunsuz çalışıyor devre ama PORTB.0 olunca sürekli onu okumaktan normal işleri yapamıyor. Alternatif ne yapabilirim acaba ?

enkoder 100 puls denmiş ama redüktor oranı 1/15 olduğundan 1500 pulslere geliyor bir tur.

ete

1500 puls tur başına elbette bir program için sorun olabilir. Ancak yinede program komutlarının yerine getirilmesi için engel olmaz diye düşünüyorum. Kesme iptal edilince sorun ortadan kalkıyor ise sorun kesmede demek oluyor. Bulması zor kusurlardan birisi.
Bir fikir yürütemiyorum maalesef. Genelde bu tür sorunları devre üzerinde çalışırken çözmek mümkün oluyor. Çeşitli alternatifler deniyorsun sorunu buluyorsun ve çözüm getiriyorsun. Şimdi burada sorun kesme ise ne çözüm getirebilirsinki?. Kesme lazım ise çözümde yok demektir. Çok mantıklı gelimiyor yinede bana. Ama bir çözümde öneremiyorum maalesef.

Ete

oguztkn

#26
Hocam durumu çözmek adına bir şeyler deniyorum. Ama doğru yoldamıyım emin değilim.

Amacım şu programın başına ben motora bir yol aldıracağım mesela 15600 puls yukarı çık şeklinde. ( Aşağıdaki örnekteki gibi). Sonrasında ileri geri butonları ile motoru bu aralıklar arasında çalışmasını sağlamak.

Alttaki örnekte sıfıra inme durumunu bazen görüyor motoru durduruyor ama bazende görmüyor ? Yukarı çıkma durumunu ise hiç çalıştıramadım. Motor yolun arasında bir yerde durduğunda da o konumu eproma yazıp kapatıp açıldığında tekrar yol içinde kalmasına çalışacağım ama daha en alt ve en üst konumları çalıştıramadım. İmkansıza mı uğraşıyorum ? 



ASM
    __config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_ON & _CPD_ON & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF 
    __config _CONFIG2, _WRT_OFF & _VCAPEN_OFF & _PLLEN_ON & _STVREN_OFF & _BORV_19 & _LVP_OFF
endasm

define OSC 32
DEFINE LCD_DREG PORTC
DEFINE LCD_DBIT 0
DEFINE LCD_EREG PORTA
DEFINE LCD_EBIT 6
DEFINE LCD_RSREG        PORTA
DEFINE LCD_RSBIT    7
DEFINE LCD_BITS 4
DEFINE LCD_LINES    2

OSCCON =%11110000:OSCSTAT=%00000000:OSCTUNE=%00011111
APFCON.6=0

TRISA=%00110000:ANSELA=%00000000:PORTA=%00000001
TRISB=%00110101:ANSELB=%00110000:PORTB=0
TRISC=%00110001:PORTC=%10000001:WPUB=%00000000
                      
INTCON=%11100000
PIE1=%00000000
PIE2=%00000000
PIE3=%00000000
PIR1=%00000000
PIR2=%00000000
PIR3=%00000000
IOCBP=%00000000
IOCBN=%00000000

FVRCON=%10000011
ADCON0=%00000001:ADCON1=%10100011
DACCON0.7=0:CM1CON0.7=0:SRCON0.7=0
CCPTMRS0.5=0:CCPTMRS0.4=0:CCP3AS=%00000000:CPSCON0.7=0:LCDCON.7=0:RCSTA.7=0


OPTION_REG=%10001000
TMR0=248                ;1us lik Timer

lcdout $FE,1
pause 300

on interrupt goto KESME

set_puls=15600 ( bu word tipinde)

Basla:


      if PORTC.5=0 and PORTC.4=1 and maxlimit=0 then        
            ileri=1
            if bayrak=0 then TMR1=arti:bayrak=1
            PORTA.1=0:PORTA.2=1:PORTC.6=1
            arti=TMR1
      endif

    if PORTC.5=1 and PORTC.4=0 and minlimit=0 then
          geri=1
          if bayrak=0 then TMR1=eksi:bayrak=1  
          PORTA.1=1:PORTA.2=0:PORTC.6=1
          eksi=TMR1
      endif
    
  if  PORTC.5=1 and PORTC.4=1 then
      bayrak=0:ileri=0:geri=0
      PORTA.1=0:PORTA.2=0:PORTC.6=0
  endif


goto basla


DISABLE
KESME:
              
      if set_puls-eksi=0 then minlimit=1:maxlimit=0:eksi=0 
      if arti>=set_puls then minlimit=0:maxlimit=1:arti=set_puls  

      INTCON.2=0:TMR0=248

RESUME
ENABLE
end

Şimdiden Teşekkürler....

ete

BU şekilde çalışmamız mümkün değil. Ne verdiğin program parçaları tam neden bir şema var ortada. Neye göre düşünüp yorum yapacağım ben? yapamıyorum. Kafaya oturmuyor.
Program parçası veriyorsun değişkenleri tamamen çıkartıyorsun. Ya daha başka şeylerde çıkartıyorsan yani gerekli bazı komutlarıda çıkartıyorsan. Kim nereye bağlı kim motoru ileri kim geri görürüyor hiç biri belli değil.
Komutlara bakıyorum bir sürü şart biti kullanıyorsun. Bir motoru ileri götmek için şu olsun vede şuda olsun olmadı şuda olursa ancak ileri git denilmesi hoş değil. Daha basit mantıklar kurmalısın. Ayrıca,
if set_puls-eksi=0 then minlimit=1:maxlimit=0:eksi=0 
şeklinde bir karşılaştırma komutu kullanmayı bırak bu tür kullanım yalnızca tek şart varsa geçerlidir. Sende "then" den sonra 3 şart daha var. İşin doğrusu,
if set_puls-eksi=0 then 
  minlimit=1:maxlimit=0:eksi=0 
endif
şeklindedir.

Programda ;
OPTION_REG=%10001000
TMR0=248
satırlarını görüyorum. Karşısında 1us lik timer denilmiş. Bu yaklaşık olarak 1,8us lik timer değeridir. Bu kadar küçük bir zaman aralığında kimin ne iş yapmasını beklersinki. Ben beklemezdim doğrusu. O zaman aralığında işlenecek komutların süresi en azından bir kaç yüz us eder zaten. O halde komut gecikmelerinide hesaba katarak zaman ayarı yapmak gerekir. Şunu demek istiyorum. Sen 1us lik bir kesme yaratsanda kesme içindeki komutların 100us zaman harcayacak ve ikinci kesmen zaten 100+1us sonra gerçekleşecek demektir. Bu durumda mantıklı olan senin her 100 yada ne bileyim 110 us de bir kesme yaratmandır.

Programın tamamını vermek istemeyişine sagı duyarım. Ama o durumda spesifik bir konuya ilişkin soru sorabilirsin ancak ABS ile ilgili sorun gibi. Şimdi ise hem programı vermiyorsun şema vermiyorsun ve bana motoru ileri geri neden götüremiyorum diyorsun bu adil değil.
SOnuçta verdiğin kadar alırsın. Şimdi sen düşüneceksin neden olmadığını. Daha fazla destek veremeyeceğim maalesef.

Ete

Powered by EzPortal