RF ile dc motor hız kontrolü

Başlatan xcyqp09k2, 03 Nisan 2014, 03:44:00

xcyqp09k2

Merhabalar,

öncelikle şunu belirteyim buraya bir şey yazmadan önce bayağı araştırma yapıyorum daha sonra sorularım varsa cevaba yönelik olarak buraya yazıyorum.

çok kabaca hazır rf modüllerle dc motorun hız kontrol işlemini yapmak istiyorum. ve ben ileri çubuğunu ittirdikçe hızlansın istiyorum. bu devre bir projemizde lazım. bazı pic lerde voltaj karşılaştırıcı yani adc pinler mevcut. aklıma şöyle birşey geldi. verici kısmında bir potansiyometre ile gerilim bölücü yapıp elde ettiğim gerilim farkını adc pinlerine vererek pic e okutmak ve bu bilgiyi rf ile karşıdaki pic e göndermek. işte acaba analog bilgi mi göndermiş oluyoruz bu durumda? eğer öyleyse kısaca analog bilgi nasıl gönderilir tarif edebilir misiniz. çünkü gerisi kolay. adc kodunu yazıp pic in uclarına o farklı voltajları vericem. bu arada c bilgim yok basic olarak uğraşıyorum.

iyi forumlar

xcyqp09k2

şimdi şöyle birşey yaptım diyelim. bu sadece gönderici kısmı. 16f877 de alıcı veri bacakları olarak c portunun 7. ve 6. bacakları kullanılıyor. kodları ona göre ayarladım. bu arada şu aşağıdaki kodları hem ete hocamızdan hem de diğer sitelerden aldığım hazır kodları harmanlayarak yazdım. yani sadece mantığı bana ait. rica etsem bilen abilerimden bu mantık doğru mudur bir bakabilirler mi? kodlarda bir yanlışlık var mıdır ?

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2014 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 4/7/2014                                          *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
TRISA=%00000001
TRISB=0
TRISC=0
TRISD=0
'-------------------------------------------------------------------------------
@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_on
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC
'-------------------------------------------------------------------------------

Include "modedefs.bas"  'SERİN VE SEROUT KOMUTLARININ ÇALIŞMASI İÇİN GEREKLİ KÜTÜPHANE DOSYASI


Declare Adin_Res = 10       ' 10-bit result required
Declare Adin_Tad = FRC      ' RC oscillator chosen
Declare Adin_Stime = 50     ' Allow 50us sample time
Dim voltbilgisi As Word
TRISA = %00000001           ' Configure AN0 (PortA.0) as an input
ADCON1 = %10000000          ' Set analogue input on PortA.0
voltbilgisi var Word		'SERİ İLETİŞİMDE ALINIP VERİLECEK  VERİ
PORTB=0                     'PORTB İÇERİĞİ SIFIR NEDENİ İSE İLK ENERJİ VERİLDİĞİNDE GİRİŞ VEYA ÇIKIŞLAR AKTİF OLMAMASI İÇİN



BASLA:

voltbilgisi = ADIn 0    ' Place the conversion into voltbilgisi
SerOut PORTC.6,T300,["sifre",voltbilgisi]      'PORTC.6 dan önce sifre'yi sonra voltbilgisi'ni gönder

GoTo BASLA

mustafa_cmbz

pottan voltajı pic le okuyup adc ile değerlendirip digital veriye dönüştürürsün.

sonrasında ise bu digital veriyi serial olarak rf modülden gönderip aynı şekilde alıcıdan serial olarak alıp değerlendirip gelen bu digital veriye göre pwm i konfigre etmeniz gerekir..

OG

#3
Dosya == > https://www.picproje.org/index.php?action=dlattach;topic=52452.0;attach=639

TX

Device 12F683
Config CPD_OFF, CP_ON, BOD_OFF, MCLRE_OFF, PWRTE_ON, WDT_ON, INTRC_OSC_NOCLKOUT, FCMEN_OFF

Declare Xtal 8
All_Digital= TRUE
CMCON0=7
OSCCON = %01110101         ' 8mHz

Declare Adin_Res 8       
Declare Adin_Tad FRC      
Declare Adin_Stime 50     
All_Digital= TRUE

TRISIO = %00111110   
INTCON=0
OPTION_REG=%10001111
CMCON0=7
ANSEL=%00001000
             

Dim potdeger As Byte
Dim d_tx As Byte
Dim crc_byte As Byte

Dim DOO As GPIO.0   

EData 0,"REMOTE DIMMER POTLU, TX UNIT"

DOO = 1     ''' Data çıkış bacağı
DelayMS 200
Clrwdt


'-------
Basla:

    crc_byte = 0            ''' doğrulama degeri sıfırlandı

''' Baslik A B C , RX unitesi once bunları yakalaması lazım    
    d_tx = "A"
    crc_byte = crc_byte ^ d_tx
    GoSub data_ver
    
    d_tx = "B"
    crc_byte = crc_byte ^ d_tx
    GoSub data_ver
    
    d_tx = "C"
    crc_byte = crc_byte ^ d_tx
    GoSub data_ver
    
    '' Potu oku 2 defa gonder
    potdeger = ADIn 3
    
    d_tx = potdeger
    crc_byte = crc_byte ^ d_tx
    GoSub data_ver
    
    crc_byte = crc_byte ^ d_tx
    GoSub data_ver
    
    d_tx = crc_byte             ''' doğrulama datasını gonder
    GoSub data_ver
GoTo Basla
 
data_ver:
    SerOut DOO ,1646,[d_tx]     ' 600 baud Hızı fazla yukseltirseniz RF uniteler sıkıntı çıkarabilir
    Clrwdt
Return
   



RX

Device 12F683
Config CPD_OFF, CP_ON, BOD_OFF, MCLRE_OFF, PWRTE_ON, WDT_ON, INTRC_OSC_NOCLKOUT, FCMEN_OFF

Declare Xtal 8
All_Digital= TRUE
CMCON0=7
OSCCON = %01110101         ' 8mHz

Declare Adin_Res 8       
Declare Adin_Tad FRC      
Declare Adin_Stime 50     
All_Digital= TRUE

Declare CCP1_Pin = GPIO.2

PR2 = 254        
T2CON = %00000101        ' TMR2 Prescaler 1/4  2KHz
CCP1CON = %00001100      ' PWM çalışma, aktif high
CCPR1L = 0

OPTION_REG=%00001111 

WPU = %00100000

INTCON=%00000000    
ANSEL=%00000000             
TRISIO=%00111011   

GPIO=0

Dim cikis_deger As Byte
Dim cikis_deger_hafiza As Byte
Dim d_rx As Byte
Dim crc_byte As Byte
Dim potdeger As Byte
Dim bekle As Word
Dim hata As Bit

Dim frk As 1984
Dim DI As GPIO.0

EData 0,"REMOTE DIMMER POTLU, RX UNIT"

cikis_deger = 0           '''  
cikis_deger_hafiza = 0
GoSub cikis_ver

''''''''''''
BASLA:

    crc_byte = 0
    
    bekle = 500                 ''' ilk bekleme süresi 500 ms
    GoSub data_al
    If hata = 1 Then BASLA      ''' data gelmedi baştan bak
    If d_rx <> "A" Then BASLA   ''' dogru data gelmedi baştan bak
    crc_byte = crc_byte ^ d_rx  ''' doğrulamaya ekle
    
    bekle = 20                 ''' Data gelmeye başlamış bekleme süresini düşür
    
    GoSub data_al
    If hata = 1 Then BASLA      ''' data gelmedi baştan bak
    If d_rx <> "B" Then BASLA   ''' dogru data gelmedi baştan bak
    crc_byte = crc_byte ^ d_rx  ''' doğrulamaya ekle  
    
    GoSub data_al
    If hata = 1 Then BASLA      ''' data gelmedi baştan bak
    If d_rx <> "C" Then BASLA   ''' dogru data gelmedi baştan bak
    crc_byte = crc_byte ^ d_rx  ''' doğrulamaya ekle


    ''' şimdi potdeger    
    GoSub data_al
    If hata = 1 Then BASLA      ''' data gelmedi baştan bak
    crc_byte = crc_byte ^ d_rx  ''' doğrulamaya ekle    
    potdeger = d_rx      
    
    ''' şimdi potdeger bir daha   
    GoSub data_al
    If hata = 1 Then BASLA              ''' data gelmedi baştan bak
    If potdeger <> d_rx Then BASLA
    crc_byte = crc_byte ^ d_rx          ''' doğrulamaya ekle    
         

    ''' şimdi doğrulama    
    GoSub data_al
    If hata = 1 Then BASLA              ''' data gelmedi baştan bak
    If d_rx <> crc_byte Then BASLA      ''' dogru data gelmedi baştan bak
  
    cikis_deger = potdeger
    GoSub cikis_ver      

GoTo BASLA

'''''''''
data_al:
    Clrwdt    
    hata = 0
    SerIn DI, 1646, bekle, gelmedi, [d_rx]
    Clrwdt
Return    


gelmedi:
    hata = 1
    Clrwdt
Return


'''''''
cikis_ver:
    If cikis_deger <> cikis_deger_hafiza Then
        CCPR1L = cikis_deger
        cikis_deger_hafiza = cikis_deger
    EndIf
Clrwdt 
Return


FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

xcyqp09k2

#4
Teşekkür ederim OG. sen yazdıysan ellerine sağlık. elimde 12F683  olsa bu programla sorunsuz şekilde yükleyip çalıştırırdım ama malesef 16f877 var. ilginiz için tekrar teşekkür.

yapacağım projenin C ile yazılmış halini buldum.  :) buradan direk kopyalıyacağım ama maksat basic de öğrenmek .

http://esersenturk.blogspot.com.tr/2013/09/rf-alici-verici-ile-uzaktan-kumandali.html

xcyqp09k2

#5
şimdi şöyle birşey yaptım. adc den 1024 lük  değer okudum. rf ile ilettim aldığım 1024 lük adc yi 4 e böldüm ki pwm de çalışsın. çünkü pwm %100 olması için 255 vermek gerekiyor. dosyaları resimleri kodları herşeyi yükledim aşağıdadır. sorunum şu, ısıs da simüle ederken 1 2 saniye boyunca pwm çalışıyor. ışık yanıp sönüyor ve öyle kalıyor. sonra dip switch i açıp kapıyorum ama değişiklik yok. iletim hattına bakıyorum, iletim var.iletim pininde ışık yanıp sönüyor. ama alıcı almıyor galiba. ya da değişik bişeyler gönderiyorum. kodlarıma da baktım. kendimce sorun yok. sizin kod biliginiz benden hayli fazla :) bir bakıp söyleyebilir misiniz nerede hata var ?


VERİCİ KODU:

'****************************************************************
'*  Name    : HPWM-2.BAS                                        *
'*  Author  : [ETE-EROLEC-ERO]                                  *
'*  Notice  : Copyright (c) 2007 [E.T.E]                        *
'*          : All Rights Reserved                               *
'*  Date    : 16.04.2007                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device = 16F877
Xtal 4
'OPTION_REG =%00111111
PORTA=0:TRISA=%00000001
PORTB=0:TRISB=%00000001
PORTC=0:TRISC=%00000000
PORTD=0:TRISD=%00000000
ADCON1= %0000001 '
T2CON = %00000101
PR2=249
'-----------------------------------------------------------------
Include "modedefs.bas"  'SERİN VE SEROUT KOMUTLARININ ÇALIŞMASI İÇİN GEREKLİ KÜTÜPHANE DOSYASI
'**************** ADC chanel setting  ************************   
DEFINE ADC_BITS 10    ' ADCIN çözünürlük  (Bits)
DEFINE ADC_CLOCK 1    ' ADC clock kaynağı  (Fosc/8)
DEFINE ADC_SAMPLEUS 3 ' ADC örnekleme zamanı (uSec)
'****************HPWM PRESETİNG*********************
DEFINE CCP1_REG   PORTC    'Hpwm 1 pin port
DEFINE CCP1_BIT     2      	'Hpwm 1 pin bit
DEFINE CCP2_REG   PORTC    'Hpwm 2 pin port
DEFINE CCP2_BIT     1      'Hpwm 2 pin bit 
'******************* DEĞİŞKENLER  ********************
HAM var Word
X   VAR Word
DUTY VAR Byte   
'---------------------------------------------------------------------------

CCP1CON.2=1
CCP1CON.3=1


	
	DUTY=0
DelayUS 10


BASLA:
	If PORTB.0=1 Then
	DUTY = ADIn 0
     
     Else DUTY=0
     EndIf
	 GoTo GONDER
	 
 GONDER:
SerOut PORTC.6,T300,["sifre",DUTY]      'PORTC.6 dan önce sifre'yi sonra voltbilgisi'ni gönder
DelayUS 10

 GoTo BASLA




ALICI KODU:

'****************************************************************
'*  Name    : HPWM-2.BAS                                        *
'*  Author  : [ETE-EROLEC-ERO]                                  *
'*  Notice  : Copyright (c) 2007 [E.T.E]                        *
'*          : All Rights Reserved                               *
'*  Date    : 16.04.2007                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device = 16F877
Xtal 4
'OPTION_REG =%00111111
PORTA=0:TRISA=%00000001
PORTB=0:TRISB=%00000001
PORTC=0:TRISC=%00000000
PORTD=0:TRISD=%00000000
ADCON1= %10001110 '
T2CON = %00000101
PR2=249
'-----------------------------------------------------------------
'**************** RF setting  ************************ 
Include "modedefs.bas"  'SERİN VE SEROUT KOMUTLARININ ÇALIŞMASI İÇİN GEREKLİ KÜTÜPHANE DOSYASI
'**************** ADC chanel setting  ************************   
DEFINE ADC_BITS 10    ' ADCIN çözünürlük  (Bits)
DEFINE ADC_CLOCK 1    ' ADC clock kaynağı  (Fosc/8)
DEFINE ADC_SAMPLEUS 3 ' ADC örnekleme zamanı (uSec)
'****************HPWM PRESETİNG*********************
DEFINE CCP1_REG   PORTC    'Hpwm 1 pin port
DEFINE CCP1_BIT     2      	'Hpwm 1 pin bit
DEFINE CCP2_REG   PORTC    'Hpwm 2 pin port
DEFINE CCP2_BIT     1      'Hpwm 2 pin bit 
'******************* DEĞİŞKENLER  ********************
HAM var Word
X   VAR Word
DUTY VAR Byte   
'---------------------------------------------------------------------------

CCP1CON.2=1
CCP1CON.3=1
BASLA:


SerIn PORTC.7,T300,[Wait ("sifre") ,DUTY]      'PORTC.6 dan önce sifre'yi sonra voltbilgisi'ni gönder 
DelayMS 10


HPWM 1,DUTY/4,1000 ' Send a 50% duty cycle Pwm signal at 1KHz

GoTo BASLA


ISIS RESMİ:
http://i.imgur.com/hLln7VO.png

Proton, ısıs ve hex dosyaları aşağıdaki linkte.
http://yadi.sk/d/YOkMgSiFM7Fmg

xcyqp09k2

bir arkadaşla iletişme geçtim, o projesinde adc bilgisini rf ile gönderip karşıdaki pic de hem step motoru hem de dc motoru kontrol etmiş. rica ettim hex dosyalarını bulup gönderdi. ben kullandım bu kodları. yukarıda yapmaya çalıştığım şeye benziyor. paylaşıyim işine yarayan çıkar dedim.

http://yadi.sk/d/RNzsuqZhMDVvy

bu da arkadaşın blogu;

http://esersenturk.blogspot.com.tr/2013/09/rf-alici-verici-ile-uzaktan-kumandali.html

Maxim

yukarıda @OG nin verdiği kodlar neden işe yaramadı?
işlemci aynı olmak zorunda değilki, çevirin 16F877 ye?
çok zor olmaması lazım, config falan düzenlenecek çıkışlar değişecek o kadar

xcyqp09k2

çok fazla bilgim yok compiler ve kodlar hakkında  :-[  og nin kodlarında pır gio gibi tanımadığım kodlar var. iki pic in çıkışları vs değişiktir diye kabullendim. hiç aklıma bile gelmedi o yüzden hocam. ama OG nin kodları inceleyen için güzel kaynak. ben de bakar öğrenirim kalan kodları. zaten ufak tefek şeylermiş.