PIC 16f877a veL298 N Motor Sürücüsü ile DC Motoru İleri Hareket Ettirmek

Başlatan MG33, 30 Ağustos 2021, 16:31:45

MG33

Amacım başlıkta da olduğu gibi PIC 16f877a ve L298 N Motor Sürücüsü ile motoru ileri geri hareket ettirmeyi denemek , bu vasıtayla engelden kaçan robot yapmak istiyorum, fakat motoru bir türlü ileri hareket ettiremedim. Mplab platformunda kodu yazdım. Kodu mikrodenetleyiciye yükledim.Sonra,Devreyi kurup motor sürücüyü 2 tane lion pili seri bağlayarak besledim. Sürücünün ışığı yandı. Fakat DC motor çalışmadı. Aklıma bir kaç soru takıldı; motor çalışmadıysa, sebebi sürücüdeki enable pini bos bırakamaktan mı kaynaklı? eğer bundansa mikrodenetleyicinin ccp pininden birine bağlayıp ayrıca kod kısmına pwm ayarları mı yapılmalı? Eğer sorun bu değil ise devrede mi bir sıkıntı var? ya da bir başka noktada mı hata yapıyorum?

Kod:
// CONFIG
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF         // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)


#include <proc/pic16f877a.h>
#include <xc.h>
#include <stdio.h>
#include <string.h>

#define _XTAL_FREQ 4000000


#define MOTOR_R1 RD0   // Right Motor Red Terminal
#define MOTOR_R2 RD1   // Right Motor Black Terminal

void forward()
{
    //MOTOR_L1 = 1;
    //MOTOR_L2 = 0;
    MOTOR_RE = 1;
    MOTOR_R1 = 1;
    MOTOR_R2 = 0;

}


int main()
{
    TRISD = 0b00000000;
    PORTD = 0x00;
   
    //TRISC = 0b00000000;
    //PORTC = 0x00;
   
    while(1)
    {
        forward();
   
    }
   
    return 0;


ete

Data sheet diyorki enbl ucuna high ver kontrol uçlarından birine H diğerine L verirsen motor bir yöne tersini verirsen diğer yöne döner. Şema olmadığı için kime ne veriyorsun göremiyoruz.
L298 de iki motor sürücüsü var her birinin enable ve kontrol girişleri farklı pinlerde dikkat etmek gerek.
Diğer önemli bir konu da SENS uçları. Motorun çalıştığını görmek istiyor isen bu uçları direk GND ye bağlaman gerekiyor. Yada bu uçlar ile GND arasına 0,5 ohm değerinde direnç bağlaman gerekir.

Ete

alisumer

hocam aşağı yukarı benzer konular dye yeni başlık açmak istemedim forumda da bulamadım RC araçlar için fırçasız biraz karışık ama en azından fırçalı ESC yapmayı düşünüyorum madem kendim yapıyorum kumandasını kasasını esc de benden olsun her seferinde 100 tl vermeyeyim diyorum ama 1ms-2-ms puls üretme işine benzemiyor esc için 1-2 ms zaman aralığı hassas  okumam ve ona göre motoru sağa sola hız kontrolunu yapacak şekilde sürmem gerek basic için hangi kod ideal pulsin yeterince çözünürlük verirmi nasıl bir algoritma kurmalıyım birde mosfet H köprüsü gerek tabi daha önce bu tarz motor sürücü yapan varsa onlardan da yardımbekliyorum
Hep meraktan

ete

Puls genişliğini ölçmenin bir kaç yolu var. Hangisi kolayına geliyor ise veya hangisi çözünürlük olarak yeterli ise onu kullanırsın.
1) Birinci yolu Pulsin komutunu kullanmak. Bu komut çözünürlüğu işlemci frekansına bağlı olarak değişir. 4 Mhzde 10 ile çarpılmış bir değer bulursun. 20 Mhz osc frekansında ise 2us lik artışlarla sonucu elde edersin. Avantajı her pine uygulanabilir olmasıdır.
2) İkinci metod Timer1 sayacını kullanmak. Bu metod da, hangi peryodu (LOW-HIGH) ölçecek isen ona göre sinyalin başlangıç noktasını bulman gerekiyor. Diyelimki HIGH peryoud ölçeceksin. Önce sinyalin LOW kısmını bulup o kısımda Timer registerlerini ayarlayacak ve timer'ı sıfırlayacaksın.
Tam sinyal HIGH konumuna geçtiğinde ise sayacı aktif edip süre sonunda sayac değerini alacaksın.
Sinyalin büyüklüğüne bağlı olarak bölücü kullanmak gerekebilir. SOnucuda ona göre hesaplarsın. Bu işlemde yine OSC frekansına bağlı olarak sana sonuç verecektir.
3) Üçüncü metod da ise CCPX Capture modunda ölçüm yapmak . Buda en hassas ölçümlerden birisi dir. CCPxCON registerinin ilk 4 biti ayarlanarak her yükselen kenarda yada her düşen kenarda yakalama yapması sağlanır. Örneğin önce yükselen kenara ayarlayıp CCP1 kesmesinide aktif edersen kesme oluştuğunda yükselen kenarı yakalamış olursun. Bu işlemde de TMR1 sayacı kullanılır. 2 ci metod dan farkı kenar yakalama işlemi kesmelerle yapıldığından daha hassas veya komut gecikmelerinin sonucu etkilemesine imkan vermeden süre ölçmeni sağlar.
Burada belirtilen 3 metodu da zaman zaman kullanıyorum. Ençok hangisi dersen genelde 2ci metodu kullanıyorum.
Sitede örnekleri olması gerek. Yada örneğe gerek olmadan anlattıklarım üzerinden çalıştırabilirsin.

H- Köprü işinde motorun çektiği akım çok öncemli bu konuda özel h-Köprü entegresi kullanmanı önerebilirim. Piyasada 3-4 A e kadar entegreler mevcut. Değilse N-Mosfet kullanarak bir sistem oluşturup kullanabilirsin. Mesela aşağıdaki linkte TA6586 diye 8 bacaklı bir entgere varki basitçe h-köprü entegresidir ve yaklaşık peak olarak 5A e dayanabilmektedir. Genelde oyuncak arabalarda kullanılıyor ama ben kullandım 2-3 A rahatlıkla karşılayabiliyor. İncelemeni öneririm.

Ete

alisumer

teşekkürler hocam CCP hiç kullanmadım nasıl çalıştığını bile anlamış değilim diğerlerini bir denerim . 5-6 A yeterli ama malum oyuncak çarpacak duracak zorlanacak o 5 - 10 A ya çıkar bence işi sağlama bağlamak en iyisi şu internette bolca bulunan h köprüsü resimlerini birebir uygulasam çalışır heralde de . hazır aldığımız ESC lerde 4 tane kocaman kapasitör mevcut onlar  pwm sinyali yumuşatmayamı yoksa ani akım yükselmelerinde mosfete destek içinmi anlayamadım.içini açtım adamlar öyle maskelemişler ki  devre kartını yollar bile görünmüyor çözemedim.
Hep meraktan

ete

Capture örneğini aşağıda veriyorum. Umarım işine yarar. Temel prensip şu, Düşen kenar veya yükselen kenar için ayarladığın CCPx kesmesi ile ayarladığın konumu yakalıyorsun (Capture).
Diyelimki Yükselen kenar da yakalama yapacaksın. Sistem sinyalin herhangi bir yerinden giriş yapacak ve yükselen kenarı yakalayınca kesme bayrağını set edecek. O anda geçen süreyi kayda alacaksın. Heme ardından bu seferde düşen kenarı kesme kaynağı olarak ayarlayıp yeniden bayrağın set edilmesini bekleyeceksin. Bayrak set olunca geçen ikinci süreyide kayda alacaksın İkinciden birinciyi çıkartınca sana HIGH süresini çok hassas bir şekilde vermiş olacak.
Bu sistemde giriş CCPx pininden yapılmak zorunda.
Örnek kod parçası aşağıdadır.
#config
 __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT 
#endconfig
define OSC 4
TRISA=0
TRISB=%00001000    
PORTA=0
PORTB=0  
CMCON=7

SURE1  VAR WORD
SURE2  VAR WORD
SURE   VAR WORD


SYMBOL FLAG=PIR1.2
SYMBOL KESME=PIE1.2

DEFINE LCD_DREG     PORTB   'LCD Data bacakları hangi porta bağlı
DEFINE LCD_DBIT     4       'LCD data bacakları hangi bitten başlıyor
DEFINE LCD_EREG     PORTB   'LCD    ENABLE bacağı hangi porta bağlı
DEFINE LCD_EBIT     2       'LCD enable bacağı hangi bite bağlı
DEFINE LCD_RSREG    PORTB   'LCD RS Bacağı hangi bite bağlı
DEFINE LCD_RSBIT    1       'LCD RS bacağı hangi bite bağlı
DEFINE LCD_BITS     4       'LCD 4 BIT MI 8 BIT MI
DEFINE LCD_LINES    2       'LCD KAÇ sıra yazabiliyor
'******************************************************************
lcdout $fe,1
PAuse 500
 
BASLA:  
      CCP1CON=%00000101:T1CON=%00000001:kesme=1:FLAG=0
      WHILE FLAG=0:WEND
      SURE1.BYTE0=CCPR1L 'geçen süreyi CCPR1 registerlerinden alıyoruz.
      sure1.BYTE1=CCPR1H           
      CCP1CON=%00000100:FLAG=0 
      WHILE FLAG=0:WEND
      SURE2.BYTE0=CCPR1L'geçen süreyi (ilk kesme ile ikinci kesme arasındaki süre) kayda alıyoruz.
      SURE2.BYTE1=CCPR1H 
      SURE=SURE2-SURE1-1   
      LCDOUT $FE,$80,"SURE=",DEC SURE
      T1CON=0:KESME=0:FLAG=0:PIR1.0=0:T2CON=0
      PAUSE 300      
      GOTO BASLA
Bu kod örneği yanlızca bir puls süresini hassas biçimde ölçmek amacı ile verilmiştir. Benzer yöntem ile bir kare dalganın HIGH , LOW sürelerini hesaplayıp peryodunu ve ardından da frekansını hesaplayabilirsin. Burada dikkat edilmesi gereken diğer bir hususda ölçmeye çalıştığın peryodun kesinlikle 65535us değerini aşmıyor olmasıdır. Aşma ihtimali var ise TMR1 sayacından bölücüleri devreye sokman ve sonucuda ona göre hesaplaman gerekir. Bu dediklerim çok düşük frekansları yada bu frekanslardaki puls sürelerini bulmak için kullanılmalıdır.

H-köprü konusuna gelince arada bir kullandığım bir şema var . İlişikte veriyorum. İşini görebilir denemende yarar var.

Ete

MG33

Alıntı yapılan: ete - 30 Ağustos 2021, 18:38:55Data sheet diyorki enbl ucuna high ver kontrol uçlarından birine H diğerine L verirsen motor bir yöne tersini verirsen diğer yöne döner. Şema olmadığı için kime ne veriyorsun göremiyoruz.
L298 de iki motor sürücüsü var her birinin enable ve kontrol girişleri farklı pinlerde dikkat etmek gerek.
Diğer önemli bir konu da SENS uçları. Motorun çalıştığını görmek istiyor isen bu uçları direk GND ye bağlaman gerekiyor. Yada bu uçlar ile GND arasına 0,5 ohm değerinde direnç bağlaman gerekir.

Ete

hocam l298 n nin outlarını motora bagladım enable pinini lojik 1 yaptım diger ikisinide 0 ve 1 yaptım koddaki gibi gene çalışmadı acaba enable pinini lojik 1 yapmak yerine ccp ye bağlayıp pwm ayarı mı yapmak gerekli ?






MG33

son bir guncelleme yapayım simulasyonda sensA ve sensB yi grounda bağlayarak calistirdim. Fakat gerçtekte yapmak istersem sensA ve sensB pini diye bir sey yok ya da ismi mi değişik acaba ?

ete

L298 entegresinin 1 nolu pini SENSA dır. 15 Nolu pin ise SENSB dir.
Enable pinine PWM verirsen hız ayarı yapabilirsin. Enable ucuna direk HIGH verirsen motor sabit hızla ve maksimum hızda döner. Aynı uca PWM uygularsan PWM nin duty değerine bağlı olarak hız ayarı yaparsın. Sana hız ayarı gerekli değil ise PWM verme o uca.

Ete

MG33

hocam simulasyonda çalışıyor fakat gerçekte uyguladığımda sensA ve senB pini olmadığı için motor çalışmıyor. Ya da ben bulamıyorum. A enable veya b enable nin oradaki arka pinleri toprağa bağlayınca da kısa devre oluyor. Gerçek hayatta l298 n ye nasıl uygulamak gerekli ?

ete

SensA ve SensB pinleri yokmu diyorsun. ELindeki entegrenin L298 olduğundan eminmisin.?
Kaç bacaklı onu söyle bari.
Neden sens bacaklarının olmadığını neye dayanarak söylüyorsun.? Anlamakta zorlanıyorum.,
,Ete

MG33

elimdeki ürün bu l298n motor sürücü kartı:
https://robotikdevre.com/urun/l298n-motor-surucu-modulu/

enable A ve B pinleri var ama sens A ve sen B pinlerini görmedim.

Hattuşa

https://ismailkayikci.com/2021/03/02/arduino-ile-engelden-kacan-robot-yapimi/


az googleye baksaydınız bolca örnek vardı, ben googleye arduino engelden kaçan robot yazdım 3. sırada yukarıda ki link çıktı, linkte kodu ve bağlantı şeması var ve L298N  ile motorları sürmüş.
umarım işinize yarar

MG33

hocam sıkıntı şu arduino gibi bağlayınca l298n pic de calismiyor. Zamanında engelden kacan robotu, arduino ile yapmıştım ama 16f877a de benzer bir bağlantı yapınca çalışmadı. O yüzden soruyorum acaba pic ile yaparken farklı bir yol mu izlenmeli diye

Hattuşa

Alıntı yapılan: MG33 - 19 Eylül 2021, 00:07:50hocam sıkıntı şu arduino gibi bağlayınca l298n pic de calismiyor. Zamanında engelden kacan robotu, arduino ile yapmıştım ama 16f877a de benzer bir bağlantı yapınca çalışmadı. O yüzden soruyorum acaba pic ile yaparken farklı bir yol mu izlenmeli diye

çalışması lazım, zira L298 kendisini sürenin kim olduğunu bilemez, bağlantında veya bağlantı pininde veya sürme süresinde hata vardır

Powered by EzPortal