avatar_Mucit23

Pwm Modülünde Sabit Duty ve değişken frekans

Başlatan Mucit23, 16 Eylül 2012, 21:52:21

oguztkn

Alıntı yapılan: ete - 18 Nisan 2020, 16:55:16Programın eksiklerini tamamlayınca biraz olsun doğru çalışmaya başladı.
Bir iki ilave ile en azından simulasyonda ard arda sürekli olarak 1600 sayac değerinde ekrana yakaladığı sayac değerini doğru olarak verdirebiliyorum.
Programın dur kısmına ve kesme kısmına bir iki eklemem oldu. Buraya bakarak kendi programını yeniden düzenle ve çalıştır bakalım sonuç ne olacak.

Ete
#CONFIG
    __CONFIG _CONFIG1H, _FOSC_INTIO67_1H & _PLLCFG_OFF_1H & _PRICLKEN_ON_1H & _FCMEN_OFF_1H & _IESO_OFF_1H        
    __CONFIG _CONFIG2L, _PWRTEN_ON_2L & _BOREN_OFF_2L & _BORV_285_2L 
    __CONFIG _CONFIG2H, _WDTEN_OFF_2H & _WDTPS_32_2H                                                                                    
    __CONFIG _CONFIG3H, _CCP2MX_PORTB3_3H & _PBADEN_OFF_3H & _CCP3MX_PORTE0_3H & _HFOFST_OFF_3H & _T3CMX_PORTC0_3H & _P2BMX_PORTC0_3H & _MCLRE_INTMCLR_3H
    __CONFIG _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L
    __CONFIG _CONFIG5L, _CP0_ON_5L & _CP1_ON_5L & _CP2_ON_5L & _CP3_ON_5L    
    __CONFIG _CONFIG5H, _CPB_ON_5H & _CPD_ON_5H
    __CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
    __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H 
    __CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L 
    __CONFIG _CONFIG7H, _EBTRB_OFF_7H 
#ENDCONFIG
;===============================================================================
DEFINE OSC 4
OSCCON  = %01010100        
OSCTUNE = %00000000 
;===============================================================================
DEFINE LCD_DREG      PORTD
DEFINE LCD_DBIT          4
DEFINE LCD_EREG      PORTD
DEFINE LCD_EBIT          0
DEFINE LCD_RWREG    PORTD
DEFINE LCD_RWBIT        1
DEFINE LCD_RSREG    PORTD
DEFINE LCD_RSBIT        2
DEFINE LCD_BITS          4
DEFINE LCD_LINES        4
DEFINE I2C_SLOW          1


DEFINE CCP5_REG PORTE
DEFINE CCP5_BIT 2 

TRISA=0:TRISB=%00000001:TRISC=0:TRISD=0:TRISE=0
PORTA=0:PORTB=0:PORTC=0:PORTD=0:PORTE=0

ADCON0.0=0:ANSELA=0:ANSELB=0:ANSELC=0:ANSELD=0:ANSELE=0 
;===============================================================================
RCON.7=0:PMD0=1:PMD2=1:CM1CON0.7=0:IOCB=%00000000:WPUB=%00011111
SLRCON=0:CTMUCONH.7=0:SRCON0.7=0:VREFCON0.7=0        
;===============================================================================
INTCON=%10010000:INTCON2=%01000000:INTCON3=%00000000
PIR1=0:PIR2=0:PIR3=0:PIR4=0:PIR5=0                  
PIE1=0:PIE3=0:PIE4=0:PIE5=0                          
IPR1=0:IPR3=0:IPR4=0:IPR5=0                            
;===============================================================================
temp var byte
SAYAC VAR WORD 60
bayrak var bit
PWMDEGER var word
x var word
FREQ VAR WORD
T VAR WORD
DUTY VAR WORD
HOP VAR BIT
lcdout $fe,1
pause 250

CCPTMRS1.3=0:CCPTMRS1.2=0
T2CON=%01111010  '%xxxxx100=1/1  , %xxxxx101=1/4 , %xxxxxx110=1/16 
PR2=249
sayac=0
PORTC.7=0
T2CON.2=1
ON INTERRUPT GOTO KESME

Basla:
  
  CCP5CON.2=1
  CCP5CON.3=1

FOR FREQ=500 to 15200  
T=1000**1000
T=DIV32 FREQ
PR2=(T/16)-1
DUTY=(PR2+1)*2  
X=DUTY
CCP5CON.4=X.0
CCP5CON.5=X.1
CCPR5L=x>>2
'  if sayac=1600 then goto dur  
IF HOP=1 THEN DUR
  PORTA.1=0 
Next

goto basla


dur:
    INTCON.4=0
    LCDOUT $FE,1  
  lcdout $FE,$80,dec5 freq," ",dec4 PR2," ",dec5 sayac
  CCP5CON.2=0
  CCP5CON.3=0
  PORTC.6=1
  PORTA.1=1
'  i2cread PORTC.2,PORTC.1,$73,[temp]

'  if temp.6=0 and bayrak=0 then 
'  sayac=0
'  PORTC.6=0
'  bayrak=1


'  goto basla
'  ENDIF
    HOP=0
  SAYAC=0  
  INTCON.4=1 
  if temp.6=1 and bayrak=1 then bayrak=0

goto BASLA

DISABLE
Kesme:

    SAYAC=SAYAC+1
    IF SAYAC=1600 THEN 
      INTCON.4=0
      HOP=1
    ENDIF  
    INTCON.1=0  
 
;===============================================================================
resume
enable
end



Bu hali ile tekrar denedim hocam dediğiniz gibi puls yakalama konusunda düzgün çalışıyor yalnız motor çok fazla tekliyor frekansı çok aşağıdan başlatmama rağmen çok fazla adım kaçırıyor motor takılarak çalışıyor. Rampa bölümünde revize gerekiyor sanırım. Bu bölümü for kullanmak yerine timer kurup oradan arttırmak ne kadar mantıklı olur acaba ? (Bu arada #CONFIG #ENDCONGIF olarak derlemiyor ASM ENDASM olarak derliyor o yüzden bu ikiliyi kullanmış idim ilk mesajımda da)

ete

Öncelikle pulslerin düzgün gelip gelmediklerine bir skop ile bakmak gerekir.
Düşük frekansları 4Mhz OSC frekansı ile yakalamakta sorun yaşamazsın. Ama 10Khz üzerine çıkınca bu sinyalleri yakalamak için daha hızlı bir işlemcı kullanmak zorunda kalırsın.
Sorun yakalama şeklinde değil iki puls arasında işlenen komut sayısında ve bu komutların yarattıkları komut gecikmelerinde olsa gerek.
Bana kalırsa bu iş için 16F1827 gibi bir işlemci kullanman ve işlemciyi PLL si ile birlikte dahili 32Mhz frekansta çalıştırıp deneme yapman gerekir.

Ete

oguztkn

Alıntı yapılan: ete - 19 Nisan 2020, 15:06:29Öncelikle pulslerin düzgün gelip gelmediklerine bir skop ile bakmak gerekir.
Düşük frekansları 4Mhz OSC frekansı ile yakalamakta sorun yaşamazsın. Ama 10Khz üzerine çıkınca bu sinyalleri yakalamak için daha hızlı bir işlemcı kullanmak zorunda kalırsın.
Sorun yakalama şeklinde değil iki puls arasında işlenen komut sayısında ve bu komutların yarattıkları komut gecikmelerinde olsa gerek.
Bana kalırsa bu iş için 16F1827 gibi bir işlemci kullanman ve işlemciyi PLL si ile birlikte dahili 32Mhz frekansta çalıştırıp deneme yapman gerekir.

Ete


Scope'um ne yazık ki yok onu kontrol edemiyorum. 16f1827 yi önermenizin özel bir sebebi var mı ? Çünkü 45k22 nin de dahili osc si ile 64 e kadar çekebiliyorum.

ete

İŞlemci, önermekte özel bir sebebim yok sadece ne kullandığını bilmediğim için örnek vereyim demiştim.

Ete

Powered by EzPortal