avatar_elektro77

PCA9685 Kullanımı

Başlatan elektro77, 05 Eylül 2022, 17:13:12

ete

Bu entegreyi tanımadığımı en baştan söylemiştim. Yinede yardımcı olabilirmiyim diye şöyle bir baktım data sheet'e. Ortada bir formül var,

Prescaler Value=Round(OSC_CLOCK/4096*Update_value)-1
Frekans içinde bu formülü veriyor. Peki Udate_Value nedir onu anlamadım. Sanki bu ulaşılması gereken frekans gibi algılıyorum ama neden update değeri deniliyor orasını anlamadım. Belki bütün datasheet i okursam anlarım ama gözüm yemiyor doğrusu.

Bir deneme yapayım dedim. OSC_CLK olarak 25 Mhz lik dahili OSC den bahsediliyor ve onu kullanıyorlar. O tamam. 4096 zaten sabit değer. Bir takım değerler hesaplamışlar bu fomül ile,
mesela default frekans olan 200 Hz için bu formül ile Prescaler değerini $03 hesaplamış ama nasıl belli değil zira;
Prescaler=yuvarla(25.000.000/4096x200)-1= 3 çıkmıyor 30 çıkıyor. 3 değerini nasıl bulmışlar biri bana söylesin lütfen.

Aynı şekilde min. frekans olan 24 Hz içinde aynı hesabı yapalım bakalım ne çıkacak;
Prescaler=Yuvarla(25.000.000/4096 x 24)-1=253 çıkıyor onlar 255 diyor.
Anlamadım kim nedir nasıl hesaplanıyor bilemiyorum.
Bu formül ile 25 Hz için prescaler hesabı yapalım;
Prscl=(25000000/4096*25)-1=243
aynı hesabı 150 Hz için yapalım;
prscl=(25000000/4096*150)-1=40
Bu durumda senin frekans hesabın 40 ile 243 arasında prescaler değeri alacak demektir.
Değer azaldıkça frekansın yüksek  (ters orantılı) değer arttıkça frekansın düşük çıkacaktır.
Bu durumda 243 yerine 245 kullan ve 40dan başlayarak beşer beşer artır ama 245 i aşma , geri düşürürkende 40 dan aşağı düşmezsin olur biter.

Ete


elektro77

#31
Alıntı yapılan: ete - 27 Eylül 2022, 14:37:36Bu entegreyi tanımadığımı en baştan söylemiştim. Yinede yardımcı olabilirmiyim diye şöyle bir baktım data sheet'e. Ortada bir formül var,

Prescaler Value=Round(OSC_CLOCK/4096*Update_value)-1
Frekans içinde bu formülü veriyor. Peki Udate_Value nedir onu anlamadım. Sanki bu ulaşılması gereken frekans gibi algılıyorum ama neden update değeri deniliyor orasını anlamadım. Belki bütün datasheet i okursam anlarım ama gözüm yemiyor doğrusu.

Bir deneme yapayım dedim. OSC_CLK olarak 25 Mhz lik dahili OSC den bahsediliyor ve onu kullanıyorlar. O tamam. 4096 zaten sabit değer. Bir takım değerler hesaplamışlar bu fomül ile,
mesela default frekans olan 200 Hz için bu formül ile Prescaler değerini $03 hesaplamış ama nasıl belli değil zira;
Prescaler=yuvarla(25.000.000/4096x200)-1= 3 çıkmıyor 30 çıkıyor. 3 değerini nasıl bulmışlar biri bana söylesin lütfen.

Aynı şekilde min. frekans olan 24 Hz içinde aynı hesabı yapalım bakalım ne çıkacak;
Prescaler=Yuvarla(25.000.000/4096 x 24)-1=253 çıkıyor onlar 255 diyor.
Anlamadım kim nedir nasıl hesaplanıyor bilemiyorum.
Bu formül ile 25 Hz için prescaler hesabı yapalım;
Prscl=(25000000/4096*25)-1=243
aynı hesabı 150 Hz için yapalım;
prscl=(25000000/4096*150)-1=40
Bu durumda senin frekans hesabın 40 ile 243 arasında prescaler değeri alacak demektir.
Değer azaldıkça frekansın yüksek  (ters orantılı) değer arttıkça frekansın düşük çıkacaktır.
Bu durumda 243 yerine 245 kullan ve 40dan başlayarak beşer beşer artır ama 245 i aşma , geri düşürürkende 40 dan aşağı düşmezsin olur biter.

Ete


Datasheeti yanlış yazmış olabilirler. 30 yerine 3 yazmışlar galiba.
Hocam yazdıklarınızı çok iyi anladım. Teşekkür ederim. Fakat 40-245 arasında 205 adet değer var ama, 1er Hz değişim istesek 25-150Hz arası ise 125 adet değer oluyor. Bu ikisini nasıl orantılayacağım? sanki ondalıklı bir formül yapmak gerek gibi geliyor bana.
Aslında Pic16f1789 kullanıp bu işi bitirmek istiyordum ama onu da piccit2 de programlayamıyorum. Bu nedenle tekrar PCA ya dönüş yaptım gibi.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Prescaler in her birim değişiminin karşılığı 1 HZ olacağını sanmıyorum.
Çok gerekli ise sen 25 den başlayarak 150 ye kadar her bir hz için prescaler değerini hesapla ve bir tablo oluştur. ALinde 125 tane data olacak ve bunlara karşılık gelen prescaler değerleri olacak onları kullanırsın. Lookup tablosu şeklinde.

Ete

elektro77

#33
Alıntı yapılan: ete - 27 Eylül 2022, 17:13:04Prescaler in her birim değişiminin karşılığı 1 HZ olacağını sanmıyorum.
Çok gerekli ise sen 25 den başlayarak 150 ye kadar her bir hz için prescaler değerini hesapla ve bir tablo oluştur. ALinde 125 tane data olacak ve bunlara karşılık gelen prescaler değerleri olacak onları kullanırsın. Lookup tablosu şeklinde.

Ete
Köşeli parantez içinde ondalıklı sayıyı nasıl kullanacağım? Çünkü ondalıklı sayılar çıkacak gibi. Deneyeceğim
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

mehmet

0xFE registeri tam sayı kabul ediyor zaten.
3-253 arasında olabiliyor.
Alttaki tabloda hesaplamaya çalıştım.

ODF:
https://disk.yandex.com.tr/i/XcIObNvR3HBbLQ

XLSX:
https://disk.yandex.com.tr/i/zOGJqItUJb8UNQ
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

elektro77

#35
Bende aşağıdaki şekilde bir formül yazıp pbp ye hesaplattım. Evet tam sayı harici kabul etmiyor.
sayi var byte:sayi=24
i var word :i=0
a var word :a=0

BASLA:
'FREKANS ARTIRMA
IF FRQ_ARTIR=1 THEN
while FRQ_ARTIR=1:wend  
sayi=Sayi+1
if sayi=151 then sayi=150
a=(4096/10*sayi)/100
a=25000/a
FRQ_DEGER=a
pause 20
i2cread sda,scl,pcaAddress,$00,[K] '$00 NOLU REGISTERI OKU VE K DEGİSKENINE AT
K.4=1 'K NIN 4.BITI VE 7.BİTİNİ 1 YAP
K.7=1
pause 20
I2CWRITE SDA,SCL,pcaAddress,$00,[K]'YENI K DEGERINI PCA YA AT VE CIHAZI CLOCK AYAR MODUNA GETİR
pause 20
I2CWRITE SDA,SCL,pcaAddress,$FE,[FRQ_DEGER]'50 HZ CLOCK DEGERI ICIN $FE REGISTERINE $7A YAZ
K.4=0'SIMDI K NIN 4. BITINI 0 YAP CIHAZI RESETLEMEK ICIN
I2CWRITE SDA,SCL,pcaAddress,$00,[K]'CIHAZI RESETLE
ENDIF
''-------------------------------------------------------------------------------------
''FREKANS AZALTMA
IF FRQ_AZALT=1 THEN 
while FRQ_AZALT=1:wend 
sayi=Sayi-1
if sayi=24 then sayi=25
a=(4096/10*sayi)/100
a=25000/a
FRQ_DEGER=a
pause 20
i2cread sda,scl,pcaAddress,$00,[K] '$00 NOLU REGISTERI OKU VE K DEGİSKENINE AT
K.4=1 'K NIN 4.BITI VE 7.BİTİNİ 1 YAP
K.7=1
pause 20
I2CWRITE SDA,SCL,pcaAddress,$00,[K]'YENI K DEGERINI PCA YA AT VE CIHAZI CLOCK AYAR MODUNA GETİR
pause 20
I2CWRITE SDA,SCL,pcaAddress,$FE,[FRQ_DEGER]'50 HZ CLOCK DEGERI ICIN $FE REGISTERINE $7A YAZ
K.4=0'SIMDI K NIN 4. BITINI 0 YAP CIHAZI RESETLEMEK ICIN
I2CWRITE SDA,SCL,pcaAddress,$00,[K]'CIHAZI RESETLE
ENDIF

Edit: Aşağıdaki şekilde daha anlaşılır oldu:
frekans var byte:frekans=25
a var word :a=0
pAUSE 300
LCDOUT $FE,1
'**********************************************************************************
BASLA:
'FREKANS ARTIRMA
IF FRQ_ARTIR=1 THEN
while FRQ_ARTIR=1:wend  
frekans=frekans+1
if frekans=151 then frekans=150
a=(4096/10*frekans)/100
a=25000/a
prescaler=a
pause 20
i2cread sda,scl,pcaAddress,$00,[K] '$00 NOLU REGISTERI OKU VE K DEGİSKENINE AT
K.4=1 'K NIN 4.BITI VE 7.BİTİNİ 1 YAP
K.7=1
pause 20
I2CWRITE SDA,SCL,pcaAddress,$00,[K]'YENI K DEGERINI PCA YA AT VE CIHAZI CLOCK AYAR MODUNA GETİR
pause 20
I2CWRITE SDA,SCL,pcaAddress,$FE,[prescaler]'50 HZ CLOCK DEGERI ICIN $FE REGISTERINE $7A YAZ
K.4=0'SIMDI K NIN 4. BITINI 0 YAP CIHAZI RESETLEMEK ICIN
I2CWRITE SDA,SCL,pcaAddress,$00,[K]'CIHAZI RESETLE
ENDIF
''-------------------------------------------------------------------------------------
''FREKANS AZALTMA
IF FRQ_AZALT=1 THEN 
while FRQ_AZALT=1:wend 
frekans=frekans-1
if frekans=24 then frekans=25
a=(4096/10*frekans)/100
a=25000/a
prescaler=a
pause 20
i2cread sda,scl,pcaAddress,$00,[K] '$00 NOLU REGISTERI OKU VE K DEGİSKENINE AT
K.4=1 'K NIN 4.BITI VE 7.BİTİNİ 1 YAP
K.7=1
pause 20
I2CWRITE SDA,SCL,pcaAddress,$00,[K]'YENI K DEGERINI PCA YA AT VE CIHAZI CLOCK AYAR MODUNA GETİR
pause 20
I2CWRITE SDA,SCL,pcaAddress,$FE,[prescaler]'50 HZ CLOCK DEGERI ICIN $FE REGISTERINE $7A YAZ
K.4=0'SIMDI K NIN 4. BITINI 0 YAP CIHAZI RESETLEMEK ICIN
I2CWRITE SDA,SCL,pcaAddress,$00,[K]'CIHAZI RESETLE
ENDIF
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

#36
25Hz-150Hz arası Çalışan kodların sadeleştirilmiş tüm hali aşağıdadır.
#config
 __config _HS_OSC & _WDT_ON & _LVP_OFF & _CP_OFF
#ENDconfig
DEFINE OSC 20
TRISA=%111111:TRISB=%00000000:TRISC=%00011011:TRISD=%11111111:TRISE=%111
PORTA=0 :PORTB=0:PORTC=0:PORTD=0:PORTE=0
'-------------------------------------------------------------------------------
CMCON=7                   
ADCON1=7                   'ADC KANALLARI DİJİTAL YAPILDI - ADC İPTAL
OPTION_REG.7=1             'portB deki dahili PULL-UP lar iptal edildi.
'INTCON=%11000000 
'-------------------------------------------------------------------------------
DEFINE LCD_DREG PORTB    'LCD data bacaklari hangi porta bagli ? 
DEFINE LCD_DBIT 4        'LCD data bacaklari hangi bitten basliyor ?
DEFINE LCD_EREG PORTB    'LCD Enable Bacagi Hangi Porta bagli ?
DEFINE LCD_EBIT 3        'LCD Enable Bacagi Hangi bite bagli ?
DEFINE LCD_RSREG PORTB   'LCD RS Bacagi Hangi Porta bagli ?
DEFINE LCD_RSBIT 2       'LCD RS bacagi Hangi Bite bagli ?
DEFINE LCD_BITS 4        'LCD 4 bit mi yoksa 8 bit olarak ba?ly ?
DEFINE LCD_LINES 4       'LCD Kaç syra yazabiliyor ? 
DEFINE LCD_COMMANDUS 2000'Command delay time in us 
DEFINE LCD_DATAUS 50     'Data delay time in us   
'*******************************************************************************
DEFINE I2C_SLOW 1
SYMBOL SDA=PORTC.4:SYMBOL SCL=PORTC.3
symbol PWM0_ARTIR=porta.0:symbol PWM0_AZALT=porta.1
symbol PWM1_ARTIR=porta.2:symbol PWM1_AZALT=porta.3
symbol PWM2_ARTIR=porta.4:symbol PWM2_AZALT=porta.5
symbol PWM3_ARTIR=portE.0:symbol PWM3_AZALT=portE.1
symbol PWM4_ARTIR=portE.2:symbol PWM4_AZALT=portD.0
symbol PWM5_ARTIR=portD.1:symbol PWM5_AZALT=portD.2
symbol PWM6_ARTIR=portD.3:symbol PWM6_AZALT=portD.4
symbol PWM7_ARTIR=portD.5:symbol PWM7_AZALT=portD.6
symbol FRQ_ARTIR=PORTC.0:SYMBOL FRQ_AZALT=PORTC.1
sure0 var word:sure1 var word:sure2 var word:sure3 var word:sure4 var word:sure5 var word:sure6 var word:sure7 var word
K VAR BYTE
'KONT	Con	%10000000		' Cihaz kodu
pcaAddress  var BYTE
pcaAddress =%10000000 '$40  ' Tüm adres pinleri gnd de
'----------------------------------------
frekans var byte:frekans=25
prescaler VAR byte: prescaler=244 
a var word :a=0
gosub I2C_oku_yaz
pAUSE 300
LCDOUT $FE,1
'**********************************************************************************
BASLA:
'FREKANS ARTIRMA
IF FRQ_ARTIR=1 THEN
'while FRQ_ARTIR=1:wend 
frekans=frekans+1
if frekans=151 then frekans=150
gosub prescaler_hesapla
gosub I2C_oku_yaz
ENDIF
''-------------------------------------------------------------------------------------
''FREKANS AZALTMA
IF FRQ_AZALT=1 THEN 
'while FRQ_AZALT=1:wend 
frekans=frekans-1
if frekans=24 then frekans=25
gosub prescaler_hesapla
gosub I2C_oku_yaz
ENDIF
'---------------------------------------------------------------------------------------

if PWM0_ARTIR=1 then sure0=sure0+10
if sure0>4000 then sure0=4000
if PWM0_AZALT=1 then sure0=sure0-10
if sure0<100 then sure0=100

if PWM1_ARTIR=1 then sure1=sure1+10
if sure1>4000 then sure1=4000
if PWM1_AZALT=1 then sure1=sure1-10
if sure1<100 then sure1=100

if PWM2_ARTIR=1 then sure2=sure2+10
if sure2>4000 then sure2=4000
if PWM2_AZALT=1 then sure2=sure2-10
if sure2<100 then sure2=100

if PWM3_ARTIR=1 then sure3=sure3+10
if sure3>4000 then sure3=4000
if PWM3_AZALT=1 then sure3=sure3-10
if sure3<100 then sure3=100

if PWM4_ARTIR=1 then sure4=sure4+10
if sure4>4000 then sure4=4000
if PWM4_AZALT=1 then sure4=sure4-10
if sure4<100 then sure4=100

if PWM5_ARTIR=1 then sure5=sure5+10
if sure5>4000 then sure5=4000
if PWM5_AZALT=1 then sure5=sure5-10
if sure5<100 then sure5=100

if PWM6_ARTIR=1 then sure6=sure6+10
if sure6>4000 then sure6=4000
if PWM6_AZALT=1 then sure6=sure6-10
if sure6<100 then sure6=100

if PWM7_ARTIR=1 then sure7=sure7+10
if sure7>4000 then sure7=4000
if PWM7_AZALT=1 then sure7=sure7-10
if sure7<100 then sure7=100

gosub pwm0:gosub pwm1:gosub pwm2:gosub pwm3:gosub pwm4:gosub pwm5:gosub pwm6:gosub pwm7
gosub lcdgoster
Goto basla
'--------------------------------------------------------------------------------
prescaler_hesapla:
a=(4096/10*frekans)/100
a=25000/a
prescaler=a
return
'---------------------------------------------------------------
I2C_oku_yaz:'CLOCK AYAR MODA GIRME VE 50 HZ AYARLAMA
pause 20
i2cread sda,scl,pcaAddress,$00,[K] '$00 NOLU REGISTERI OKU VE K DEGİSKENINE AT
K.4=1 'K NIN 4.BITI VE 7.BİTİNİ 1 YAP
K.7=1
pause 20
I2CWRITE SDA,SCL,pcaAddress,$00,[K]'YENI K DEGERINI PCA YA AT VE CIHAZI CLOCK AYAR MODUNA GETİR
pause 20
I2CWRITE SDA,SCL,pcaAddress,$FE,[prescaler]'50 HZ CLOCK DEGERI ICIN $FE REGISTERINE $7A YAZ
K.4=0'SIMDI K NIN 4. BITINI 0 YAP CIHAZI RESETLEMEK ICIN
I2CWRITE SDA,SCL,pcaAddress,$00,[K]'CIHAZI RESETLE
return
'-----------------------------------------------------------------
PWM0:
I2CWRITE SDA,SCL,pcaAddress,$06,[0]
I2CWRITE SDA,SCL,pcaAddress,$07,[0]
I2CWRITE SDA,SCL,pcaAddress,$08,[SURE0.BYTE0]
I2CWRITE SDA,SCL,pcaAddress,$09,[SURE0.BYTE1]
RETURN
PWM1:  
I2CWRITE SDA,SCL,pcaAddress,$0A,[0]
I2CWRITE SDA,SCL,pcaAddress,$0B,[0]
I2CWRITE SDA,SCL,pcaAddress,$0C,[SURE1.BYTE0]
I2CWRITE SDA,SCL,pcaAddress,$0D,[SURE1.BYTE1]
RETURN
PWM2:  
I2CWRITE SDA,SCL,pcaAddress,$0E,[0]
I2CWRITE SDA,SCL,pcaAddress,$0F,[0]
I2CWRITE SDA,SCL,pcaAddress,$10,[SURE2.BYTE0]
I2CWRITE SDA,SCL,pcaAddress,$11,[SURE2.BYTE1]
RETURN
PWM3:  
I2CWRITE SDA,SCL,pcaAddress,$12,[0]
I2CWRITE SDA,SCL,pcaAddress,$13,[0]
I2CWRITE SDA,SCL,pcaAddress,$14,[SURE3.BYTE0]
I2CWRITE SDA,SCL,pcaAddress,$15,[SURE3.BYTE1]
RETURN
PWM4:  
I2CWRITE SDA,SCL,pcaAddress,$16,[0]
I2CWRITE SDA,SCL,pcaAddress,$17,[0]
I2CWRITE SDA,SCL,pcaAddress,$18,[SURE4.BYTE0]
I2CWRITE SDA,SCL,pcaAddress,$19,[SURE4.BYTE1]
RETURN
PWM5:  
I2CWRITE SDA,SCL,pcaAddress,$1A,[0]
I2CWRITE SDA,SCL,pcaAddress,$1B,[0]
I2CWRITE SDA,SCL,pcaAddress,$1C,[SURE5.BYTE0]
I2CWRITE SDA,SCL,pcaAddress,$1D,[SURE5.BYTE1]
RETURN
PWM6:  
I2CWRITE SDA,SCL,pcaAddress,$1E,[0]
I2CWRITE SDA,SCL,pcaAddress,$1F,[0]
I2CWRITE SDA,SCL,pcaAddress,$20,[SURE6.BYTE0]
I2CWRITE SDA,SCL,pcaAddress,$21,[SURE6.BYTE1]
RETURN
PWM7:  
I2CWRITE SDA,SCL,pcaAddress,$22,[0]
I2CWRITE SDA,SCL,pcaAddress,$23,[0]
I2CWRITE SDA,SCL,pcaAddress,$24,[SURE7.BYTE0]
I2CWRITE SDA,SCL,pcaAddress,$25,[SURE7.BYTE1]
RETURN
'-----------------------------------------------------------------------------            
            LCDGOSTER:
            lcdout $FE,$80,"P0=",#sure0/42,"%  "
            lcdout $FE,$89,"P1=",#sure1,"   "
            lcdout $FE,$C0,"P2=",#sure2,"   "
            lcdout $FE,$C9,"P3=",#sure3,"   "
            lcdout $FE,$90,"P4=",#sure4,"   "
            lcdout $FE,$98,"   ",#frekans,"Hz   "
            'lcdout $FE,$D0,"P6=",#sure6,"   "
            lcdout $FE,$D0,"FRQ=",dec3 prescaler,"     "
            RETURn
'--------------------------------------------------------------------------
 
END
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

#37
@mehmet Bey; Bildiğiniz üzere aşağıdaki kod bölümleri pbp de PCA9685 deki 2 çıkış pinini ve 2 çıkış pininde oluşan pwm genliklerini kontrol ediyor.
Bu iki çıkışın resimdekine benzer bir full bridge motor sürme devresine bağlandığını varsayalım. Bu durumda 2 pwm arasında bir dead time ve doğru sırada çıkış verilmesi gerekir. Yine bildiğiniz üzere...
Bunu yapmak için aşağıdaki kodları nasıl düzenlemeliyiz.
PWM0:
I2CWRITE SDA,SCL,pcaAddress,$06,[0]                ' PWM0_ON_L-----PWM0 output and brightness control byte 0
I2CWRITE SDA,SCL,pcaAddress,$07,[0]                ' PWM0_ON_H-----PWM0 output and brightness control byte 1
I2CWRITE SDA,SCL,pcaAddress,$08,[0]                ' PWM0_OFF_L----PWM0 output and brightness control byte 2
I2CWRITE SDA,SCL,pcaAddress,$09,[0]                ' PWM0_OFF_H----PWM0 output and brightness control byte 3

PWM1:  
I2CWRITE SDA,SCL,pcaAddress,$0A,[0]                ' PWM1_ON_L-----PWM1 output and brightness control byte 0
I2CWRITE SDA,SCL,pcaAddress,$0B,[0]                ' PWM1_ON_H-----PWM1 output and brightness control byte 1
I2CWRITE SDA,SCL,pcaAddress,$0C,[0]                ' PWM1_OFF_L----PWM1 output and brightness control byte 2
I2CWRITE SDA,SCL,pcaAddress,$0D,[0]                ' PWM1_OFF_H----PWM1 output and brightness control byte 3

"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

#38
Aşağıdaki şekilde düzenlediğimde resimdeki pwm i alabiliyorum. Üstteki 2 sinyal fullbridge nin bays girişleri diğer ikisi ise motor çıkışları.
Ete Hocam; Nedir bu 2byte sayı? Pbp te nasıl kullanılır. 2byte(4096) bir sayıda Byte0 kaç olursa byte1 kaç olur? Mantık olarak biliyorum ama tam olarak hesaplamaya hakim olabilmem için daha fazla bilgiye ve pekiştirmeye ihtiyacım var. Geniş bir açıklama yaparsanız çok memnun olurum. Değerli zamanınızı ayırır mısınız lütfen?
if PWM0_ARTIR=1 then sure0=sure0+10:sure1=sure1+10
PWM0:
I2CWRITE SDA,SCL,pcaAddress,$06,[SURE0.BYTE0]        ' PWM0_ON_L-----PWM0 output and brightness control byte 0
I2CWRITE SDA,SCL,pcaAddress,$07,[SURE0.BYTE1]        ' PWM0_ON_H-----PWM0 output and brightness control byte 1
I2CWRITE SDA,SCL,pcaAddress,$08,[255]                ' PWM0_OFF_L----PWM0 output and brightness control byte 2
I2CWRITE SDA,SCL,pcaAddress,$09,[15]                 ' PWM0_OFF_H----PWM0 output and brightness control byte 3
RETURN
PWM1:  
I2CWRITE SDA,SCL,pcaAddress,$0A,[255]                ' PWM1_ON_L-----PWM1 output and brightness control byte 0
I2CWRITE SDA,SCL,pcaAddress,$0B,[15]                 ' PWM1_ON_H-----PWM1 output and brightness control byte 1
I2CWRITE SDA,SCL,pcaAddress,$0C,[SURE1.BYTE0]        ' PWM1_OFF_L----PWM1 output and brightness control byte 2
I2CWRITE SDA,SCL,pcaAddress,$0D,[SURE1.BYTE1]        ' PWM1_OFF_H----PWM1 output and brightness control byte 3
RETURN



"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

256-65535 arası sayılar basic de 16bit sayı olarak adlandırılır. Bit hesabı yaaprsanız bunların gerçektende 16 bitlik sayılar olduklarını görebilirsiniz.

İşlemciler 8 bitlik olunca 16 bitlik sayı iki adet 8 bit ile depolanması zorunluluğu ortaya çıkmış. Bununda çaresini sayıyı iki adet 8 bite çevirmişler.
Önce bunu normal matematik ile nasıl yapıyoruz ona bakalım. Elimizdeki sayı

Bilgisayarınızda Hesap makineniz vardır. Onu programlayıcı moduna alırsanız HEX sayılarla işlem yapabilir hale gelebilirsiniz. Bu ne işe yarayacak derseniz kolaylıkla sayı 4000 olsun bunu iki adet 8 bite çevireceğiz.
Önce Byte1 yani yüksek değerlikli byte: 4000/256=15  hex olarak $0F dir.
Sonra Byte0 yani düşük değerlikli Byte: 4000-(15x256)=160 ve hex olarak $A0.
Bu, 400 sayısını hex olarak yazmak istersek $0FA0 olarak yazıyoruz.
ELinizde bir hesap makinesi olsa va sayıları hex olarak gösterebilse hiç hesap yapamdan sayı çevrimlerini yapabilirsiniz. Zira 4000 nin hex karşılığı ne dediğinizde $0FA0 diye size veerecek. Buradan Byte1=$0F ve Byte=$A0 olarak hemen yazılabilir. Sonra bunların herbirinin karşılığına bakarsanız $0F=15 ve $A0=160 olduğunuda oradan görebilirsiniz.
Bir sır vereyim PC deki Windows Hesap Makinesinin Çeşitli modları var. Bunlardan Programlayıcı modu bu işi yapıyor oradan yararlanabilirsiniz.

Ete

mehmet

#40
Alıntı yapılan: elektro77 - 28 Eylül 2022, 21:50:45@mehmet Bey; Bildiğiniz üzere aşağıdaki kod bölümleri pbp de PCA9685 deki 2 çıkış pinini ve 2 çıkış pininde oluşan pwm genliklerini kontrol ediyor.
Bu iki çıkışın resimdekine benzer bir full bridge motor sürme devresine bağlandığını varsayalım. Bu durumda 2 pwm arasında bir dead time ve doğru sırada çıkış verilmesi gerekir. Yine bildiğiniz üzere...
Bunu yapmak için aşağıdaki kodları nasıl düzenlemeliyiz.
PWM0:
I2CWRITE SDA,SCL,pcaAddress,$06,[0]                ' PWM0_ON_L-----PWM0 output and brightness control byte 0
I2CWRITE SDA,SCL,pcaAddress,$07,[0]                ' PWM0_ON_H-----PWM0 output and brightness control byte 1
I2CWRITE SDA,SCL,pcaAddress,$08,[0]                ' PWM0_OFF_L----PWM0 output and brightness control byte 2
I2CWRITE SDA,SCL,pcaAddress,$09,[0]                ' PWM0_OFF_H----PWM0 output and brightness control byte 3

PWM1:  
I2CWRITE SDA,SCL,pcaAddress,$0A,[0]                ' PWM1_ON_L-----PWM1 output and brightness control byte 0
I2CWRITE SDA,SCL,pcaAddress,$0B,[0]                ' PWM1_ON_H-----PWM1 output and brightness control byte 1
I2CWRITE SDA,SCL,pcaAddress,$0C,[0]                ' PWM1_OFF_L----PWM1 output and brightness control byte 2
I2CWRITE SDA,SCL,pcaAddress,$0D,[0]                ' PWM1_OFF_H----PWM1 output and brightness control byte 3


Basic ile yardım edemem. Ama mantık
olarak bakabiliriz. Grafik olarak
çizmeye çalışırım.

Ek:
Bu resime telefondan bakmıştım üstün körü.
Pc den bakınca P-N grubu olduğunu gördüm.
Sağ taraf low sabit kalır ve sol taraftan
pwm uygulanırsa, motor bir yöne döner.
Burada sorun yok. Sadece yön değiştirmek
isrersek "dead time" gerekli. Zaten ani yön
değiştirmek olmaz, frenlemek veya durmasını
beklemek gerek. Bu da gereken zamanı
verecektir.
Motor uçlarına diyot eklemeyi unutmayınız.

"Dead time" uygulamak için dört ucu da ayrı
ayrı kontrol edebilmemiz gerekli...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

elektro77

#41
Ete Hocam okumak isterseniz PCA9865 in datasheetini türkçe pdf olarak düzenledim. Buraya boyut olarak sığmadığı için bir Linke bıraktım. 52 sayfa ama %80 ı tablodan oluşuyor.
İyi bir ilerleme kaydetsem de formül noktalarında ben bu işi, her işte de olduğu gibi, sizsiz yapamayacağım anlaşılan. Umarım ben bu işi tam olarak öğrenmeden gitmezsiniz. Dua ediyorum.
https://dosya.co/nr5l3anouler/PCA9685_Türkçe_datasheet.pdf.html

Edit:
Eke ; Exel de Decimal bir sayıyı Hex e çevirdikten sonra, byte1-byte0 değerlerini veren,
Hex i decimale çevirip byte ları veren ve byte ları decimale çeviren bir hesap makinesi tasarlayıp koydum.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Benim sorunum ingilizce değil. Sorun o kadar sayfayı okumak üzerinde çalışmak ve bir anlam çıkartacak kadar elemanı anlamak. Bu dediklerim günler sürer. O kadar vaktim yok maalesf.
Kendi başınasın!!!!.

Ete

elektro77

Alıntı yapılan: ete - 29 Eylül 2022, 16:34:42Benim sorunum ingilizce değil. Sorun o kadar sayfayı okumak üzerinde çalışmak ve bir anlam çıkartacak kadar elemanı anlamak. Bu dediklerim günler sürer. O kadar vaktim yok maalesf.
Kendi başınasın!!!!.

Ete
Hocam byte1 i her zaman aşağımı yuvarlamalıyız.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Yuvarlama yok her zaman tam sayı kısmını alacaksın. Zaten kalanda Byte0 a eşitleniyor.

Ete

Powered by EzPortal