10 BİT HPWM 16f877

Başlatan mihri, 04 Şubat 2006, 14:57:17

mihri

Arkadaşlar 16f877 ile adc den aldığım değerle HPWM komutunu çalıştırmak istiyorum ama HPWM nin çözünürlüğü 8 bit bunu nasıl 10 bit çözünürlüğe ulaştırabiliriz ? 16f877 nin datasheetine baktım bitakım formüller verilmiş çözünürlük 10 bit bulunmuş bunun mantığınıda anlatırsanız çok sevinirim.
"Eppur si muove!"

mihri

Hadi ustalar hiç kimse HPWM komutunu kullanmadımı yani ?
"Eppur si muove!"

Erol YILMAZ

16F877 Datasheet ine bakarak,
10 bit çözünürlük ve kullandığın osilator frekansını baz alarak,
kullanabileceğin max frekansı ve istediğin başka rakamlara ulaşabilirsin.
D.S.'de bütün formüller verilmiş.

HPWM kullanırken ben oyle yapıyorum ve ezbere aklımda değil.

Sırasıyla şu formullerden gitmen gerekiyor.
Değişkenlerin manasını D.S. den bulabilirsin.


Birinci formulden Fpwm i cekeceksin.


Bu formulden PR2 çıkacak.


10 bit zaten 1023 te çıkış komple 1 olacak.

Burada biraz ASM ile sonuca gidilecek gibi oldu ama işin mantığını bilmekte fayda var.

Çalışmalarında başarılar...

mihri

Hocam sağol da

HPWM 1,127,1000 'komutu %50 duty cycle ve 1khz PWM üretiyo burda komutun kullanımı şöyle;

HPWM [pin bit],[görev süresi],[frekans]  burda görev süresi 0-254 değrlerinden başkasını almıyo yani 1000 yada 800 gibi 10 bit değerlerini yazamıyorum 16f877 nin datasheetinde verilen formüllerle bi yere varılmıyo. Hesapta 10 bit çıkıyo ama komutta 10 bit çözünürlüğü kullanamıyoruz.  10 bit çözünürlüğü  nasıl kullanıcaz burda?
"Eppur si muove!"

Veli B.

PBP komutu ile datasheeti birbirine karıştırıyorsunuz.DS de 10 bit çözünürlük nasıl elde edilir detaylı bir şekilde var.Sevgili Erol da zaman ayırıp bu konuda detaylı bilgi vermiş zaten.PBP sadece CCPR1L registerını baz alarak işlem yapıyor(sanıyorum) olsa gerek ki sadece 8 bit çalışıyor.Halbuki 2 bit daha var CCP1CON da bulunan(<5:4>).Bu bitleri de işleme sokarsanız 10 bit elde edebilirsiniz.

mihri

TRISA=%00000001
TRISB=0
TRISC.2=0
TRISD=0
'-------------------------------------------------------------------------------
@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_on
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC
'-------------------------------------------------------------------------------
DEFINE LCD_DREG      PORTB   
DEFINE LCD_DBIT      4      
DEFINE LCD_EREG      PORTB   
DEFINE LCD_EBIT      3      
define LCD RWREG    PORTB  
define LCD_RWBIT    2      
DEFINE LCD_RSREG   PORTB   
DEFINE LCD_RSBIT   1      
DEFINE LCD_BITS      4      
DEFINE LCD_LINES   4      
'-------------------------------------------------------------------------------
DEFINE   ADC_BITS   10       
DEFINE   ADC_CLOCK   3       
DEFINE   ADC_SAMPLEUS   100   
'-------------------------------------------------------------------------------
DEFINE CCP1_REG PORTC
DEFINE CCP1_BIT 2
'-------------------------------------------------------------------------------
ADCON1=%10001110
'-------------------------------------------------------------------------------
HAM    var  word                                                                        
temp  var  byte
toplam var word
I var byte
'-------------------------------------------------------------------------------
pause 200
Low PORTB.2      
LCDOut $FE,1         
'-------------------------------------------------------------------------------
BASLA:

TOPLAM=0
     For I=1 To 10
            ADCIN 0,HAM
            TOPLAM=TOPLAM+HAM
   NEXT I
   HAM=TOPLAM/10    
BAK:  
     pause 200
     LCDOUT $FE,$80,"www.sau.edu.tr"
     LCDOUT $FE,$C0,"HAM=",#HAM,"   "
     LCDOUT $FE,$90,"GEN=",#temp,"  "
     LCDOUT $FE,$D0,"10 BIT HPWM TEST"
'-------------------------------------------------------------------------------
     Temp=ham >> 2      
     CCP1CON.5=ham.1
     CCP1CON.4=ham.0
     HPWM 1,temp,1000
     goto BASLA
     end
'-------------------------------------------------------------------------------

Sanırım bu şekilde 10 bit çözünürlük elde ettim.
Ham değerimiz ADC den okunan 10 bitlik bir değer. Bu değeri iki bit kaydırarak elde edilen 8 bitlik değeri temp değişkenine atıyoruz dışarıda kalan iki bitlik düşük değerli bitleri  CCP1CON.5 ve CCP1CON.4 regiter larına kaydediyoruz mantık bu ilgilenenlere sunulur. :lol:
"Eppur si muove!"

Veli B.

PR2 = 255   ' Set PWM Period 
CCPR1L = 0  
T2CON = %00000110 ' Timer2 = ON + 1:1 prescale 
CCP1CON = %00001100  ' Select PWM Mode
X VAR CCP1CON.5
Y VAR CCP1CON.4
.
.
.
DEGER VAR WORD
TEMPDEGER VAR WORD
USTDEGER VAR WORD
.
.
.
.
.
.
MAIN:
'LCDOUT 254,128,DEC4 USTDEGER
IF UP=1 THEN deger=DEGER+4
IF DOWN=1 THEN DEGER=DEGER-4
IF DEGER>1023 THEN DEGER=1
IF DEGER<1 THEN DEGER=1022
TEMPDEGER=DEGER
IF USTDEGER <>DEGER THEN 
USTDEGER= DEGER 
Y=DEGER.BIT0
X=DEGER.BIT1
TEMPDEGER=(TEMPDEGER>>2)
CCPR1L=TEMPDEGER.BYTE0
ENDIF
PAUSE 10
GOTO MAIN