Pic18f46k22 ile pwm kontrolü ve yangın alarm için ses çıkışı

Başlatan bimühendis, 29 Kasım 2017, 16:51:41

bimühendis

İyi akşamlar ,
Projemde öncelikle kullandığım pic18f46k22(44 pinli) kullanıyorum.9.pininden (pin b1 den ) alarm butonu girişi var ve butona basıldığında pwm ile ses çıkışı yapmak istiyorum.Donanımını hazırladım ancak yazılımda düzgün bir ayar yapamadım .Pwm ile ilk defa uğraşıyorum .Ses ilk başta istediğim gibi çıkıyor daha sonra bozulmaya başlıyor . Yapılan ayarlar aşağıdaki gibidir pwm konusunda beni bilgilendirebilirseniz sevinirim
Device 18f46k22
            Xtal = 64

            @CONFIG_REQ
            @__config _CONFIG1, FOSC_INTOSC & WDTE_OFF & MCLRE_OFF & CP_ON & CPD_OFF & BOREN_OFF & CLKOUTEN_OFF
            @__config _CONFIG2, PLLEN_ON & LVP_OFF & WRT_OFF & STVREN_OFF   
   
           OSCCON.7 = 1
            OSCCON.3 = 0
            OSCCON.4 = 1   
            OSCCON.5 = 1
            OSCCON.6 = 1

TRISB = %11110111
            TRISA = %11111101
            ANSELA = 0
            ANSELB = 0
            INTCON = 0 
            Set ANSELB.1;alarm çıkışı
           
            CCP1CON = %00001100
            T2CON = %00000100
            PR2 = 63
            Clear CCPR1L
Dongu:
Alarm_Girisi = ADIn 10
If Alarm_Girisi > 100 Then Alarm_Cal
goto dongu

Alarm_cal:
.
.
.
.
.


ete

Kullanacağın PWM frekansı nedir.?
Çünki 1/1 bölme oranı ile PR2 ye 63 değerini vermişsin bu 64 Mhz  osilatör frekansı için biraz anlamsız olmuş.
63 kullanabileceğin bölme oranı 1/16 dır ve buda yaklaşık 15,6Khz frekansa denk gelir.

Ete

bimühendis

12,2 khz lik bir frekansa göre ayarlamıştım ama yanlışmı olmuş

ete

12,2Khz (12200 Hz) lik PWM frekansı için T2CON bölme oranın 1/16 olmalı (T2CON=%00000110) ve PR2 yazmacına da 81 değerini vermen gerekir.
Kullandığn ozilatör frekansın 64 Mhz. Bunun için 16 Mhz lik kristal kullanman gerektiğini biliyorsundur umarım. Zira PLLON yapmak ile kristal frekansını 4 ile çarparsın.
64 Mhz için de PWM değerleri verdiğim şekilde olmalı.

Bakalım Data Sheet normal PWM çıkışı için ne yapılmasını söylüyor;
14.3.2 SETUP FOR PWM OPERATION
The following steps should be taken when configuring
the CCP module for standard PWM operation:
1. Disable the CCPx pin output driver by setting the
associated TRIS bit.
Yani PWM pinlerine ait Tris register bitlerini sıfırlayın diyor. TRISC.2=0 TRISC.1=0 olmalı

2. Select the 8-bit TimerX resource, (Timer2,
Timer4 or Timer6) to be used for PWM generation by setting the CxTSEL<1:0> bits in the
CCPTMRSx register.(1)
Yani Önce bir 8 bitlik Timer kaynağı seçin diyor bu Timer2- Timer4 ve Timer6 olabilir. Bunun için CCPTMRS0 registerini kullanman gerekiyor. Bu registerin 1 ve 0 nolu bitleri bu işi yapacak ;
bit 1-0 C1TSEL<1:0>: CCP1 Timer Selection bits
00 = CCP1 – Capture/Compare modes use Timer1, PWM modes use Timer2
Bu durumda CCPTMRS0=%00000000 değerini vermen yeterli olacaktır.

3. Load the PRx register for the selected TimerX
with the PWM period value.
PR2=81 vereceksin

4. Configure the CCP module for the PWM mode
by loading the CCPxCON register with the
appropriate values.
CCP1CON=%00001100 değerini vererek PWM yi aktif hale getireceksin

5. Load the CCPRxL register and the DCxB<1:0>
bits of the CCPxCON register, with the PWM
duty cycle value
Bu aşamadan sonra istediğin duty değerini de programda yaptığın şekilde CCPR1L ve CCP1CON registeri 01 bitlerine duty değerinin ilgilli kısmını vereceksin.

Data sheet diyorki, PWM çıkış pinlerine ait Tris registeri bitleri mutlaka sıfırlanmalıdır. Sende TRISC ile ilgili hiç bir ayar göremedim. Bir işlemcide kullanmadığın pinler olabilir ama mutlaka onların ayarlamasını yapman gerekir. Bu işlemcide PORTA-PORTB-PORTC-PORTD-PORTE bulunmaktadır. Bunların her birinin birer de TRIS registeri bulunmaktadır. Bunlara mutlaka değer veriniz.
Bu durumda en azından TRISC de PWM çıkış pinleri olan PORTC.2  (CCP1) ve PORTC.1 (CCP2) pinlerine ait tris registerlerini sıfırlayın.

Yukarıda ne yapılması gerektiğini açıkladım. Buna göre programını düzenlersin.

Ete

Powered by EzPortal