Ana Tema => Pic işlemciler ve Genel Özellikler => Konuyu başlatan: dgkn - 30 Ocak 2024, 18:04:18
Başlık: pwm dc motor hız kontrolü devresi çalışmıyor
Gönderen: dgkn - 30 Ocak 2024, 18:04:18
merhabalar. pwm ile dc motor hız kontrolü için bir devre kurdum. devremde 16f877a kullanıyorum. 4MHz kristal osilatör ile. kodumu ve devre şemasını aşağıya bırakıyorum. benim sorunum şu şekilde sürücü olarak l298n kullanıyorum. sürücüye 12V ve gnd bağlıyorum adaptör ile ve sürücüden bir gnd alıp bunu breadboardın gnd sine bağlıyorum (birkaç araştırmam sonucu önemli bir nokta olduğu söyleniyordu.). konuya gelecek olursam eğer devreyi eksiksiz kurduğuma eminim çünkü son 3 gündür uğraştığım tek şey bu devre. devrede pwm sinyalinin gönderileceği ve sürücünün enable A pinine bağlı jumper'ı ölçtüğümde sabit 2.5V var ve bu voltaj potansiyometreden değeri değiştirmeye çalıştığımda da aynı kalıyor (pot bacaklarını ölçtüm ve pot bozuk değil). aynı zamanda in1 ve in2 bacaklarını da ölçtüğümde herhangi bir gerilim alamıyorum. kısaca enable A sabit voltaj (2.5V) ve in1, in2 bacaklarında 0,01-0,02 volt gerilim var sadece. normalde olması gereken 10V (maks. çalışmada) civarı bir şey. sorum şu buradaki hata nerede? birçok kontroller yaptım fakat halen başaramadım. koddan çok emin olduğum için şuan son ihtimalle yapay zeka destekli bir kod yazdırıp onu deneyeceğim. yardımcı olursanız çok sevinirim. motoru döndürmeyi başardığımda, hız sensörü ve lcd ile rpm değerini okutup yazdıracağım ve son aşama olarakta motora yük bindiğinde istenilen hıza geri dönmesini sağlamam gerekiyor. proteus görüntüsünde pic16f877 fakat ben 16f877a ya göre kodu ve pic bacaklarını düzenledim yani proteus ekran görüntüsü birebir devrem ile aynı değil. kullandığım sürücü l298n (kırmızı). burada yapmam gereken nedir bir yol gösterin lütfen kafayı yemek üzereyim. normalde kesin çok basit bir şeydir fakat bu arlar kafam yerinde değil göremiyorum. kod (micro C)
Başlık: Ynt: pwm dc motor hız kontrolü devresi çalışmıyor
Gönderen: ete - 30 Ocak 2024, 21:24:25
Programını simulasyonda çalıştırmayı denedinmi?. En azından ADC ölçümünün ve motor kontrolünün doğru olup olmadığını oradan anlayabilirdin. Hatta hex dosyasını ve simulasyon dosyasınıda buraya koyup bizimde görmemizi sağlayabilirdin.
Programda mantıksal bir hata görmedim. Ancak o kadar boş pinvar iken tutup da POT'u AN4 pinine bağlaman bence yanlış. 16F877A nın analog pinleri bağımsız olarak pek kullanılamıyor. Örnek vereyim, Senin AN4 pinini Analog olarak kullanabilmen için aşağıdaki seçenekler mevcut. - Bütün anolog pinler aktif iken - AN0-AN4 pinleri analog diğerleri digital - AN7 ve AN6 pinleri digital diğerleri analog Şemada PORTA pinleri boşta gözüküyor ama sen onları başka amaçlar için kullanıyor olabilirsin. Normalde pinleri ADCON1 registeri ayarlıyor ama Micro-C de set_adc_channel(4) komutu verildiğinde derleyici ADCON1 registeri üzerinden bunu ayarlıyor ama acaba nasıl ayarladı bunu bilmiyoruz. Sİmulasyondan watch windowdan ADCON1 registerini izleyerek anlaşılabilirdi.
Şayet PORTA pinleri boşta ise tavsiyem AN0 pinini analog olarak kullanman. Çünki bu pini yalnız başına analog olarak tanımlayabiliyorsun.
Ete
Başlık: Ynt: pwm dc motor hız kontrolü devresi çalışmıyor
Gönderen: dgkn - 30 Ocak 2024, 21:57:45
temelde yapmak istediğim ve izlediğim adımlar bu videoda; https://www.youtube.com/watch?v=ee-oFts-AFY&t=896s
*bu videodaki uygulamayı yapmak istiyorum sadece. ben temelde motorun hız kontrolünü yapmak istiyorum ilk adımda hedefim bu kalan süreçte ise lcd, sensör, motor yükteyken istenilen hıza yükselme vs. vs. devam edeceğim dosyalar ise şunlar (ek-1)
Başlık: Ynt: pwm dc motor hız kontrolü devresi çalışmıyor
Gönderen: ete - 30 Ocak 2024, 23:18:15
Simulasyonda deneyince program ve devren çalışıyor. Gerçekte de çalışmaması için bir sebep görmüyorum.
Tabiiki gerçek devre ile simulasyon devresi bazı farklılıklar içerir. Genelde simulasyonda bir besleme voltajı temini ve bunun gerekli yerlere bağlanması gösterilmez. Umarım sen işlemcinin istediği 5V tu bir şekilde üretip işlemciye ve L298'e bağlamışsındır.
Yine İşlemciye 4Mhz lik bir kristal (veya rezonatör) de bağlaman gerekiyor. MCLR pininde 10K lık pullup direncinin olması gerekir bunuda kontrol et. Bu dediklerim tamam ise işlemci ile L298 in bağlantılarını teker teker kontrol. Özellikle kontrol pinlerinin yanlış bacaklardan alınmamış olmasına dikkat et. Sonuçta bütün bağlantıların şemaya uygun ise sisteminin çalışması gerekir. Bu arada nasıl bir motor kullanıyorsun buda önemli tabiiki. L298'in akım değerlerine uygun bir motor olması gerekir. Fazla güçlü bir motor entegrenin yanmasına sebep olabilir.
Başka da söyleyecek bir şey bulamıyorum. e sorunun var ise kurduğun devre ile alakalı olduğundan bağlantılara voltajlara odaklanmanda yarar var.
Ete
Başlık: Ynt: pwm dc motor hız kontrolü devresi çalışmıyor
Gönderen: dgkn - 31 Ocak 2024, 00:49:29
kontrol etmemi önerdiğiniz her şeyi kontrol ettim. fakat herhangi bir sonuç alamıyorum. mikrodenetleyici pwm sinyal üretmiyor olabilir mi gibi saçma sapan sorular geliyor aklıma. ama en aklıma yatan şey akım olabilir 5V aldığım adaptör 5V 1A bu besleme ile breadboard üzerindeki mikrodenetleyiciyi besliyorum. l298n için ise 12V gerekiyor onuda başka bir adaptör ile sağlıyorum. o adaptör ise 12V 2A.
voltaj ölçümlerimde beslemelerde herhangi bir sıkıntı yok sıkıntı şurada ccp1 pinindeki değer sabit. kodları değiştiriyorum bu paylaştığım ilk kodda sabit 2.5V verdi ve pot ayarıyla oynamama rağmen değişmedi in1 ve in2 ise 0.01V gibi bir şey verdi. normalde ccp1 pot ayarına göre ayarlanmalı ve in1, in2 pinlerinden birisi high birisi low vermeliydi. birçok kod değiştirdim 3 tane kod denedim hatta ve hatta chatgpt ile uzun bir istişare sonucu ona bile kod yazdırıp denedim fakat sınuç hüsran.
l298n sürücüsü eski bir sürücü 5 yıl önce alınmış bir sürücü o yüzden çalışmıyor olabilir diye denedim. enable bacağını 5v ile kitledim ve max verdim yani ve aynı şekilde 5v ile in1 bacağına güç verdim ve motorların ikisi de maks. hızda döndüler.
2 farklı motorum var birisi çok küçük bir DC motor birisi ise bazı sitelerde satılan araba şaftı gibi bir sistemdeki sarı tekerli motorlardan, şuan tam ismini hatırlayamadım.
gerçekten çok kötüyüm kaç gündür tek bir amaç var motorun hız ayarı sonrası yağ gibi akıp gelecek lakin çözüm bulamadım halen
Başlık: Ynt: pwm dc motor hız kontrolü devresi çalışmıyor
Gönderen: ete - 31 Ocak 2024, 09:10:11
Bu gibi durumlarda öncelikle işlemciden şüphe edilir. Ben genelde işlemcinin boş olan bir bacağına bir led bağlarım (220 ohm seri direnç ile) programa da ekleme yapıp ilk açılışta bu ledin yanıp sönmesini sağlarım. Yanıp sönüyor ise işlemci çalışıyor demektir. Daha sonra L298 den emin olmak gerekir ki onu yapmışsın zaten. ELinde bir skop olsa sorunu bulmak çok kolay elbette. Ama ibreli bir ölçü aletin var ise direk CCP1 çıkışına 2V kadamesine alarak voltaj ölçümü olarak bakabilirsin. Skop olsa direk bu bacağa bakıp kare dalga varmı görmen gerekirdi. Sİmulasyonda bu sinyal çıkıyor. Çalışıyor olması gerekirdi. Bazı garip tanımlamalar var programda. Bütün pinleri analog olarak seçiyor ama yalnızca PORTA.5 pinini giriş yapıyor. Bence TRISA registerine $20 yerine $FF vermesi gerekirdi.
Yapılabilecek diğer bir şey de aynı programı birde ben PBP ile yazıp sana hex dosyası vermem ve bu hex ile devreyi yeniden test etmen olabilir. Bunu gün içinde yapmaya çalışacağım. Benim program çalışır ise senin programdan şüphe edeceğiz demektir. Program çalışmaz ise kurduğun devreden şüphe edeceğiz.
Bu arada açıklamandan iki ayrı güç kaynağı kullandığını söylemişsin. Bu iki güç kaynağının GND lerini bir yerde birleştirmen gerekir bunu yaptın umarım. Son olarak bunuda test et. Ete
Başlık: Ynt: pwm dc motor hız kontrolü devresi çalışmıyor
Gönderen: ete - 31 Ocak 2024, 11:33:57
Programı yazdım ve test ettim. Motor hz kontrolünü simulasyonda daha iyi görebilmek için Motor üzerine tıklayın ve açılan pencerede 6 olan motor devir sayısını 200 yapın.
Şimdi yapman gereken dosya içindeki hx dosyasını işlemcine yüklemek ve aynı devrede durumu test etmek.
Sonucu bildir lütfen.
Ete
Başlık: Ynt: pwm dc motor hız kontrolü devresi çalışmıyor
Gönderen: dgkn - 31 Ocak 2024, 13:19:06
sayın ete gönderdiğiniz hex dosyasını yazdırıyorum(write) pickit3 ile fakat doğrulama(verify) yapmak istediğimde programda ''verification of program memory failed at address 0x000000'' hatası alıyorum. elimde 2 adet 16f877a var ikisinde de aynı sorun ile karşılaştım. ikisinde de hiçbir şey yoktu şuan çok şaşkınım. onlarca kod yükledim ve bugün bu yaşanıyor.
farklı bir kod denedim onda da aynı hatayı verdi
Başlık: Ynt: pwm dc motor hız kontrolü devresi çalışmıyor
Gönderen: dgkn - 31 Ocak 2024, 13:21:52
silip read yaptığımda 3FFF olması gerekirken şuan 0000 görüyorum
Başlık: Ynt: pwm dc motor hız kontrolü devresi çalışmıyor
Gönderen: dgkn - 31 Ocak 2024, 13:29:23
"configuration: 0ECF" nin altında kırmızı ile ALL PROTECT yazıyor bu daha öncesinde yoktu ilk kez karşılaşıyorum
Başlık: Ynt: pwm dc motor hız kontrolü devresi çalışmıyor
Gönderen: dgkn - 31 Ocak 2024, 13:39:41
SORUNU ÇÖZDÜM BİRAZDAN KODU DENEYECEĞİM
Başlık: Ynt: pwm dc motor hız kontrolü devresi çalışmıyor
Gönderen: alisumer - 31 Ocak 2024, 13:40:14
kod koruma aktif olduğunda pickit doğrulama yapamaz ama program genede yüklenir ve hata yoksa çalışır.pickit ten de bu ayarlar yapılabiliyor bi kontrol edin tools bölümünden
Başlık: Ynt: pwm dc motor hız kontrolü devresi çalışmıyor
Gönderen: dgkn - 31 Ocak 2024, 13:55:15
sayın ete kodu yükledim ve çalıştırdım. bilin bakalım ne oldu. ÇALIŞTI. çok mutluyum inanılmaz hemde. acaba kodda neler yaptınız neler değişti nasıl oldu gerçekten çok meraklar içerisindeyim.
ben kodu micro C ile yazıyorum. acaba bu hex dosyasındaki kodu bana micro C için yollayabilir misiniz ya da siz nereden yazdıysanız ben de oradan yazabilirim sorun değil.
bu koda lcd, sensör ile rpm okutup yazdırma, yük bindiğinde istenilen devire yükselme azalma gibi kodlar ekleyeceğim çünkü @ete
Başlık: Ynt: pwm dc motor hız kontrolü devresi çalışmıyor
Gönderen: ete - 31 Ocak 2024, 14:49:37
Demekki MicroC de yazılan kodlar çalışmıyor. Derleme doğru değil ve bana göre programda da bazı eksikler var.
Benim yazdığım program aşağı yukarı senin yazdıklarının karşılığı ama bazı farklar var. Dosya için uzantısı PBP olan dosya basic dosyasıdır. Bu dosyayı text editör ile açabilirsin. Senin kod'a göre benim yaptığım değişiklikler şunlar; - ADC okumasını 10 bit yapıyorum. Bunun sebebi 1Khz olan PWM frekansının maksimum duty değerinin 1000 olmasıdır. Yani pot dan bir şekilde 0-1000 arası değer elde etmeliyimki bunu DUTY değeri olarak kullanabileyim. Pot adc karşılığı olarak en fazla 1023 verir. Bunu basit bir formül ile, potdan okunacak 0-1023 aralığını 0-1000 değerine çevirdim ve bunu DUTY değeri olarak kullandım. Senin programda bu kısımlar hiç belli değil.
İşin PWM kısmında ise senin programda rastgele bir şey yapılmış gibi gözüküyor. 1Khz lik bir PWM frekansının CCP1 pininden çıkartılabilmesi için; PR2 registerine 249 değerinin verilmesi ve Timer2 bölme oranınında 1/4 yapılması gerekir. Bu frekansta bir PWM sinyalinin Duty değeri ise maksimum 1000 olabilmektedir. Dolayısıyla bütün hesap ve program bu temeller üzerine oturtuldu.Bu arada senin programın başında yaptığın CCP1 aktivasyonunu ben DUTY_VER etiketi altında; IF CCP1CON=0 THEN CCP1CON=%00001100 satırı ile yaptım. Sen baştan verebilirsin.
MikroC bilmediğimi söylemiştim. C dilini genel anlamda inceleyebilir biraz anlayabilirim ama kod yazamam.
Programın açık halini buraya koyuyorum incelemek isterseniz.
#CONFIG
__CONFIG _CP_ALL & _WRT_256 & _CPD_ON & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
#ENDCONFIG
DEFINE OSC 4
DEFINE ADC_BITS 10 ' ADCIN resolution (Bits)
DEFINE ADC_CLOCK 1 ' ADC clock source (Fosc/8)
DEFINE ADC_SAMPLEUS 20 ' ADC sampling time (uSec)
DEFINE LCD_DREG PORTB 'LCD data port
DEFINE LCD_DBIT 4 'LCD data starting bit 0 or 4
DEFINE LCD_RSREG PORTB 'LCD register select port
DEFINE LCD_RSBIT 1 'LCD register select bit
DEFINE LCD_EREG PORTB 'LCD enable port
DEFINE LCD_EBIT 0 'LCD enable bit
DEFINE LCD_RWREG PORTB 'LCD read/write port
DEFINE LCD_RWBIT 2 'LCD read/write bit
DEFINE LCD_BITS 4 'LCD bus size 4 or 8
DEFINE LCD_LINES 2 'Number lines on LCD
'DEFINE LCD_COMMANDUS 2000 'Command delay time in us
'DEFINE LCD_DATAUS 50 'Data delay time in us
CMCON=7
ADCON0=%01000000
ADCON1=%10000000
TRISA=%11111111
TRISB=%00000000
TRISC=%00000000
TRISD=%00000000
TRISE=%00000000
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0
HAM VAR WORD 56
VOLT VAR WORD 58
DUTY VAR WORD 60
X VAR WORD
ESKI VAR WORD
YUZDE VAR BYTE
SYMBOL IN1=PORTC.3
SYMBOL IN2=PORTC.4
portb.2=0
lcdout $fe,1
pause 200
lcdout $FE,$80,"LUTFEN BEKLEYIN"
LCDOUT $FE,$C0,"SISTEM ACILIYOR"
PAUSE 500
PR2=249
T2CON=%00000101 'İLK İKİ BİT %00=1/1 %01=1/4 %10=1/16
DUTY=0:GOSUB DUTY_VER
LCDOUT $FE,1
LCDOUT $FE,$C0,"SISTEM ACILDI"
BASLA:
GOSUB ADC_OKU
IN1=1:IN2=0
IF ESKI=DUTY THEN BASLA
GOSUB DUTY_VER:ESKI=DUTY
LCDOUT $FE,$80,"VOLT=",DEC (VOLT/100),",",DEC2 VOLT//100," "
LCDOUT $FE,$C0,"DUTY=",DEC DUTY," %=",DEC YUZDE," "
GOTO BASLA
ADC_OKU:
ADCIN 4,HAM
DUTY=(HAM*/2503)/10
VOLT=(HAM*/1252)/10
YUZDE=DUTY/10
RETURN
DUTY_VER:
IF CCP1CON=0 THEN CCP1CON=%00001100
X=DUTY
CCP1CON.4=X.0
CCP1CON.5=X.1
CCPR1L=(X>>2)
RETURN
Başlık: Ynt: pwm dc motor hız kontrolü devresi çalışmıyor
Gönderen: mehmet - 31 Ocak 2024, 15:49:09
O kodlar sanki CCS C kodları. MikroC değil.
Başlık: Ynt: pwm dc motor hız kontrolü devresi çalışmıyor
Gönderen: dgkn - 31 Ocak 2024, 17:02:46
sayın ete verdiğiniz bu koda kızılötesi hız sensörü bağlamak istiyorum ve sizin kodunuzun üzerine yardımlarla birlikte bu güncellemeleri yaptım. sizin bu konuda ne kadar profesyonel olduğunuzu bildiğim için size kodu göstermek istiyorum. yaptığım yanlışlar ve eksikleri bana söyler misiniz? @ete
#CONFIG
__CONFIG _CP_ALL & _WRT_256 & _CPD_ON & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
#ENDCONFIG
DEFINE OSC 4
DEFINE ADC_BITS 10 ' ADCIN resolution (Bits)
DEFINE ADC_CLOCK 1 ' ADC clock source (Fosc/8)
DEFINE ADC_SAMPLEUS 20 ' ADC sampling time (uSec)
DEFINE LCD_DREG PORTB 'LCD data port
DEFINE LCD_DBIT 4 'LCD data starting bit 0 or 4
DEFINE LCD_RSREG PORTB 'LCD register select port
DEFINE LCD_RSBIT 1 'LCD register select bit
DEFINE LCD_EREG PORTB 'LCD enable port
DEFINE LCD_EBIT 0 'LCD enable bit
DEFINE LCD_RWREG PORTB 'LCD read/write port
DEFINE LCD_RWBIT 2 'LCD read/write bit
DEFINE LCD_BITS 4 'LCD bus size 4 or 8
DEFINE LCD_LINES 2 'Number lines on LCD
'DEFINE LCD_COMMANDUS 2000 'Command delay time in us
'DEFINE LCD_DATAUS 50 'Data delay time in us
CMCON=7
ADCON0=%01000000
ADCON1=%10000000
TRISA=%11111111
TRISB=%00000000
TRISC=%00000000
TRISD=%00000000
TRISE=%00000000
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0
HAM VAR WORD 56
VOLT VAR WORD 58
DUTY VAR WORD 60
X VAR WORD
ESKI VAR WORD
YUZDE VAR BYTE
HIZ VAR WORD ' Motor hızı için değişken
SYMBOL IN1=PORTC.3
SYMBOL IN2=PORTC.4
SYMBOL SENSOR_PIN = PORTC.0 ' Kızılötesi sensörün çıkış pini
SYMBOL POT = 4 ' Potansiyometre bağlantısı (Analog giriş RA4)
portb.2=0
lcdout $fe,1
pause 200
lcdout $FE,$80,"LUTFEN BEKLEYIN"
LCDOUT $FE,$C0,"SISTEM ACILIYOR"
PAUSE 500
PR2=249
T2CON=%00000101 'İLK İKİ BİT %00=1/1 %01=1/4 %10=1/16
DUTY=0:GOSUB DUTY_VER
LCDOUT $FE,1
LCDOUT $FE,$C0,"SISTEM ACILDI"
' Kesme (Interrupt) Rutini Tanımı
INCLUDE "modedefs.bas"
INCLUDE "intdefs.bas"
' Kesme Rutini Tanımları
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler RB_INT, _RB_INT, PBP, yes
endm
INT_CREATE
ENDASM
ENABLE RB_INT ; Kesme (Interrupt) Aktif Edilir
BASLA:
GOTO BASLA ' Ana döngüye geri dön
' Kesme (Interrupt) Rutini
RB_INT:
' Kızılötesi hız sensöründen okuma
HIZ = HIZ + 1 ' Sensör her algılandığında hızı bir arttır
INTCON.0 = 0 ' Kesmeyi temizle
RETURN
DUTY_VER:
IF CCP1CON=0 THEN CCP1CON=%00001100
X=DUTY
CCP1CON.4=X.0
CCP1CON.5=X.1
CCPR1L=(X>>2)
RETURN
Başlık: Ynt: pwm dc motor hız kontrolü devresi çalışmıyor
Gönderen: dgkn - 31 Ocak 2024, 17:04:17
evet öyle. kusuruma bakmayın benim yanlış söylediğim fakat bir türlü düzeltemediğim bir konu. alışkanlık haline getirdim bu yanlışı. arkadaşlarımla aramızda geçen bir muhabbet sonucu ağzıma yanlış yer etmiş bir durum.
Başlık: Ynt: pwm dc motor hız kontrolü devresi çalışmıyor
Gönderen: ete - 31 Ocak 2024, 19:28:28
İnfrared sensör ile ilgili yazılanlara baktım. Bana göre pek çok yanlış şey var.
Birincisi normal kesme yerine DarrelTaylor'un ASM kesmeleri sistemini kullanmışsın. Kesme PORTB de INT kesmesi yani PORTB.0 dan sensörün giriş yapması gerekir. Buradan sensör girince o pinin Giriş olarak ayarlanmasıda gerekecektir. Bu konuda hiç bir hazırlık göremedim. Önceki şemadaa PORTB.0 pini LCD tarafından kullanılıyor idi ve halada kullanılmaya devam ediyor. Bu durumda bu kesmeyi kullanamazsın. Ya PORTB.0 daki işlevi boşta olan başka bir pine vereceksin yada başka bir çare düşüneceksin. Muhtemel çareleri açıklamadan önce bir noktaya parmak basmak isterim. Pic İşlemcilerde PORTB çok özel bir port dur. Bu port genelde hariçten gelen bağlantılar için ayrılmıştır. İçeriden Pullup dirençleri vardır yazılımla aktif pasif yapılabilirler. Bu nedenle bu özel portu LCD gibi lüzumsuz bir işe kullanmakla yazık etmiş oluyorsun. Bu hatayı nedense pek çok kişi yapıyor. Gelelim muhtemel alternatiflere 1) LCD yi başka bir porta geçirirsen PORTB.0 da boşa çıkar ve sende bu pini INT kesmesi için kullanabilirsin. 2. Benzer şekilde PORTB nin diğer bir özelliğide PORT değişiklik kesmesine müsaade etmesidir. Bu işlemcide PORTB.4 ile PortB.7 pinleri port daki değişiklik kesmesi için kullanılabilmektedir. Bu pinlerden birisini kullanarak yine sensör sayımı yaptırabilirsin. 3. Yada Timer-1 sayacını kullanarak belirli bir süre içinde kaç tane sensör palsi sayıldığına bakabilirsin.
Asıl önemli olan bir şeyide atlamışsın. Hız nasıl ölçülür? bunu bildiğini sanmıyorum. Özellikle Kızılötesi sensör kullanarak bu nasıl yapılacak acaba?. Kızılötesi sensör dediğin sadece bir ışık sensörü ve kızıl ötesi yani infrared ışığı algılıyor. O halde motor miline en azından bir çark bağlaman ve o çarkın üzerinde tam kızılötesi sensörün ışık veren tarafına denk gelecek bir delik olması gerekir. Böylece çark döndüğü zaman delik sensör önüne geldiğinde senin kesmen oluşur ve hız=hız+1 olur. Peki sürekli hız kesmelerini toplamak bir işe yarayacakmı? elbette yaramayacak. Bu hız bilgisi değildir. Çarkında tek delik var ise senin sistemin tur başına 1 kesme oluşturur. Bu durumda en azından 1 sn lik bir zaman tutup o esnada hız sayacının kaç adet saydığına bakman işini böyük ölçüde halledecektir. Döner cisimlerin hızı devir/dakika ile ölçülür. O halde aldığın Hız ölçüsünü 1 sn den 1dakikaya çevirmen gerekecektir. Saydığın değeri 60 ile çarparsan sana 1 dakikadaki devir sayısını verecektir. Böylece motorun hızını ölçmüş olursun.
Bu kadar teorik bilginin ardından artık seninde bir şeyleri anlayıp yapmanı beklemek gerekecek. Devir hızı ölçecek isen ne yapacağını söyleyeyim.
Öncelikle yukarıda açıkladığım hataları düzelt eksiklikleri tamamla. Sonra 1 sn lik bir zaman tutabilmenin yolunu araştır. Zira Basic kullanacak isen Pause 1000 sana 1 sn lik gecikmeyi verir ama bu esnada hiçbir kesme çalışmaz. Yalnız Darrel'in kesme rutini belki çalışabilir emin değilim. Denemek lazım. Bu nedenle zamanı Timer-1 sayacı ile tutmakta yarar var. Oda nasıl yapılır anlatayım. 4 Mhz OSC frekansında Timer1 sayacı bileşenleri olan TMR1H ve TMR1L değişkenlerine aşağıdaki ön yükleme değerlerini verirsen; TMR1H=$0B ve TMR1L=$DC sayac bu değer (3036) den başlayarak sayar ve sayac değeri 65535 i aştığı anda PIR1.0 register bitini set eder. Buda sana 500ms lik bir süre verir. O halde bu sayma işlemini 2 defa yaparsan 1 sn lik süreyi geçirmiş olursun. Önce PIR1.0=0 şeklinde kesme bayrağını sıfırlarsın. Ardından saydırmaya başlarsın While PIR1.0=0:Wend burda aynı işlemi bir kez daha yaptırırsın böylece 1 sn geçmiş olur. Yada sistemi 500 ms içinde sayacak şekilde çalıştırır ve saydığın rakamı 2 ile çarparsın buda bir yoldur. Bir karşık anlatım gibi oldu ama bana göre her şey açık. Anlamadığın yeri sorarsın.
Ete
Başlık: Ynt: pwm dc motor hız kontrolü devresi çalışmıyor
Gönderen: dgkn - 02 Şubat 2024, 01:21:33
Sayın ete anlattıklarınız doğrultusunda bir şeyler yapmaya çalıştım. emin olmamakla beraber galiba oldu. sizin yorumlarınız benim için çok değerli. eğer başarabilmişsem bir yanlışım yok ise pid kontrol için olan kısma geçmek istiyorum. (motora yük bindiğinde duty değerini arttırarak pot ile girilen hıza tekrar sabitlenmesi.) (kodda motor miline bağlı olan çarkta toplam 20 delik var.) (rpm kısmı HIZ*3 mü yoksa HIZ/3 mü olacak emin değlim şuan) @ete
#CONFIG
__CONFIG _CP_ALL & _WRT_256 & _CPD_ON & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
#ENDCONFIG
' Kristal osilatör frekansı
DEFINE OSC 4
' ADC özellikleri
DEFINE ADC_BITS 10 ' ADCIN çözünürlüğü (bit)
DEFINE ADC_CLOCK 1 ' ADC saat kaynağı (Fosc/8)
DEFINE ADC_SAMPLEUS 20 ' ADC örnekleme zamanı (μs)
' LCD bağlantıları
DEFINE LCD_DREG PORTD ' LCD veri portu
DEFINE LCD_DBIT 4 ' LCD veri başlangıç biti 0 veya 4
DEFINE LCD_RSREG PORTD ' LCD kayıt seçim portu
DEFINE LCD_RSBIT 1 ' LCD kayıt seçim biti
DEFINE LCD_EREG PORTD ' LCD etkinleştirme portu
DEFINE LCD_EBIT 0 ' LCD etkinleştirme biti
DEFINE LCD_RWREG PORTD ' LCD oku/yaz portu
DEFINE LCD_RWBIT 2 ' LCD oku/yaz biti
DEFINE LCD_BITS 4 ' LCD veri yolu boyutu 4 veya 8
DEFINE LCD_LINES 2 ' LCD üzerindeki satır sayısı
'DEFINE LCD_COMMANDUS 2000 ' Komut gecikme süresi (μs)
'DEFINE LCD_DATAUS 50 ' Veri gecikme süresi (μs)
' Analog-Dijital Dönüşüm için giriş/çıkış tanımlamaları
CMCON = 7
ADCON0 = %01000000
ADCON1 = %10000000
TRISA = %11111111
TRISB = %00000001 ' sensör pini giriş olarak ayarla
TRISC = %00000000
TRISD = 0 ' D portunu tamamen çıkış olarak ayarla
TRISE = %00000000
' Portları sıfırla
PORTA = 0
PORTB = 0
PORTC = 0
PORTD = 0
PORTE = 0
' Değişken tanımlamaları
HAM VAR WORD 56
VOLT VAR WORD 58
DUTY VAR WORD 60
X VAR WORD
ESKI VAR WORD
YUZDE VAR BYTE
HIZ VAR WORD ' Motor hızı için değişken
RPM VAR WORD ' RPM değeri için değişken
' Simge tanımlamaları
SYMBOL IN1 = PORTC.3
SYMBOL IN2 = PORTC.4
SYMBOL SENSOR_PIN = PORTB.0 ' Kızılötesi sensörün çıkış pini
SYMBOL POT = 4 ' Potansiyometre bağlantısı (Analog giriş RA4)
' Başlangıç mesajlarını göster
LCDOUT $FE,1
LCDOUT $FE,$80,"LUTFEN BEKLEYIN"
LCDOUT $FE,$C0,"SISTEM ACILIYOR"
PAUSE 500
' PWM ayarları
PR2 = 249
T2CON = %00000101 ' İLK İKİ BİT %00=1/1 %01=1/4 %10=1/16
DUTY = 0
GOSUB DUTY_VER ' PWM Duty Cycle Ayarlama Rutini
' Sistem açıldı mesajını göster
LCDOUT $FE,1
LCDOUT $FE,$C0,"SISTEM ACILDI"
' Ana döngü
BASLA:
' ADC okuma
GOSUB ADC_OKU
' IN1 ve IN2 sinyallerini ayarla
IN1 = 1
IN2 = 0
' Eğer eski değer duty değeriyle aynıysa, döngüyü tekrarla
IF ESKI = DUTY THEN BASLA
' Duty Cycle'ı ayarla ve eski değeri güncelle
GOSUB DUTY_VER
ESKI = DUTY
' LCD'ye gerilim, duty cycle ve RPM değerlerini yazdır
LCDOUT $FE,$80,"DUTY=",DEC(DUTY)," %=",DEC YUZDE," "
LCDOUT $FE,$C0,"RPM=",DEC RPM
' Ana döngüye geri dön
GOTO BASLA
' ADC okuma rutini
ADC_OKU:
ADCIN 4, HAM
DUTY = (HAM * 2503) / 10
VOLT = (HAM * 1252) / 10
YUZDE = DUTY / 10
' Sensörden gelen impulsları kullanarak RPM hesapla
RPM = HIZ * 3 ' Bir dakikada ölçülen impulsların sayısı (dakikadaki devir sayısı)
RETURN
' PWM Duty Cycle Ayarlama Rutini
DUTY_VER:
IF CCP1CON = 0 THEN CCP1CON = %00001100
X = DUTY
CCP1CON.4 = X.0
CCP1CON.5 = X.1
CCPR1L = (X >> 2)
RETURN
Başlık: Ynt: pwm dc motor hız kontrolü devresi çalışmıyor
Gönderen: ete - 02 Şubat 2024, 09:05:21
Alıntı Yapkodda motor miline bağlı olan çarkta toplam 20 delik var.) (rpm kısmı HIZ*3 mü yoksa HIZ/3 mü olacak emin değlim şuan)
Motor miline bağlı çarkta 20 delik var. Senin motorun tam bir devir yaptığında senin hız ölçerin kaç adet puls okuyacak düşündünmü? Elbette 20 puls okuyacak. 1dak içinde toplam 20 puls okunmuş ise senin motorun kaç dev/dak ile dönüyordur sence? Formül şöyle idi; Hız (Dev/dak)=1 dak içinde sayılan Puls sayısı/çarktaki delik sayısı Bu durumda hız=20/20=1 dev/dak ile dönüyor demektir.
Bence pek kafanı çalıştırmıyorsun ve sürekli bir şeyleri kopyala yapıştır yapıyorsun. Öncelikle bu tutumunu değiştir. İşin içine aklını kat.
Bir basic programı satır takip eder.Bir satırdaki emrileri yerine getirdikten sonra bir sonraki satıra otomatik geçer. Şimdi bu mantık üzerinden düşünelim.!!!! senin program; - ADC den değer okuyup bunu DUTY değeri olarak çevirip kullanacak O halde ADC okumaya gidip gelmeli bunu GISUB ADC_OKU komutu ile yaptırdık. - ADC okumadan elde ettiği Duty değerini PWM sinyalinin Duty değeri olarak atayacak ohalde DUTY_VER isimli etikete gidip bu işi yapacak ve bunuda GOSUB DUTY_VER komutu ile yaptırdık. - Motoru hareket ettirecek. Bunuda IN1 ve IN2 pinlerine gereken lojik durumları vererek hallettik - LCD de yapılan işleri göstermek gerekecek bunları da LCDOUT komutları ile yaptık. - Son iş devir ölçülecek Buna ait bir komut verdinmi.? hayır. Öncelikle buna ait bir alt program yaratman gerekiyor.BU alt programa HIZ_OLC ismini verelim. Bu alt programda; a) Öncelikle her biri 500 ms olan bir Timer-1 kesme döngüsü yaratacaksın b) Bu döngüyü 2 defa çalıştırırsan 1 sn lik zamanı geçirmiş olacaksın. Bu nedenle KES=2 şeklinde bir Byte değişkeni ayarla. Sonra döngüye girmeden önce HIZ=0 yap ki hız ölçümü zaman sayacı çalışmaya başladıktan sonra saymaya başlasın. Tabiiki HIZ ölçme için bir de giriş pini ayarlaman gerekiyordu ki bunu PORTB.0 olarak yapmışsın. c) Döngüye girmeden önce TMR1H=$0B:TMR1L=$DC ve PIR1.0=0 komutlarını vererek sayacı hazır hale getiriceksin ve önceden de T1CON=%00xx0001 komutunu vereceksin. Dikkat edersen binary sayının içinde XX harfleri var. Bu ikisi TMR1 sayacının bölme oranını ayarlar. XX=00 olursa bölme yok 1/1 , XX=01 olursa 1/2 bölme, XX=10 olursa 1/4 bölme, XX=11 olursa 1/8 bölme oranın olur. Şimdi kendi kendimize soralım hangi bölme oranını kullanalım?. Bunun için bir mantık hesabı yapmamız gerekecek. Motorun ortalama 500 dev/dak. hızla döner ise motor çarkı 500*20=10.000 puls üretir. 1 dakikada HIZ sayacın 10.000 puls sayacak demektir. Peki o motor 1000 dev/dak hızla dönerse senin HIZ sayacın HIZ=1000 *20=20.000 saaycak demektir. Bütün bu değerler WORD değişkenin taşıyabileceği 65535 rakamından küçük olacağı için 1/1 bölme oranını kullanabilirsin demektir bu sonuçlar. O halde T1CON=%00000001 komutunu vererek işi başlatman gerekir. Önceki mesajımda buranın detayını vermiş idim. 1 sn zaman tuttun. Sonuçta HIZ sayacın bri değer saydı ve bunu 60 ile çarparak 1dak. içinde kaç puls üretildiğini bulacaksın Bunuda 20 ye bölersen motorunun RPM değerini bulmuş olacak ve RETURN ile geri döneceksin. Sende eksik olan bu son bölümde anlattıklarım. Gidip ADC okumanın içine hiç alakası olmamasına rağmen, " ' Sensörden gelen impulsları kullanarak RPM hesapla RPM = HIZ * 3 ' Bir dakikada ölçülen impulsların sayısı (dakikadaki devir sayısı)" satırlarını eklemişsin. Bunları buradan sil ve anlattığım şekilde yeniden toparla. HIZ nasıl hesaplanır iyice öğren anlattım burada. Hangi akıla dayanarak RPM=HIZ*3 formülünü yazdın çok merak ediyorum. Mantığın neydi acaba? 3 rakamı özellikle nereden çıktı?. Mantıksız işler yapma lütfen. Araştırma yap ve Kafanı çalıştır!!!!!.
Ete
Başlık: Ynt: pwm dc motor hız kontrolü devresi çalışmıyor
Gönderen: dgkn - 02 Şubat 2024, 15:11:32
3 rakamına bayağı gerilmişsiniz sayın ete RPM = (HIZ * 60) / 20 o da eşittir HIZ*3 basit matematik... şu şekilde düzenledim. kod yazma gibi işleri hiçbir şekilde bilmediğim için çok fazla hatalarım oluyor. daha birkaç gün önce başladım çünkü
umarım bu şekilde doğru bir sona ulaşmışımdır. yeniden teşekkür ederim @ete
yeni kod şöyle
#CONFIG
__CONFIG _CP_ALL & _WRT_256 & _CPD_ON & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
#ENDCONFIG
' Kristal osilatör frekansı
DEFINE OSC 4
' ADC özellikleri
DEFINE ADC_BITS 10 ' ADCIN çözünürlüğü (bit)
DEFINE ADC_CLOCK 1 ' ADC saat kaynağı (Fosc/8)
DEFINE ADC_SAMPLEUS 20 ' ADC örnekleme zamanı (μs)
' LCD bağlantıları
DEFINE LCD_DREG PORTD ' LCD veri portu
DEFINE LCD_DBIT 4 ' LCD veri başlangıç biti 0 veya 4
DEFINE LCD_RSREG PORTD ' LCD kayıt seçim portu
DEFINE LCD_RSBIT 1 ' LCD kayıt seçim biti
DEFINE LCD_EREG PORTD ' LCD etkinleştirme portu
DEFINE LCD_EBIT 0 ' LCD etkinleştirme biti
DEFINE LCD_RWREG PORTD ' LCD oku/yaz portu
DEFINE LCD_RWBIT 2 ' LCD oku/yaz biti
DEFINE LCD_BITS 4 ' LCD veri yolu boyutu 4 veya 8
DEFINE LCD_LINES 2 ' LCD üzerindeki satır sayısı
'DEFINE LCD_COMMANDUS 2000 ' Komut gecikme süresi (μs)
'DEFINE LCD_DATAUS 50 ' Veri gecikme süresi (μs)
' Analog-Dijital Dönüşüm için giriş/çıkış tanımlamaları
CMCON = 7
ADCON0 = %01000000
ADCON1 = %10000000
TRISA = %11111111
TRISB = %00000001 ' sensör pini giriş olarak ayarla
TRISC = %00000000
TRISD = 0 ' D portunu tamamen çıkış olarak ayarla
TRISE = %00000000
' Portları sıfırla
PORTA = 0
PORTB = 0
PORTC = 0
PORTD = 0
PORTE = 0
' Değişken tanımlamaları
HAM VAR WORD 56
VOLT VAR WORD 58
DUTY VAR WORD 60
X VAR WORD
ESKI VAR WORD
YUZDE VAR BYTE
HIZ VAR WORD ' Motor hızı için değişken
RPM VAR WORD ' RPM değeri için değişken
' Simge tanımlamaları
SYMBOL IN1 = PORTC.3
SYMBOL IN2 = PORTC.4
SYMBOL SENSOR_PIN = PORTB.0 ' Kızılötesi sensörün çıkış pini
SYMBOL POT = 4 ' Potansiyometre bağlantısı (Analog giriş RA4)
' Başlangıç mesajlarını göster
LCDOUT $FE,1
LCDOUT $FE,$80,"LUTFEN BEKLEYIN"
LCDOUT $FE,$C0,"SISTEM ACILIYOR"
PAUSE 500
' PWM ayarları
PR2 = 249
T2CON = %00000101 ' İLK İKİ BİT %00=1/1 %01=1/4 %10=1/16
DUTY = 0
GOSUB DUTY_VER ' PWM Duty Cycle Ayarlama Rutini
' Sistem açıldı mesajını göster
LCDOUT $FE,1
LCDOUT $FE,$C0,"SISTEM ACILDI"
' Ana döngü
BASLA:
' ADC okuma
GOSUB ADC_OKU
' IN1 ve IN2 sinyallerini ayarla
IN1 = 1
IN2 = 0
' Eğer eski değer duty değeriyle aynıysa, döngüyü tekrarla
IF ESKI = DUTY THEN BASLA
' Duty Cycle'ı ayarla ve eski değeri güncelle
GOSUB DUTY_VER
ESKI = DUTY
' LCD'ye gerilim, duty cycle ve RPM değerlerini yazdır
LCDOUT $FE,$80,"DUTY=",DEC(DUTY)," %=",DEC YUZDE," "
LCDOUT $FE,$C0,"RPM=",DEC RPM
' Ana döngüye geri dön
GOTO BASLA
' ADC okuma rutini
ADC_OKU:
ADCIN 4, HAM
DUTY = (HAM * 2503) / 10
VOLT = (HAM * 1252) / 10
YUZDE = DUTY / 10
' Sensörden gelen impulsları kullanarak RPM hesapla
GOSUB HIZ_OLC
RETURN
' RPM hesaplama rutini
HIZ_OLC:
' Timer1'in bölme oranını ayarla
T1CON = %00000001 ' 1/1 bölme oranı
' Timer1'i sıfırla
TMR1H = $0B
TMR1L = $DC
' Kesme (interrupt) bayrağını temizle
PIR1.0 = 0
' Timer1'i başlat
T1CON.0 = 1
' Impuls sayacını sıfırla
HIZ = 0
' Timer1 kesme (interrupt) bayrağı 20 kez tetiklendiğinde, 1 devir tamamlanmış olacak
KES = 20
' Hızı hesapla: 1 dakika içinde kaç pulse olduğunu hesapla
' HIZ değişkeni 1 dakikadaki impulsları içerir
' HIZ değerini 60 ile çarparak dakikadaki pulse sayısını elde ederiz
' Ardından bu değeri çarktaki delik sayısına bölerek RPM değerini buluruz
RPM = (HIZ * 60) / 20
' Ana döngüye geri dön
RETURN
' PWM Duty Cycle Ayarlama Rutini
DUTY_VER:
IF CCP1CON = 0 THEN CCP1CON = %00001100
X = DUTY
CCP1CON.4 = X.0
CCP1CON.5 = X.1
CCPR1L = (X >> 2)
RETURN
*(KES VAR BYTE ' Impuls sayısı şeklinde KES sembolünü de tanımladım bu kodda yok şuan ) **(SYMBOL POT_PIN = 4 değeri de düzletildi)
Başlık: Ynt: pwm dc motor hız kontrolü devresi çalışmıyor
Gönderen: dgkn - 02 Şubat 2024, 16:50:54
kodu denedim pot ayarı 0 iken bile motor dönüyor ve sistem kafayı yedi duty değeri bazen %1xx gibi değerler veriyor ve rpm değeri sabit 0 görünüyor ayrıca sistem açıldı yazısı ve rpm iç içe gömülmüş şekilde görünüyor. nerede hata yaptım iyice kafam çorba oldu. kod yazma işini bilmemek çok zorluklar getiriyor bana