avatar_elektro77

PCA9685 Kullanımı

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

elektro77

PCA9685 ile 16 kanal led çalıştırma konusu işlenecektir.
"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

#1
500Hz için prescalar = 11
PCA9685 I²C adresi 0x40(6410)
LED0 başlangıç adresi 0x06(610)
PCA9685 hazırlık:
void pca9685_hazirlik(void)
{
    i2c_init();
    delay_ms(1);
    i2c_start();
    i2c_start();
    i2c_address(0x40);
    i2c_write(0xFE);  //Çıkış frekansı ayarlama adresi
    i2c_write(prescalar); //Ön bölücü değeri, Bölüm 7.3.5 de formülü
    i2c_stop();
    delay_ms(1);

    i2c_adress(0x40);
    i2c_write(0x00); // MODE1 register
    i2c_write(0b10100001); // Bölüm 7.3.1 de açıklamaları
    i2c_stop();
    delay_ms(1);
}

Duty yazmak için:
void pca9685_duty(uint8_t ledNum, uint16 dty)
{
    uint8_t offLowCmd = dty;
    uint8_t offHighCmd = dty >> 8;
    i2c_start();
    i2c_address(0x40);
    i2c_write(LED0 + (4 * ledNum));
    i2c_write(0x00);
    i2c_write(0x00);
    i2c_write(offLowCmd);
    i2c_write(offHighCmd);
    i2c_stop();
    delay_ms(1);
}

Eksik ya da hatalı bir yer olursa bakabiliriz.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

elektro77

#2
Hocam bende aşağıdaki gibi bir çalışma yaptım. Simülasyon ve pbp kodları ektedir.
Fakat Ete hocamın donanımsal 12C ders notları ile internetten bulduğum bazı kodları birleştirdim. Mesai bitimine doğru acele ettiğim için biraz karıştı.. Simülasyon çalışıyor ama kodlar karmakarışık. Burada Ete Hocamın yardımına ihtiyacımız olacak. Ektedir.
"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

PCA entegresini tanımıyorum. Öğrenmek zaman alacak bir iş gibi gözüküyor.
Yazdığın kodlara baktım onlarada bir anlam veremedim. Tek çalışan LCD diğerinin çalışması imkansız.
Cihaz kodu $40 bu binary olarak %1000000x şeklinde dir. Bit6-bit1 aralığındaki bitler entegrenin A5-A0 bacaklarının konumuna bağlı olarak cihaz adresine etki eden bitler. Şemanda bunları GND ye bağladığına göre senin chaz (I2C) kodun %1000000x şeklinde olmalıydı. Bu sayıda yer alan X biti is yazmada 0 okumada 1 olacak olan bitdir.
Basic kullansaydın bu bitin ayarlanması otomatik olacak idi.BAsic kullanıyor ama donanımsal I2C kullanmaya çalıştığın için x bitini senin ayarlaman gerekecek.
Ben olsam önce normal Basic kodları ile bu işi yapar sonra donanımsal I2C işine girişirdim.

Ete

enes


Merhaba

pca 9685 ıle servo motor calısmam olmustu.
oldukca da ıyı calısmıstı

satır sonlarında acıklama mevcut
umarım ısıne yarar.



'--------------------------MİCRO İSLEMCİ---------------------------------------
@ DEVICE pic16F628A
@ DEVICE pic16F628A, BOD_OFF                                                    
@ DEVICE pic16F628A, WDT_OFF 
@ DEVICE pic16F628A, LVP_OFF                       
@ DEVICE pic16F628A, PWRT_OFF           
@ DEVICE pic16F628A, PROTECT_OFF         
@ DEVICE pic16F628A, MCLR_OFF           
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  
'-----------------------------------------------------------------
DEFINE OSC 4  'OSİLATOR 4 MHZ
DEFINE I2C_SLOW 1
CMCON=7        'KOMPARATORLER İPTAL TUM PORTLAR DİGİTAL
OPTION_REG.7=1 'PULL UP IPTAL
'----------------------giriş çıkış-------------------------------------------
TRISA=%00000000
TRISB=%00000011
PORTA=0:PORTB=0
'----------------------GİRİŞ CIKISLAR------------------------------------------
symbol SCL   =PORTB.0 
symbol SDA   =PORTB.1

'--------------------------------------------------------------------------


 SUREA  VAR WORD   
 SUREB  VAR WORD   
 SUREC  VAR WORD   
 SURED  VAR WORD   
 SUREE  VAR WORD   

 SUREA=300
 SUREB=300
 SUREC=300      
 SURED=300
 SUREE=300

'--------------------------------------------------------------------------

I2C var BYTE   'CIHAZ ADRESİ DEGISKENI
I2C=%10000000  'CIHAZ ADRESİ   CIHAZ ADRESINI BELIRLEYEN PINLERE  PULLUP VEYA PULLDOWN OLMASI GEREKENLERE DIKKAT
K VAR BYTE
'------------------------CLOCK AYAR MODA GIRME VE 50 HZ AYARLAMA----------------

PAUSE 500  '  BIRAZ BEKLE 

I2CREAD  SDA,SCL,I2C,$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 200  'BIRAZ BEKLE
            
I2CWRITE SDA,SCL,I2C,$00,[K]   'YENI K DEGERINI PCA YA AT VE CIHAZI CLOCK AYAR MODUNA GETİR

PAUSE 500                     'BIRAZ DAHA BEKLE
 
I2CWRITE SDA,SCL,I2C,$FE,[$7A]          '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,I2C,$00,[K]   'CIHAZI RESETLE

PAUSE 100
'--------------------------------------------------------------------------

BASLA:

  GOSUB PWM0
  GOSUB PWM1
  GOSUB PWM2
  GOSUB PWM3
  GOSUB PWM4
  GOSUB PWM5
  GOSUB PWM6


GOTO BASLA  


'--------------------------------------------------------------------------

PWM0:

I2CWRITE SDA,SCL,I2C,$06,[0]
I2CWRITE SDA,SCL,I2C,$07,[0]
I2CWRITE SDA,SCL,I2C,$08,[SUREA.BYTE0]
I2CWRITE SDA,SCL,I2C,$09,[SUREA.BYTE1]
RETURN
'--------------------------------------------------------------------------

PWM1:

I2CWRITE SDA,SCL,I2C,$0A,[0]
I2CWRITE SDA,SCL,I2C,$0B,[0]
I2CWRITE SDA,SCL,I2C,$0C,[SUREB.BYTE0]
I2CWRITE SDA,SCL,I2C,$0D,[SUREB.BYTE1]

RETURN
'--------------------------------------------------------------------------

PWM2:

I2CWRITE SDA,SCL,I2C,$0E,[0]
I2CWRITE SDA,SCL,I2C,$0F,[0]
I2CWRITE SDA,SCL,I2C,$10,[SUREC.BYTE0]
I2CWRITE SDA,SCL,I2C,$11,[SUREC.BYTE1]

RETURN

'--------------------------------------------------------------------------

PWM3:

I2CWRITE SDA,SCL,I2C,$12,[0]
I2CWRITE SDA,SCL,I2C,$13,[0]
I2CWRITE SDA,SCL,I2C,$14,[SUREd.BYTE0]
I2CWRITE SDA,SCL,I2C,$15,[SUREd.BYTE1]

RETURN
'--------------------------------------------------------------------------
PWM4:

I2CWRITE SDA,SCL,I2C,$16,[0]
I2CWRITE SDA,SCL,I2C,$17,[0]
I2CWRITE SDA,SCL,I2C,$18,[SUREe.BYTE0]
I2CWRITE SDA,SCL,I2C,$19,[SUREe.BYTE1]


RETURN
'--------------------------------------------------------------------------
PWM5:

I2CWRITE SDA,SCL,I2C,$1A,[0]
I2CWRITE SDA,SCL,I2C,$1B,[0]
I2CWRITE SDA,SCL,I2C,$1C,[SUREe.BYTE0]
I2CWRITE SDA,SCL,I2C,$1D,[SUREe.BYTE1]


RETURN
'--------------------------------------------------------------------------
PWM6:

I2CWRITE SDA,SCL,I2C,$1E,[0]
I2CWRITE SDA,SCL,I2C,$1F,[0]
I2CWRITE SDA,SCL,I2C,$20,[SUREe.BYTE0]
I2CWRITE SDA,SCL,I2C,$21,[SUREe.BYTE1]


RETURN


' PWM 15 E KADAR DEVAM BANA 7 ADET LAZIMDI



'--------------------------------------------------------------------------

END

aRci

Alıntı yapılan: enes - 05 Eylül 2022, 22:48:06Merhaba

pca 9685 ıle servo motor calısmam olmustu.
oldukca da ıyı calısmıstı

satır sonlarında acıklama mevcut
umarım ısıne yarar.



'--------------------------MİCRO İSLEMCİ---------------------------------------
@ DEVICE pic16F628A
@ DEVICE pic16F628A, BOD_OFF                                                    
@ DEVICE pic16F628A, WDT_OFF 
@ DEVICE pic16F628A, LVP_OFF                       
@ DEVICE pic16F628A, PWRT_OFF           
@ DEVICE pic16F628A, PROTECT_OFF         
@ DEVICE pic16F628A, MCLR_OFF           
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  
'-----------------------------------------------------------------
DEFINE OSC 4  'OSİLATOR 4 MHZ
DEFINE I2C_SLOW 1
CMCON=7        'KOMPARATORLER İPTAL TUM PORTLAR DİGİTAL
OPTION_REG.7=1 'PULL UP IPTAL
'----------------------giriş çıkış-------------------------------------------
TRISA=%00000000
TRISB=%00000011
PORTA=0:PORTB=0
'----------------------GİRİŞ CIKISLAR------------------------------------------
symbol SCL   =PORTB.0 
symbol SDA   =PORTB.1

'--------------------------------------------------------------------------


 SUREA  VAR WORD   
 SUREB  VAR WORD   
 SUREC  VAR WORD   
 SURED  VAR WORD   
 SUREE  VAR WORD   

 SUREA=300
 SUREB=300
 SUREC=300      
 SURED=300
 SUREE=300

'--------------------------------------------------------------------------

I2C var BYTE   'CIHAZ ADRESİ DEGISKENI
I2C=%10000000  'CIHAZ ADRESİ   CIHAZ ADRESINI BELIRLEYEN PINLERE  PULLUP VEYA PULLDOWN OLMASI GEREKENLERE DIKKAT
K VAR BYTE
'------------------------CLOCK AYAR MODA GIRME VE 50 HZ AYARLAMA----------------

PAUSE 500  '  BIRAZ BEKLE 

I2CREAD  SDA,SCL,I2C,$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 200  'BIRAZ BEKLE
            
I2CWRITE SDA,SCL,I2C,$00,[K]   'YENI K DEGERINI PCA YA AT VE CIHAZI CLOCK AYAR MODUNA GETİR

PAUSE 500                     'BIRAZ DAHA BEKLE
 
I2CWRITE SDA,SCL,I2C,$FE,[$7A]          '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,I2C,$00,[K]   'CIHAZI RESETLE

PAUSE 100
'--------------------------------------------------------------------------

BASLA:

  GOSUB PWM0
  GOSUB PWM1
  GOSUB PWM2
  GOSUB PWM3
  GOSUB PWM4
  GOSUB PWM5
  GOSUB PWM6


GOTO BASLA  


'--------------------------------------------------------------------------

PWM0:

I2CWRITE SDA,SCL,I2C,$06,[0]
I2CWRITE SDA,SCL,I2C,$07,[0]
I2CWRITE SDA,SCL,I2C,$08,[SUREA.BYTE0]
I2CWRITE SDA,SCL,I2C,$09,[SUREA.BYTE1]
RETURN
'--------------------------------------------------------------------------

PWM1:

I2CWRITE SDA,SCL,I2C,$0A,[0]
I2CWRITE SDA,SCL,I2C,$0B,[0]
I2CWRITE SDA,SCL,I2C,$0C,[SUREB.BYTE0]
I2CWRITE SDA,SCL,I2C,$0D,[SUREB.BYTE1]

RETURN
'--------------------------------------------------------------------------

PWM2:

I2CWRITE SDA,SCL,I2C,$0E,[0]
I2CWRITE SDA,SCL,I2C,$0F,[0]
I2CWRITE SDA,SCL,I2C,$10,[SUREC.BYTE0]
I2CWRITE SDA,SCL,I2C,$11,[SUREC.BYTE1]

RETURN

'--------------------------------------------------------------------------

PWM3:

I2CWRITE SDA,SCL,I2C,$12,[0]
I2CWRITE SDA,SCL,I2C,$13,[0]
I2CWRITE SDA,SCL,I2C,$14,[SUREd.BYTE0]
I2CWRITE SDA,SCL,I2C,$15,[SUREd.BYTE1]

RETURN
'--------------------------------------------------------------------------
PWM4:

I2CWRITE SDA,SCL,I2C,$16,[0]
I2CWRITE SDA,SCL,I2C,$17,[0]
I2CWRITE SDA,SCL,I2C,$18,[SUREe.BYTE0]
I2CWRITE SDA,SCL,I2C,$19,[SUREe.BYTE1]


RETURN
'--------------------------------------------------------------------------
PWM5:

I2CWRITE SDA,SCL,I2C,$1A,[0]
I2CWRITE SDA,SCL,I2C,$1B,[0]
I2CWRITE SDA,SCL,I2C,$1C,[SUREe.BYTE0]
I2CWRITE SDA,SCL,I2C,$1D,[SUREe.BYTE1]


RETURN
'--------------------------------------------------------------------------
PWM6:

I2CWRITE SDA,SCL,I2C,$1E,[0]
I2CWRITE SDA,SCL,I2C,$1F,[0]
I2CWRITE SDA,SCL,I2C,$20,[SUREe.BYTE0]
I2CWRITE SDA,SCL,I2C,$21,[SUREe.BYTE1]


RETURN


' PWM 15 E KADAR DEVAM BANA 7 ADET LAZIMDI



'--------------------------------------------------------------------------

END

bu entegre için sürekli pwm verileri yüklemek gerekiyormu bir kere yükleyince aynı ayarlada çalışmaya devam edemiyormu.

elektro77

#6
Alıntı yapılan: enes - 05 Eylül 2022, 22:48:06Merhaba

pca 9685 ıle servo motor calısmam olmustu.
oldukca da ıyı calısmıstı

satır sonlarında acıklama mevcut
umarım ısıne yarar.
Çok teşekkür ederim. Kodları basicte derleyip incelemek istedim ama her neredeyse her satırı  hata veriyor.
Sürekli BAD TOKEN "  ". Hatası aldığım yerler var. Bakıyorum öyle bir işaret te yok. Expected '[' hatası, syntax error hataları alıyorum. Sebebi ne olabilir anlamadım. Bazen tüm satırı silip yeniden yazınca düzeliyor. Kullandığım versiyonda da sorun yok. Fakat buradan kopyala yapıştırla sorunlar çıkarıyor galiba. Nedir sebebi? Şimdi hepsini baştan sona kendim yazıyorum. O zaman sorun çıkarmıyor.

"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

#7
Aşağıdaki simülasyon ve pbp kodlarında, bir kanal pwm üreterek artır ve azalt tuşları koydum. Osiloskopta izledim ve çalıştığını gördüm. Devamı getirilebilir. @enes e teşekkürler.
"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"

enes

Alıntı yapılan: aRci - 06 Eylül 2022, 01:04:05bu entegre için sürekli pwm verileri yüklemek gerekiyormu bir kere yükleyince aynı ayarlada çalışmaya devam edemiyormu.

degerler degısmedıkce tekrar yukleme yapmaya gerek yok.
degısınce de bır sefer degısen degerı yuklemek yeterlı.

enes

Alıntı yapılan: elektro77 - 06 Eylül 2022, 10:26:08Çok teşekkür ederim. Kodları basicte derleyip incelemek istedim ama her neredeyse her satırı  hata veriyor.
Sürekli BAD TOKEN "  ". Hatası aldığım yerler var. Bakıyorum öyle bir işaret te yok. Expected '[' hatası, syntax error hataları alıyorum. Sebebi ne olabilir anlamadım. Bazen tüm satırı silip yeniden yazınca düzeliyor. Kullandığım versiyonda da sorun yok. Fakat buradan kopyala yapıştırla sorunlar çıkarıyor galiba. Nedir sebebi? Şimdi hepsini baştan sona kendim yazıyorum. O zaman sorun çıkarmıyor.



o bahsettıgın hataların sebebini bılmıyorum. bende sorunsuz calısıyor.

elektro77

Alıntı yapılan: enes - 06 Eylül 2022, 13:34:30o bahsettıgın hataların sebebini bılmıyorum. bende sorunsuz calısıyor.
Sitenin kod ekleme tasarımı ile ilgili bir sorun olduğunu düşünüyorum. Kopyala esnasında orada görünmeyen gizli şeyleri de kopyalıyor gibi geldi bana.
"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

#11
Sayın @enes; frekansı 24 Hz-150Hz arası  ayarlamak için hangi koda ne yazmak gerekli ve başka bir kod dizini ile bu frekansı birer artırarak nasıl değiştirmeli. Ya da yin 12C ile bu frekansı nasıl ayarlanabilir yapmalı.
Birde K değişkenini anlamadım.
"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"

enes

Alıntı yapılan: elektro77 - 06 Eylül 2022, 13:38:47Sayın @enes; frekansı 24 Hz-150Hz arası  ayarlamak için hangi koda ne yazmak gerekli ve başka bir kod dizini ile bu frekansı birer artırarak nasıl değiştirmeli. Ya da yin 12C ile bu frekansı nasıl ayarlanabilir yapmalı.
Birde K değişkenini anlamadım.

benım degısken frekans ıhtıyacım olmamıstı kodu yazdıgım zaman.50 hz de calısması yeterlıydı.
ama datasheet 25. sayfada bi formul var onu ıncele ıstersen.
FEh  frekans ayar regısterıdir. formul sonucu cıkan ıstedıgın frekans degerını o regıstere yazınca ıstedıgn frekansa ayarlarsın.

K ıse entegrenın 00h regısterını okuma yapmak ıcın kullandıgım bı byte degıskenı.

elektro77

#13
8 kanal 50Hz, duty oranları birbirinden bağımsız ayarlanabilen PCA9685 çalışmasını aşağıya bırakıyorum.
Şimdiki adımım ise frekansı değiştirebileceğim 2 buton koyup frekansı değiştirmek.
"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

Aşağıya frekansı da ayarlanabilen versiyonu bırakıyorum.
"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"

Powered by EzPortal