HPWM için.

Başlatan canbulut, 04 Haziran 2015, 15:54:53

canbulut

merhaba arkadaslar.
PIC16F1825 de RA2 ucundaki PWMi nasıl aktif ederim. HPWM olarak kullanmak istiyorum. PIC16F1825e uygunlaştıramadım.

canbulut

şöyle bir kod buldum ve yükledim ama çalışmadı. :(
'
#header
  errorlevel -303  ; suppress Program word too large
#ENDHEADER
;
#config
__CONFIG _CONFIG1, _FOSC_HS & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_ON & _CPD_OFF & _BOREN_ON & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
__CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_19 & _LVP_OFF 
#ENDCONFIG
DEFINE OSC 8
ANSELA=0
ANSELC=0
' Output is a 1Khz signal with duty cycle sweeping
' from 20% to 80% once per second.

' PR2 = Timer2 period register, controls PWM period.
' CCPR3L and CCP3CON<5:4>bits control the duty cycle,
' and should be treated as a 10-bit word.

' Fosc = Clock Frequency (4MHz)
' PS = Timer2 Prescale Value (T2CON<1:0>)
' Freq = PWM output frequency
' Duty% = Duty cycle (20% = 0.2)

' formulas:
' PR2=(Fosc/(4*PS*Freq))-1
' CCPR3L:CCP3CON<5:4>=(PR2+1)*4*Duty%

duty VAR WORD  ' Duty cycle value (CCPR3L:CCP3CON<5:4>)

   TRISA.2 = 0            ' Set PORTB.5 (CCP3) to output
   CCP3CON = %00001100    ' Set CCP3 to PWM
   T2CON = %00010101      ' Turn on Timer2, Prescale=4

' Use formula to determine PR2 value for a 1KHz signal,
' 4MHz clock, and prescale=4. (4E6/(4*4*1E3))-1=249

   PR2 = 249              ' Set PR2 to get 1KHz out
       
' Use formula to determine CCPR3L:CCP3CON<5:4> value for
' ends of range 20% to 80%.  (249+1)*4*0.2=200 (20% value)
' (249+1)*4*0.8=800 (80% value)

   duty = 200             ' Set duty cycle to 20%
;   CCP3CON.3=1
;   CCP3CON.2=1
mainloop:       
   CCP3CON.4 = duty.0     ' Store duty to registers as
   CCP3CON.5 = duty.1     ' a 10-bit word
   CCPR3L = DUTY >> 2
   duty = duty + 10       ' Increase duty cycle

' Since the total sweep of duty is 600 (800-200) and
' we are adding 10 for each loop, that results in 60
' steps min to max. 1 second divided by 60 = 16.67mS           

   Pause 17                        ' Pause 1/60 of second
   IF (duty < 800) Then mainloop   ' Do it again unless 80% duty cycle
   duty = 200                      ' Reset to 20% duty cycle
   GoTo mainloop                   ' Do it forever

   End
               

ete

#2
Bence kod aramak yerine Data Sheet incelemek en güzeli. Bakalım ne diyor Data Sheet bu konuda,
Sayfa 207 de;  24.3.2       SETUP FOR PWM OPERATION şeklinde bir başlık atılmış
Ardından standart bir PWM ayarlaması için aşağıdakileri yerine getirin demişler.

1.    Disable the CCPx pin output driver by setting the associated TRIS bit.
Yani İlgili TRIS registerinde CCPx pini Tris registerinden önce Giriş olarak ayarlanıp o pne ait çıkış sürücüleri iptal edilmelidir diyor.

2.    Load the PRx register with the PWM period value.
Yani PRx registerine PWM period değerini ver. Bu değer PWM frekansını belirleyecektir.

3.    Configure the CCP module for the PWM mode  by loading the CCPxCON register with the  appropriate values.
CCPxCON registerine gerekli değeri vererek CCP modülü PWM işlemi için ayarla.

4.    Load the CCPRxL register and the DCxBx bits of the CCPxCON register, with the PWM duty cycle value.
CCPxCON registerinin CCPRxL ve DCxBx bitlerine gerekli değerleri vererek Duty değerini ayarla.

5.    Configure and start Timer2/4/6: •Select the Timer2/4/6 resource to be used  for PWM generation by setting the
CxTSEL<1:0> bits in the CCPTMRS  register.
Bu işlemcide PWM üretilmesi için TMR2 -TMR4 ve TMR6 kullanılabilmektedir. Hangisini kullanacağınızı CCPTMRS registerinde CxTSEL <1:0> bitlerine değer vererek TMR seçimini yap.

•Clear the TMRxIF interrupt flag bit of the  PIRx register. See Note below.
PIRx registerinde yer alan TMRxIF Interrupt Flag bitini sıfırlayın.

•Configure the TxCKPS bits of the TxCON  register with the Timer prescale value.
TxCON registeri TxCKPS bitlerine Timer bölme oranını verin.

•Enable the Timer by setting the TMRxON bit of the TxCON register.
TxCON registerinde yer alan TMRxON bitini set ederek Timer'i enable edin.

6.    Enable PWM output pin:
PWM output pinini enable edin.

•Wait until the Timer overflows and the TMRxIF bit of the PIRx register is set. See Note below.
Timer taşma yapıncaya kadar ve PIRx registeri, TMRxIF biti set oluncaya kadar bekleyin. (Bu neden gerekli anlamadım)

•Enable the CCPx pin output driver by clearing  the associated TRIS Bit
CCPx pini TRIS registerinde ilgili bit sıfırlanarak enable edilir.

Şimdi bu kadar yapılacak işlemlerin diğer işlemcilerde yapılan işlemlerden farkı nedir derseniz birden fazla Timer'ın kullanılabilmesi nedeni ile bir Timer Seçim prosedürü olması diyebilirim. Bu seçimin getirdiği bir iki ilave işlem var gerisi aynı bence.

Ete

canbulut

1.       TRISA.2 = 0            ' Set PORTB.5 (CCP3) to output

2.    PR2=249

3.       CCP3CON = %00001100    ' Set CCP3 to PWM

4.     duty VAR WORD
        CCP3CON.4 = duty.0     ' Store duty to registers as
        CCP3CON.5 = duty.1     ' a 10-bit word
        CCPR3L = DUTY >> 2

5.    CCPTMRS.4=0
CCPTMRS.5=0

•Clear the TMRxIF interrupt flag bit of the  PIRx register. See Note below.
PIRx registerinde yer alan TMRxIF Interrupt Flag bitini sıfırlayın.

•Configure the TxCKPS bits of the TxCON  register with the Timer prescale value.
TxCON registeri TxCKPS bitlerine Timer bölme oranını verin.

•Enable the Timer by setting the TMRxON bit of the TxCON register.
TxCON registerinde yer alan TMRxON bitini set ederek Timer'i enable edin.

6.    Enable PWM output pin:
PWM output pinini enable edin.

Hocam 5. maddeye kadar geldiğimi düşünüyorum ama yinede bir başarısızlık var :(

Maxim

#4
portA.2 pini yani CCP3
picbasic datasheetinde yazdığı gibi yapılamıyormu bu?

DEFINE HPWM3_TIMER 1 'Hpwm 3 timer select

HPWM 3,127,1000 ' Send a 50% duty cycle PWM signal at 1kHz


pardon proton bölümündeymişiz.

Declare CCP3_Pin PortA.2

Hpwm 3,127,1000


canbulut

#5
yanlışlıkla protona yazmışım :( özür dilerim. bende onu diyorum basic bile kasmaya başladı artık.

canbulut

hocam bunun daha kolay yolu yokmu basic'te.her şeyi yapmama rağmen çalışmadı.

ete

Kolay yolu kolay işlemci seçmekten geçiyor. Bu çok komplike bir işlemci ben daha elime bile almadım bunu ne diyeyim elimden daha fazlası gelmiyor maalesef.
Bir de alternatif pin registerine bakın. Belki aynı çıkış başka bir pin ile ortaklaşa kullanılıyordur.

Ete

canbulut

haklsınız.allah razı olsun teşekkür ederim emeğiniz ilginiz için.

ete

#9
Programın tamaamını göremeyince diğer registerlerin durumları konusunda fikir yürütemiyorum.
Bu denetleyicinin data sheet'ine bakınca PORTA.2 pininde şu özellikler yüklü bulunuyor;
1. AN2 yani analog pin aynı zamanda.  O halde ANSELA registerinden bu pin digital yapılmalı
2. CPS2 pini yani kapasitif algılama pini. Bu da ilgili register olan CPSCON1=0 verilerek iptal edilmeli
3. C1OUT yani komparatör çıkış pini. O halde komparatör özelliğide kapatılmalıdır. CM1CON0=0
4. SRQ pini yani SR latch pini olup bu özelliğinde SRCON0=0 verilerek iptal edilmesi gerekir.

BU işlemlerden sonra;
Önce TRIS registerinin ilgili bitini SET edin diyor data sheet. Sonra en sonda tekrar biti sıfırlayın diyor O nedenle
TRISA.2=1
PR2=249
CCP3CON=%00001100
CCPTMRS=0
PIR1.1=0
T2CON=%00000101
While PIR1.1=0:WEND
PIR1.1=0
Duty=500
CCP3CON.4=Duty.0
CCP3CON.5=Duty.1
CCPR3L=DUTY>>2
TRISA.2=0
Bu işlemlerden sonra ilgili pinde %50 PWM sinyali görülmelidir. Görülmüyorsa hala unuttuğumuz bir şey var demektir.

Ete

canbulut

#10
hocam devremde bir problem varmış osilaskop ile ölçüktük. doğruladık. 

ete

Son yazdığım mesaj ile karşılaştırınca bir çok eksik olduğu açıkça görülüyor. Ama sen ısrarla başkalarının verdiği kodları adapte etmeye çalışıyorsun ve sonuçda alamıyorsun. Üstelik kullandığın derleycide farklı. Ne diyeyim özüne döndüğünde doğru yolu bulursun belki.
Genelde enhanched PWM modülü olan işlemcilerde CCP3 ve CCP4 genellikle H-Köprü işlemlerinde kullanılıyor. Bu işlemcide bunlar için çok açık bir ifade göremedim ama olabilirde. Bence en azından CCP1 veya CCP2 ile deneme yapılarak bu çıkışlardan birisini kullanılabilir hale getirmek daha sonra diğerlerini denemek daha uygun olur.

Ete

Powered by EzPortal