12F1822 dahili DAC çıkış voltajı sorunu

Başlatan er-da, 13 Ağustos 2014, 01:36:17

er-da

merhabalar..

dac çıkışını birtürlü vdd yapamadım.. ekte data sheet hariç dosyalar var 
Device = 12F1822
Declare Xtal=16


Config1 FOSC_INTOSC, WDTE_OFF, PWRTE_ON, MCLRE_ON, CP_OFF, CPD_OFF, BOREN_ON, CLKOUTEN_OFF, IESO_OFF, FCMEN_OFF
Config2 WRT_OFF, PLLEN_off, STVREN_ON, BORV_25, LVP_OFF

Declare Adin_Res 10     
Declare Adin_Tad   FRC               
Declare ADIN_DELAY  20         

TRISA=%1111110
OSCCON=%11111011
ANSELA=%0000010
PORTA.1=0
CM1CON0.7=0
CCP1CON=0
OPTION_REG.7=0
ADCON0=%00000101
ADCON1=%0111000
WPUA=%11111111                         
                                                       
DACCON0=%11100000
FVRCON.7=0
SRCON0.7=0
Dim ada As Word
Dim add As Byte   
Dim dad As Byte

DelayUS 200

basla:

ada= ADIn 1
DelayUS 20                               
add=ada/256    '5 bit 0-31
dad=add
DACCON1= dad
add=0

GoTo basla



ete

#1
Data sheet bölüm 17.0 da DAC modülün bilgileri yer almaktadır.
Burada verilen formüle göre DACEN biti şayet set edilmiş ise (DACEN=1)
Vout=[(Vsource+) - (Vsource-)]x(DACR 4:0)/2^5)+(Vsource-)
formülüne göre çıkış vereceği belirtilmiştir. Formüle bakıldığı zaman çıkış voltajının Ladder dirençlerine verilen değere göre değiştiği kolaylıkla anlaşılır. Bu dirençlere verilen değer ise DACCON1 (Voltaj Reference Control Register 1) registeri ile sağlanmaktadır. Registere bakılırsa bu iş için yalnızca ilk 5 bitin ayrıldığı kolaylıkla görülebilmektedir. Çünki çıkış voltajı 32 kademeden oluşmaktadır. Bu kademeleri ise ilk 5 bite verilen değer ayarlamaktadır. O halde hemen çıkartacağımız sonuç DACCON1 registerine %00000000 - %00011111 arasında bir değer verebileceğimizdir. 5 bitlik en büyük sayı 31 dir. O halde bu registere 31 değerini verirsek alacağımız DAC voltajı  Vout=(5V-0)*31/32+0=4,84V olmalıdır. Benzer şekilde DACCON1=15 verdiğimizde ise Vout=5*(15/32)=2,34V almamız gerekir. Ancak bütün bunları İsis de denediğimizde beklediğimiz değerleri alamıyoruz her nedense. Bunun iki sebebi olabilir. Birincisi 12F1822 nin model dosyası hatalıdır ve hesaplamalar hatalı yapılır. İkincisi 12F1822 data sheet hatalıdır ve DAC tanımlamaları farklı şekilde yapılmalıdır.
Bu arada programında 10 bit ADC okuması yapılmakta olup ADCON1.7 biti 1 yapılmalıdır.
Benim kullandığım örnek program aşağıdadır.

Ete
'device 12F1822
asm 
__config _CONFIG1, _FOSC_INTOSC & _MCLRE_OFF & _PWRTE_ON & _WDTE_OFF & _CPD_OFF
__config _CONFIG2, _PLLEN_OFF & _LVP_OFF & _WRT_OFF
endasm

DEFINE ADC_BITS 10     ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 2     ' ADC clock source  (Fosc/32)
DEFINE ADC_SAMPLEUS 20 ' ADC sampling time (uSec)
'-----------------------------ÇALIŞMA FREKANSI SEÇİMİ------------------------------------
DEFINE OSC 16  'VEYA DEFINE OSC 4    veya  DEFINE OSC 8
'OSCCON=%01101000   '%01111000=16mHZ %01101000=4 mHZ  ,  %01110000=8 mHZ  , %01111000=16mHZ ,
OSCCON=%01111000   '%01111000=16mHZ %01101000=4 mHZ  ,  %01110000=8 mHZ  , %01111000=16mHZ ,
OPTION_REG=0
CM1CON0=0   'KOMPARATÖRLER İPTAL EDİLDİ
CM1CON1=0
ANSELA=%0000010 'ANSELA = 0  'ANALOG GİRİŞLER İPTAL HEPSİ DİGİTAL

PORTA=0
TRISA=%1111110'TRISA=%00001011
WPUA =0 '%00001011
CPSCON0.7=0
ADCON1.7=1
DACCON0=%10100000
FVRCON.7=0
SRCON0.7=0
ada var Word 56
TEMP VAR WORD 58
add var Byte  60 
dad VAR Byte  61

Pause 200

basla:

ADCIN 1,ada
'pauseUS 20
add=((ADA+1)*/775)/100 'bu formül okunan ADC değerinden 0-31 arası bir değer üretir
'add=temp.byte0
dad=add
DACCON1= dad
add=0

GoTo basla


er-da

açıklamalarınız ve vakit ayırdığınız için teşekkür ederim Hocam, board üzerinde gerçekte deneyip  bakacağım sonucu yazarım..

Hattuşa

slm arkadaşlar;
biz işlemcilerde hpwm komutu ile max. kaç khz e çıkabiliyoruz?
"HPWM1,duty,frekans"
komutunda frekans değişkeni word tipi değilmi? word tipi ise max.65535 değeri alabileceğine göre max. 65,535 khz e çıkabiliriz.
12f1822 de 32mhz dahili osc ile hpwm le 100-200 khz çıkışı nasıl elde edebiiliriz?

ete

32 Mhz osc frekansında min PWM frekansı 1953 Hz (1,953 Khz) , maksimum PWM freansı ise 4 Mhz olabilmektedir.
Bu tür soruların cevabını direk olarak PicMulticalc.exe isimli basit programdan alabilirsiniz.

Frekans=1000.000/[(PR2+1)*4*(1/OSC Frekansı_MHz)*PR2_Bölücüdeğeri] şeklinde de frekans hesaplayabilirsiniz.
Burada sonucu etkileyen temel parametre PR2 değeri olacaktır. Değeri arttıkça frekans küçülüyor azaldıkça büyüyor. En yüksek 255 , en düşük ise 1 olabiliyor.
Min freans içn PR2=255 , bölme oranı 16 alınır. Bölücü değerleri 1-2-4-8-16 olabiliyor. Yüksek frekans için düşük bölme oranı küçük frekans için büyük bölme oranı kullanılmalı.
F=1000.000 / [(256)*4*(1/32)*16]=1.000.000 /((1024/32)*16)=1.000.000 / 512 = 1.953 Hz.
Max frekans için PR2=1 alınır. Bölme oranıda 1 alınır
F=1.000.000 / ((2*4/32)*1)=1.000.000 / 0,25=4.000.000 Hz. olarak bulunur.

Ete


Hattuşa


Device = 12F1822
'OSCTUNE =%00011111
Declare Xtal =10
OSCCON =0
'Declare PLL_Req = On
Config1 FOSC_HS, WDTE_OFF, PWRTE_OFF, MCLRE_OFF, CP_OFF, CPD_OFF, BOREN_OFF, CLKOUTEN_OFF, IESO_OFF, FCMEN_OFF
Config2 WRT_OFF, PLLEN_On, STVREN_OFF, BORV_25, LVP_OFF
Declare All_Digital true
 


TRISA=%00000001
PORTA=0
ANSELA=%00000001
CM1CON0.7=0
OPTION_REG=%0000000
ADCON0=%00000000
ADCON1=%00000000
DACCON0=%11100000
WPUA=0                       
Declare CCP1_Pin PORTA.2
Symbol GIE = INTCON.7    ' Global Interrupt Enable
Symbol TMR0IF = INTCON.2 ' TMR0 Overflow Interrupt Flag
Symbol TMR0IE = INTCON.5 ' TMR0 Overflow Interrupt Enable
GIE =0
TMR0IF =0
TMR0IE =1
On_Hardware_Interrupt GoTo Z_KeSMe
DelayMS 300
Dim ada As Word
Dim X As Byte   
Dim dad As Byte
Dim Y As Byte
Dim dUtY As Byte
dUtY =5
PR2 =2
PSTR1CON =%00000001
T2CON=%00000010
CCP1CON=%00001100
CCP1CON.4=dUtY.0
CCP1CON.5=dUtY.1
CCPR1L =dUtY >>2



X =0



GIE =1
CCP1CON.2=1
CCP1CON.3=1
DelayMS 100
MaIn:
DelayMS 100
GoTo MaIn

Z_KeSMe:
Context Save
TMR0IF =0
TMR0 =223   '200 uS 5 khz
Inc X         
DACCON1 =LookUp X,[16, 25, 31, 31, 25, 16, 7, 1, 1, 7]
If X =10 Then X =0 : Toggle PORTA.1
       
Context Restore



hocam ben burda ne tür bi eksiklik yaptım ki pwm çıkışından bir sonuç alamıyorum?
isisde sinyal tam istediğim değer çıkmasada yakın bir değer alıyorum ancak, gerçek uygulamada hiç bir çıkış alamıyorum. "hpwm1,duty,frekans" komutunu girdiğim zaman çıkış var ama oda istediğim değerlere çıkmıyor? bir bakabilirmisiniz?

işlemcinin dahili kristalini aktif etmekle ilgili epey tırmaladım ama haricide taksam sonuç değişmiyor

ete

Programın en başında 10 Mhz kristal kullanıldığı belirtilmiş. PLL de aktif edilince elde edilecek OSC frekansı bir kere 40 Mhz olacaktır. Sen ise 32 Mhz konuşuyorsun neye dayanarak bunu söyledin belli değil. Simulasyonda da işlemci frekansı 32mhz alınmış.
Ayrıca OSCCON registerine 8 Mhz değeri verilmiş. Bu register dahili OSC kullanılacağı zaman kullanılmalı. Sen harici kristal kullanacağını deklere etmişsin (FOSC_HS) .
PR2 değerini 39 almışsın neye dayanarak onuda bilmiyorum. Bölme oranın 16 olmuş. Bu durumda hesap yaparsak;
F=1000.000/(39+1)*4*(1/40)*16)=15.625 Hz gibi bir frekans çıkması gerekir.
Derleyici verdiğin frekansı nasıl değerlendiriyor ise senin frelans 12500 Hz çıkıyor. (Skop ölçümü) . Bu durumda derleyici bu verdiğin varyasyonu 32 Mhz olarak değerlendiriyor diyebiliriz. Zira hesaba bakarsak;
F=1000.000/(39+1)*4*(1/32)*16)= 12.500 Hz  demekki OSC frekansın 32Mhz olarak kabul edilmiş.

Bu durumda tavsiyem,
Şayet kristal kullanıyor isen doğru kristal değerini programa girmelisin OSCCON komutunu oradan silmelisin.
Dahili osc kullanacak isen ona uygun sigorta ayarını kullanmalısın ki bu durumda PLL ile 8Mhz kullanman gerekiyor idi.

Ete

Hattuşa

#7
hocam kafam döndü osc ayarları konusunda hata yapmış olabilirim, o kısmı 2. plana atacak olursak....

CCP1CON.2=1
CCP1CON.3=1


komutlarını kullanarak pwm i aktif etmeme rağmen pwm üretimi olmuyor tabii gerçekte, ama simülasyonda pwm var. yani simülasyonda pwm olunca gerçekte neden çıkmaz onu çözemedim.



dUtY =26
PR2 =12
T2CON=%00000100
CCP1CON=%00001100
CCP1CON.4=dUtY.0
CCP1CON.5=dUtY.1
CCPR1L =dUtY >>2

CCP1CON.2=1
CCP1CON.3=1


pr2 değeri ve duyt değeri multipic programından aldım. tabi önceki yanlıştı zira size yansıtırken farklı kombinasyonları denerken öylece aldım. sonuç olarak ben isisde pwm i üretirken gerçekte bunu göremiyorum.


ete

Sorunun asıl muhatabı bende osc ayarları. Simulasyon her halkuarda bir değeri esas alıp işlemciyi çalıştırır. Ama gerçekte ya dahili osc seçili olmalı yada devreye kristal bağlanıp sigorta ayarlarından osc seçimi yapılmalıdır.
Normal şartlarda ben HPWM komutunu kullanmam. Çözünürlük 8 bit dir o nedenle kullanmam. Ama PR2 değerini doğru vermiş isen, T2CON değerini doğru vermiş isen ve CCP1CON.2 ve 3 nolu bitlerini set etmiş isen sinyal aktif hale gelir. Geriye duty değerini vermek kalır ki onuda HPWM komutu yapıyorsun.

Ete



Hattuşa

hocam;
DAC cıkışından 5 khz lik sinüsü alıyorum. dacta çıkış var ama pwm de yok, kendi küçük marifeti büyük entegre beynimi sulandırdı...
bulamadım eksiğimi

mehmet

#10
MPLABx üzerinde;
dahili 32MHz osilatör ayarlarını bu şekilde yapıyorum.

// baslangicta PLL kapalı, buradaki tanımlamalarla
    // soft pll aclılıyor, pll calışması bekleniyor,
    // pll calıştıktan sonra yuksek frekans bekleniyor.
    // oda acoldıktan sonra diğer işlemlere geciliyor...
    OSCCONbits.IRCF = 0b1110;
    OSCCONbits.SPLLEN = 0b1;
    __delay_ms(1000);
    while (!OSCSTATbits.PLLR);
    while (!OSCSTATbits.HFIOFR);


Bunlarla da DAC çıkışından (pin 7) 2.5V DC cıkıyor...


    DACCON0bits.DACLPS = 0b1;
    DACCON0bits.DACOE = 0b1;
    DACCON0bits.DACPSS = 0b00;
    DACCON0bits.DACEN = 0b1;

    DACCON1bits.DACR = 0b10000;
   
    while(1)
    {
       
    }
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr

Hattuşa

slm arkadaşlar sonunda hatamı buldum;  ;D  ;D  ;D
hatam şuymuş, ben kod yazdığım dosyayı masaüstüne başka bir dosya olarak yeniden kaydetmiştim. ETE hocamın T2CON registerindeki timer2 yi aktif etme yerine prasceleri 16 ya bölme işlemi yapmıştım. o hatayı düzeltip derleyince düzelttiğim değilde eski dosyayı işlemciye yükleyip deniyormuşum. PICKIT2 de yüklenecek dosyayı bir kere tanıttığımızda daha sonraki yüklemelerde hep tanıttığımız dizine gidiyor. yani ben üzerinde çalıştığım hex değilde başka hexi yüklüyormuşum. şimdi hex düzgün çalışıyor

Powered by EzPortal