Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

PWM ve gelirim hesabı

Başlatan Mucit23, 29 Mart 2011, 22:27:51

Mucit23

Anladım hocam eğer yazılım işini halledebilirsem dediğim gibi bu encoderlerden kullanırım. Zaten motor tahminimce en fazla 5000RPM'e çıkar.

Herşey iyide şuanda yazılımda  bazı sorunlar yaşıyorum. Aslında daha işin başındayım. Yazılımsal olarak hiç bir ilerleme kaydedemedim. En basitinden bir 10KHz bir frekans çıkartıp duty değerini bile ayarlamakta sorun yaşıyorum. Daha önce hiç böyle bişey yapmadım. Daha doğrusu daha önce hiç picin bu yönüyle uğraşmamışrım. Acemiliğime veriyorum.
Yaptıklarımı söyliyeyim.
16F873 ile 4MHz osc ve 10Khz pwm frekansının şmdilik ilk aşamada duty değeriyle oynamayı planlıyorum.  Elimde birçok 16F873,876 ve 877 olduğu için bu işlemcilerden kullanmak istiyorum. Maksat elimdekiler bitsin. Eğer Bunu yapabilirsem sonra dahada geliştiririm. Ne varki bunda bile sorun yaşıyorum. Herşeyin bir hesabı kitabı var. Buradada ETE hocamın pwm üzerine hazırlamış olduğu derslerden yararlanıyorum. Orada epeyce anlatmıştı.
Ben ise şu anda 16F873 ün CPP1 portundan 10KHz bir pwm frekansı alıp bu frekansın duty değeriyle oynamak ve bu duty değerini lcd ekranda görmek istiyorum. Bunun için programsal olarak herşeyi yaptığımı sanıyorum.

PWM frekansı PR2 registeriyle ayarlanıyordu. PR2 registerinin değerinide  bulmakiçin ilk önce 10KHz lik bir frekansın peryodunu bulamız gerekir.
peryot=1000000/10000=100uS olur. Bunuda Formülde yerine koyarsak Peryot=(PR2+1)4*1/4*4 =25-1=24 olarak çıkar. (Timer2 Bölücü değeri 4 olarak ayarladım)
Duty değerinin hesabı ise ete hocanın derslerinde anlatılanlara göre(duty değerinin %50 olduğunu varsayarsak)
Ham_duty=(PR2+1)*4*50/100 = (24+1)*4*50/100=50 değeri karşımıza çıkar. Bu değerin ilk iki bitini cpp1con.4 ve cpp1con.5 bitlerine geri kalanıda CCPR1L registerine yazıyorduk. Anladıklarım bunlar.

Şimdi benim duty değeri sıfır olduğunda PWMi komple kapatmak istiyorum. duty değeri 1 den büyük olunca PWM açılacak.
Duty değerini değiştirmek için aşağıdaki gibi bir kod yazdım. Devamlı pwm açık.
DEFINE OSC 4
@ DEVICE pic16F873
@ DEVICE pic16F873, WDT_on
@ DEVICE pic16F873, PWRT_On
@ DEVICE pic16F873, PROTECT_OFF

TRISA=%00000000
TRISB=%00000000
TRISC=%11110000
PORTA=0
PORTB=0
PORTC=0

DEFINE LCD_DREG	  PORTB	
DEFINE LCD_DBIT	  4		
DEFINE LCD_RSREG  PORTB	
DEFINE LCD_RSBIT  2	
DEFINE LCD_EREG	  PORTB	
DEFINE LCD_EBIT   3		
DEFINE LCD_BITS	  4	
DEFINE LCD_LINES  2

DEFINE CCP1_REG   PORTC 
DEFINE CCP1_BIT   2 
DEFINE CCP2_REG   PORTC 
DEFINE CCP2_BIT   1
 
T2CON =%00000101
PR2=24
ADCON1 = 7

ROLE VAR PORTC.0
SYMBOL MENU=PORTC.7
SYMBOL YUKARI=PORTC.6
SYMBOL ASAGI=PORTC.5
SYMBOL JOG=PORTC.4

X        VAR BYTE
DUTY     VAR BYTE
HAM      VAR WORD
PERYOT   VAR WORD
HAM_DUTY VAR WORD
DUTY=50

CCP1CON.2=1
CCP1CON.3=1

PAUSE 200
LCDOUT $FE,1

BASLA:
LCDOUT $FE,$80,"DUTY=",DEC3 DUTY

IF YUKARI=0 THEN
DUTY=DUTY+1
IF DUTY=101 THEN DUTY=100
WHILE YUKARI=0:WEND
ENDIF

IF ASAGI=0 THEN
DUTY=DUTY-1
IF DUTY=255 THEN DUTY=0
WHILE ASAGI=0:WEND
ENDIF

GOSUB DUTY_YAZ
GOTO BASLA

DUTY_YAZ:
HAM_DUTY=(PR2+1)* DUTY /100
CCP1CON.4=HAM_DUTY.0
CCP1CON.5=HAM_DUTY.1
CCPR1L=HAM_DUTY>>2
return

END


Bu kodu isiste çalıştırdığımda pwm düzgün çıkmıyor. Üstelik ekranada hiçbirşey gelmiyor . Ekrana hiçbirşey gelmemesinin sebebi şu olabilir. İlk başta pwmi açtığım komutu kaldırınca ekran geliyor.
CCP1CON.2=1
CCP1CON.3=1
Bu komutları yazınca pwm açılmış oluyor. Fakat ekrana hiçbirşey gelmiyor ve pwm düzgün çıkmıyor. Acaba nerede hata yapıyorum. Bu konuda tecübeli arkadaşların tavsiyelerini bekliyorum. 

Mucit23

Arkadaşlar bu konuda kimsenin bi fikri yokmu :-\ Neden düzgün çalıştıramıyorum programı nerede hata yapıyorum. Özellikle ETE hocamın önerilerini bekliyorum.

ete

Hesaplama hatası,

Duty_Yaz kısmındaki verdiğin formülü kaldır
DUTY_YAZ:

'HAM_DUTY=(PR2+1)* DUTY /100 Bunu sil yada kapat
yerine aşağıdaki satırı koy . Düzelir.
ham_DUTY=DUTY

Zaten 1/4 bölücü kullanmışsın 10Khz için bu max duty=100 olacak (8 bit) demekir.
Bu nedenle duty değerini direk CCP1 kontrol registerlerine verebilirsin.
Bit sayısını artırabilmen için Bölücüyü 1/1 yap. Maksimum duty değerin 400 olacaktır. Butonla duty değerini 0-400 arasında değiştir.
Yada böyle bırak 0-100 arasında değiştir.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Mucit23

Anladım hocam. 1. Hatam buydu. 2. bir hatamıda kendim buldum. Programı incelerseniz eğer ilk başta ilk önce pwmi açıp sonra duty değerini yazıyordum bu yanlışmış. İlk önce duty değeri 0 olsa bile cpp1 registerine yazıp sonra pwm i açmak gerekiyormuş.
Hocam peki duyt değeri Sıfır olunca pwm i kapatmaya gerek varmıdır.

Mucit23

Arkadaşlar duty değerinin %100 olduğunda motor uclarında yaklaşık 14 ile 15 volt arası bir değer görmem için motoru tam 15 voltla beslemem yeterli gelirmi yoksa birazdahamı yüsek bir gelirim vermek gerekir. Birde arkadaşlar motor uclarında düzgün bir dc voltaj ölçümü için çıkışa herhangi bir filtre devresi gerekirmi.

picmanya

sürücü devrenin son hali nasıl bir şey?
açık devre şemasını görebiliyormuyuz?

F.T

Alıntı yapılan: Mucit23 - 11 Nisan 2011, 22:43:36
Arkadaşlar duty değerinin %100 olduğunda motor uclarında yaklaşık 14 ile 15 volt arası bir değer görmem için motoru tam 15 voltla beslemem yeterli gelirmi yoksa birazdahamı yüsek bir gelirim vermek gerekir. Birde arkadaşlar motor uclarında düzgün bir dc voltaj ölçümü için çıkışa herhangi bir filtre devresi gerekirmi.

15 volt yeterli olur.filtreye gerek yok.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Mucit23

Aslında deneme amaçlı kullanacağım motor küçük güçlü bu yzdendirek BDx53gibi bir transistörlede motoru sürebilirim. Yani motoru fazla bir gücü yok. Ama yüksek güçlü bir motor kullanırsam eğer TLP250 ve IRF540 ikilisi veya buna benzer bir mosfet kullanırdım.

F.T

kendi yaptığım dc motor driver 110vdc 150 amperlikti. ;)
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Mucit23

Nasıl bir mosfet kullandınız çok merak ediyorum açıkçası. 150 amper az değil ::)

F.T

o akımlar mosfeti aşıyor artık ıgbt ler devreye giriyor.mıtsubushı firmasının dual ıgbt ini kullandım.kontrol olarak pic hiç düşünmedim.dolayısı ile plc kullandım.kendi yaptığım kartlara endüstriyel ortamda güvenmem.hobyy için sorun yok ;D
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Mucit23

Anladım. Tabi en uygunu öyledir. Bu arada plc ile PWM motor kontrolü yapıldığını ilk defa duydum :S

F.T

evet bende  uygulamayı geçen sene yaptım.nette pek uygulamaya raslamadım ama mutlaka daha önce yapan olmuştur.motor ileri geri kontrol ve tüm korumaları gayet güzel bir iş çıkmış oldu.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Mucit23

Alıntı yapılan: ete - 05 Nisan 2011, 08:03:48
Hesaplama hatası,

Duty_Yaz kısmındaki verdiğin formülü kaldır
DUTY_YAZ:

'HAM_DUTY=(PR2+1)* DUTY /100 Bunu sil yada kapat
yerine aşağıdaki satırı koy . Düzelir.
ham_DUTY=DUTY

Zaten 1/4 bölücü kullanmışsın 10Khz için bu max duty=100 olacak (8 bit) demekir.
Bu nedenle duty değerini direk CCP1 kontrol registerlerine verebilirsin.
Bit sayısını artırabilmen için Bölücüyü 1/1 yap. Maksimum duty değerin 400 olacaktır. Butonla duty değerini 0-400 arasında değiştir.
Yada böyle bırak 0-100 arasında değiştir.

Ete

Merhabalar ETE hocam. Hocam bi konuda sıkıntıdayım. Biraz yardımınıza ihtiyacım var. Şu PWM motor kontrol projesi. Bu benim bitirme projem aslında internette birçok devre var bu iş üzerine fakat benim kendim yapmam lazım. Sorunumda şudur.  Hocam bana Moturun devri ile birlikte motor uclarındaki gelirimi ölçmem gerekiyor. Bu konuda biraz sıkıntı yaşıyorum. En büyük sıkıntım donanım konusunda. Basit bir 12 volt max. 2 amper çekebilecek bir motorun devri ile oynamak istiyorum. Bu motorun uclarındaki gelirimi ölçmem için nasıl bir donanım kullanmalıyım.Birde ADC ve HPWM i bir türlü bir arada çalıştıramadım. Hocam HPWM konusunda fazla bir sıkıntım yok  yani 16f873 ün cpp1 portundan 10 khz pwm frekansı çıkartıp dutysi ile oynayabiliyorum. Fakat ADC ile birlikte çalıştırınca  şaşırıyor çok saçmalıyor donuyor hemen simülasyon. Bu konuda biraz yardımlarınıza ihtiyacım var.

Hocam PWM için böyle bir kod yazdım şimdilik. PWM kısmını bu şekilde ayarlıyorum.
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [Ferhat YOL]                                      *
'*  Notice  : Copyright (c) 2011 [Mucit23]                      *
'*          : All Rights Reserved                               *
'*  Date    : 03.04.2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
DEFINE OSC 4
@ DEVICE pic16F873
@ DEVICE pic16F873, WDT_OFF
@ DEVICE pic16F873, PWRT_On
@ DEVICE pic16F873, PROTECT_OFF

TRISA=%00000001
TRISB=%00000000
TRISC=%11110000
PORTA=0
PORTB=0
PORTC=0

DEFINE LCD_DREG	  PORTB	
DEFINE LCD_DBIT	  4		
DEFINE LCD_RSREG  PORTB	
DEFINE LCD_RSBIT  2	
DEFINE LCD_EREG	  PORTB	
DEFINE LCD_EBIT   3		
DEFINE LCD_BITS	  4	
DEFINE LCD_LINES  2

DEFINE CCP1_REG   PORTC 
DEFINE CCP1_BIT   2

DEFINE ADC_BITS 10 
DEFINE ADC_CLOCK 3 
DEFINE ADC_SAMPLEUS 50 

ON INTERRUPT GoTo KESME   
OPTION_REG=%10000001   	 
INTCON=%10100000  		 
TMR0=0 
T2CON = %00000101		 	 
PR2=24

SYMBOL SOL=PORTC.7
SYMBOL SAG=PORTC.6
SYMBOL ASAGI=PORTC.5
SYMBOL YUKARI=PORTC.4

U        VAR BYTE
W        VAR BYTE
SYC      VAR BYTE
SNY      VAR BYTE
SAYAC    VAR BYTE
DUTY     VAR BYTE
I        VAR WORD
PERYOT   VAR WORD
HAM_DUTY VAR WORD
DUTY=0
GOSUB EKRAN
GOSUB DUTY_YAZ
GOSUB PWM_ON
PAUSE 200
LCDOUT $FE,1

BASLA:

IF YUKARI=0 THEN
sayac=0
DUTY=DUTY+1
IF DUTY=101 THEN DUTY=100
GOSUB DUTY_YAZ:GOSUB EKRAN
 WHILE YUKARI=0
 W=1
 IF SAYAC=>25 THEN
   W=0:SAYAC=25
   DUTY=DUTY+1:GOSUB DELAY 
   IF DUTY=101 THEN DUTY=100
   GOSUB DUTY_YAZ
 ENDIF
 GOSUB EKRAN
 WEND
 W=0
 ELSE 
 W=0:SAYAC=0
ENDIF

IF ASAGI=0 THEN
sayac=0
DUTY=DUTY-1
IF DUTY=255 THEN DUTY=0
GOSUB DUTY_YAZ:GOSUB EKRAN
 WHILE ASAGI=0
 W=1
 IF SAYAC=>25 THEN
   W=0:SAYAC=25
   DUTY=DUTY-1:GOSUB DELAY 
   IF DUTY=255 THEN DUTY=0
   GOSUB DUTY_YAZ
 ENDIF
 GOSUB EKRAN
 WEND
 W=0
 ELSE 
 W=0:SAYAC=0
ENDIF
GOSUB EKRAN
GOTO BASLA


DELAY: 'gecıkme 
  FOR I=0 TO 70:NEXT
RETURN


DUTY_YAZ:
HAM_DUTY=duty
CCP1CON.4=ham_DUTY.0
CCP1CON.5=HAM_DUTY.1
CCPR1L=HAM_DUTY>>2
return

PWM_ON:
CCP1CON.2=1
CCP1CON.3=1 
RETURN

PWM_OFF: 
CCP1CON.2=0
CCP1CON.3=0
RETURN

EKRAN:
LCDOUT $FE,$80,"DUTY=",#DUTY
RETURN

DISABLE
KESME:
IF W=1 THEN
      SAYAC=SAYAC+1 
      IF SAYAC=101 THEN SAYAC=0 	    
ENDIF      
INTCON.2=0    
RESUME
ENABLE

END
           


Hocam bu koddada eminim bir çok hatam vardır.
Şimdi benim ADC ile motor uclarındaki gelirimi ölçmek için nasıl bir donanım kurmalıyım. Ayrıca yazılım konusundada biraz önerilerinize ihtiyacım var. Bana yardımcı olursanız sevinirim.

devkartal

#29
selam arkadaşlar
Elimde16F873 pic mevcut, 16f628 yaptığım 3 ledli test devresi nasıl oldu bilmiyorum pic kısa devre oldu .Yeni uygulamayı  16F873 ile yaptım  proteus ta çalışıyor fakat fiziki devrede çalıştıramadım.
Altaş yayıncılıktan satın almış olduğum usb pic programa kiti (D149 rev 3) ile bir kerede dosya atmak nasip olmadı her seferinde sorun yaşadım bu kadar kararsız çalışan kit görmedim sinir bozucu bir şey..

16F873 sigorta ayarlarını her seferinde farklı yaparak pic programlandı demesine rağmen malesef  gerçekte çalıştıramadım.

16F873 Pic ile farklı bir ayar varmı?  aynı uygulamayı icsp denesem çalışır mı? bunları bilmiyorum
sorun usb programla kartında olabilir mi? yoksa benim fark edemediğim bir başka bir şey mi var ?

Devre  pic 'in RB0,RB1,RB2 nolu bacaklarına bağlı ledleri sıra ile yakmakta Pic 'nin sıra ile 21,22,23 nolu pinleri  4 mhz  xtal  22pf kondasatör xtal birer uçunda diğer uçlar şasede 9 ve 10 nolu ayaklarına bağlı ledler 470R dirençle sürülüyor  20 nolu pin +5V  ve 19 nolu pin gnd toprak olarak bağlı bu devre breadboard üzerinde pic test etmek için kurdum fakat çalıştıramadım.

kodlarıda çok basit aşağıdaki gibi pic basic


Dongu:   High    portb.0      'ledi yak
                   Pause    800         '0.5 saniye geçikme yap.
                    low      portb.0     'ledi söndür
                   pause    800         '0.5 saniye geçikme yap.
                     High    portb.1      'ledi yak
                  Pause    600         '0.5 saniye geçikme yap.
                    low      portb.1     'ledi söndür
                  pause    600         '0.5 saniye geçikme yap
                    High    portb.2      'ledi yak
                 Pause    400         '0.5 saniye geçikme yap.
                   low      portb.2     'ledi söndür
                   pause    400         '0.5 saniye geçikme yap.
                    goto     Dongu    'Dongu etiketine git ve devamlı yak söndür
                    end