7seg displayde titreme

Başlatan efor, 30 Mayıs 2016, 15:18:00

efor

Merhabalar,

4dig 14mm display ve pic18f2520 ile ac ampermetre yapacagım fakat yazılımsal olarak sıkıntım var.

timer 0 ya ben dogru düzgün kullanamadım yada ana menude analog okumayı fazla yaptığım için mi bir türlü çözemedim displaylerde yanıp sönme oluyor

kod henüz ampermetre için bitmiş değildir ilk etapta okudugum degeri yada butonlarlaa değiştirdiğim degeri displayde görmek.

Device 18F2520
Xtal = 8

PORTA=0:TRISA=%11111111
PORTB=0:TRISB=%00000000
PORTC=0:TRISC=%00000001

Config_Start
   OSC  = INTIO67 ; Internal oscillator block, port function on RA6 and RA7
   FCMEN  = OFF ; Fail-Safe Clock Monitor disabled
   IESO  = OFF ; Oscillator Switchover mode disabled
   PWRT  = On ; PWRT enabled
   BOREN  = OFF ; Brown-out Reset disabled in hardware and software
   BORV  = 0 ; Maximum setting
   WDT  = off ; WDT disabled (control is placed on the SWDTEN bit)
   WDTPS  = 1 ; 1:1
   MCLRE  = On ; RE3 input pin enabled; MCLR disabled
   LPT1OSC  = OFF ; Timer1 configured for higher power operation
   PBADEN  = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
   CCP2MX  = PORTC ; CCP2 input/output is multiplexed with RC1
   STVREN  = OFF ; Stack full/underflow will not cause Reset
   LVP  = OFF ; Single-Supply ICSP disabled
   XINST  = OFF ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
   Debug  = OFF ; Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
   CP0  = OFF ; Block 0 (000800-001FFFh) not code-protected
   CP1  = OFF ; Block 1 (002000-003FFFh) not code-protected
   CP2  = OFF ; Block 2 (004000-005FFFh) not code-protected
   CP3  = OFF ; Block 3 (006000-007FFFh) not code-protected
   CPB  = OFF ; Boot block (000000-0007FFh) not code-protected
   CPD  = OFF ; Data EEPROM not code-protected
   WRT0  = OFF ; Block 0 (000800-001FFFh) not write-protected
   WRT1  = OFF ; Block 1 (002000-003FFFh) not write-protected
   WRT2  = OFF ; Block 2 (004000-005FFFh) not write-protected
   WRT3  = OFF ; Block 3 (006000-007FFFh) not write-protected
   WRTB  = OFF ; Boot block (000000-0007FFh) not write-protected
   WRTC  = OFF ; Configuration registers (300000-3000FFh) not write-protected
   WRTD  = OFF ; Data EEPROM not write-protected
   EBTR0  = OFF ; Block 0 (000800-001FFFh) not protected from table reads executed in other blocks
   EBTR1  = OFF ; Block 1 (002000-003FFFh) not protected from table reads executed in other blocks
   EBTR2  = OFF ; Block 2 (004000-005FFFh) not protected from table reads executed in other blocks
   EBTR3  = OFF ; Block 3 (006000-007FFFh) not protected from table reads executed in other blocks
   EBTRB  = OFF ; Boot block (000000-0007FFh) not protected from table reads executed in other blocks
Config_End



Dim dacvalue As Word
Dim sayac As Word
Dim sira As Byte
Dim birler As Byte
Dim onlar As Byte
Dim yuzler As Byte
Dim binler As Byte
Dim sayi As Byte


Dim x As Byte
Dim i As Byte
Dim k As Byte
Dim y As Byte



Dim adcvalue As Word
Dim data1 As Word
Dim disp As Word
Dim ham As Word
Dim ort As Word
Dim toplam As Word
Dim oran As Word
Dim limit As Word
Dim temp As Word
Dim datah[20] As Word

Dim deger As Float

Dim setakim As Byte

Symbol Disp0=PORTC.7 ' birler hanesi ortak uç
Symbol Disp1=PORTC.6 ' onlar hensie ortak uç
Symbol Disp2=PORTC.5 ' yüzler hanesi ortak uç
Symbol Disp3=PORTC.4 ' binler hanesi ortak uç
Symbol Role=PORTC.3 ' binler hanesi ortak uç
Symbol SETT =PORTC.0 ' set butonu
Symbol ARTIR=PORTA.5 ' artırma butonu
Symbol AZALT=PORTA.3 ' azaltma butonu

Dim PW As Word
Dim Freq As Word
Dim Temp_PW As Word

CMCON=7


TMR0H=0
TMR0L=0

On Interrupt GoTo KESME
INTCON=%10100000 ' TİMER 0 KESMESİ AKTIF
T0CON=%11000001
ADCON0=1 ' a0 analog pin aktif
ADCON1=%00001110
ADCON2=%10000101


CCP1CON.2=1
CCP1CON.3=1

PW = 512 ' Load PW with value 1
Freq = 2000 ' Load Freq with value 2000
Temp_PW = PW ' Copy PW to variable Temp_PW
HPWM 1,PW,2000 ' Send a duty cycle signal at 2.0KHz

         



BASLA:

'****************** analog girişi filtrele ********************
For y=0 To 19
data1=0: ham=0
   For k=0 To 20

     ham=ADIn 0     
     If data1<ham Then data1=ham
     'gosub delay      ' 1ms gecikme
     
   Next k
datah[y]=data1
Next y
'***************************************************************


'*********** bubble sort ( filtreli sayıları sırala ) **********
For x=0 To 18
   For y=(X+1) To 19
      If datah[x]>datah[y] Then
          temp=datah[x]
           datah[x]=datah[y]
           datah[y]=temp
      EndIf
   Next
Next


toplam=0
For x=6  To 13
  toplam=TOPLAM+datah[x]
Next

temp=toplam/8
'****************************************************************


'*************** analog bilgiyi akım bilgisine çevir *************
deger=(50/1023)*temp
 
If deger<25 Then deger=25
 
deger=((deger-25)/0.0185)*0.707

' sayac=deger/10
  sayac = fRound(deger)/10 ' sonuc yuvarla ve 10 a böl
'***************************************************************


'******************* değeri display a yaz **********************
x= Dig PW,0 :GoSub AL:birler=sayi
x= Dig PW,1 :GoSub AL2:onlar=sayi
x= Dig PW,2 :GoSub AL:yuzler=sayi
x= Dig PW,3 :GoSub AL:binler=sayi
'***************************************************************


'******************** aşırı akım set ayarı *********************
'If ARTIR=0 Or AZALT=0 Then GoTo setayar


'***************************************************************


'******************** Analog çıkış *************************************
CCP1CON.4 = Temp_PW.0 ' Place bit-0 of the duty in the LSB register (bit-4)
CCP1CON.5 = Temp_PW.1 ' Place bit-1 of the duty in the LSB register (bit-5)

Temp_PW = Temp_PW>>2 ' Shift the duty cycle value down two places

CCPR1L = Temp_PW ' Load the MSB of the 10-bit duty value


If ARTIR = 0 Then GoSub DELAY: Inc PW ' Use an osciloscope to see cahnges when button is pressed
If PW > 1023 Then PW = 1023 ' Limit upper value to 1023
If AZALT = 0 Then GoSub DELAY: Dec PW ' Use an osciloscope to see cahnges when button is pressed
If PW < 1 Then PW = 1 ' Limit the lowest value to 1


Temp_PW = PW ' Re-load Temp_Pw with Pw



'**************************************************************************

GoTo BASLA





setayar:


x= Dig setakim,0 :GoSub AL:birler=sayi
x= Dig setakim,1 :GoSub AL:onlar=sayi
x= Dig setakim,2 :GoSub AL:yuzler=sayi
x= Dig setakim,3 :GoSub AL:binler=sayi




If ARTIR=0 Then GoSub DELAY : Inc setakim
If AZALT=0 Then GoSub DELAY : Dec setakim

GoTo setayar




                   ' 0   1   2  3   4   5  6   7  8   9  boş  S  A  V  E
AL: sayi = LookUp x,[40,235,50,162,225,164,36,234,32,160,255,164,96,41,52] :Return     'noktasız

AL2: sayi = LookUp x,[8,203,18,130,193,132,4,202,0,128] :Return     ' noktalı


DELAY:
For i=0 To 100
DelayUS 5
Next
Return




Disable
KESME:

sira=SIRA+1
If sira>3 Then sira=0

If sira=0 Then
Disp3=0
PORTB=birler
Disp0=1
EndIf
If sira=1 Then
Disp0=0
PORTB=onlar
Disp1=1
EndIf
If sira=2 Then
Disp1=0
PORTB=yuzler
Disp2=1
EndIf
If sira=3 Then
Disp2=0
PORTB=binler
Disp3=1
EndIf

INTCON.2=0
Resume
Enable

ete

#1
Programda bir anaormallik göremedim. Bana göre tek olmaması gereken şey her analog okuma arasına koymuş olduğun yaklaşık 1 ms lik süre ki bence gereksiz. Oraya direk 20 us lik bir gecikme koyarsan sorun çıkmaz.
Diğer taraftan baktığımda program 8 Mhz de çalışıyor. Timer0 ise ön yüklemesiz olarak 1/4 bölme oranı ile çalışmakta. Buda her  515us de bir kesme oluşturacak anlamına gelir. Belki bu süre yeterli gelmiyor olabilir. Bana kalırsa kesme süresini önce 1ms de bir olacak şekilde dene. Aslında bu gibi sistemlerde kesme süresi 300us ye ye kadar inebilir. Ama ideali 1 ms dolayında bir değerdir.
AC akım değerini ölçme sıfır noktası yakalama ister. Ölçülen değerin dorğu olabilmesi için sıfır noktasından sonraki tepe değere en yakın yerde yapılan ölçüm en doğru olanıdır. Acaba senin yöntemin nedir. Titremeye bu ölçümün rastgele yapılmasıda sebep olabilir.

Ete

efor

hocam 1ms için ön yüklemeye 5 ile başlasak 1ms olmaz mı ? bu şeklide de denedim ama display kırpılması devam ediyor. acaba HPWM falan etkiliyor olabilir mi?

şema linkte  http://s4.dosya.tc/server/g16q0x/oransal_amp_sema.rar.html 
transistörler bc817smd

ete

1 ms için 8 Mhz de bölme oranı 1/8 olmalı ve ön yükleme değeri 6 olmalıdır. Kesmeden çıkarken de bu değeri verip çıkman lazım unutma.
HPWM geri planda çalışır ana programı hiç bir şekilde etkilemez.
Birde denemeni umarım gerçek devrede yapıyorsundur. Zira simulasyonda titremesi normal.

Ete

efor

#4
hocam kristale göre nasıl hesaplanıyor bulamadım derslerinizde. dediğiniz gibi de yaptım fakat titreme bariz belli oluyor. devreyi gerçekte yaptım onun üzerinde deniyorum.


AC ölçüm için henüz akım ölçme kısmına geçemedim, displaylerdeki sıkıntı için.  ACS712 den aldığımın analog bilgiye göre AC ölçüm yapacağım

CMCON=7

TMR0H=0
TMR0L=6

On Interrupt GoTo KESME
INTCON=%10100000 ' TİMER 0 KESMESİ AKTIF
T0CON=%11000010
ADCON0=1 ' a0 analog pin aktif
ADCON1=%00001110
ADCON2=%10000101


CCP1CON.2=1
CCP1CON.3=1

PW = 512 ' Load PW with value 1
Freq = 2000 ' Load Freq with value 2000
Temp_PW = PW ' Copy PW to variable Temp_PW
HPWM 1,PW,2000 ' Send a duty cycle signal at 2.0KHz








Disable
KESME:

sira=SIRA+1
If sira>3 Then sira=0

If sira=0 Then
Disp3=0
PORTB=birler
Disp0=1
EndIf
If sira=1 Then
Disp0=0
PORTB=onlar
Disp1=1
EndIf
If sira=2 Then
Disp1=0
PORTB=yuzler
Disp2=1
EndIf
If sira=3 Then
Disp2=0
PORTB=binler
Disp3=1
EndIf

TMR0H=0
TMR0L=6
INTCON.2=0
Resume
Enable

~ENES~

@efor ustam ..
protonda iki çeşit kesme var yazılımsal ve donanımsal olarak.. sen yazılımsal kesme kullanmışsın .. dolayısı ile program bir komutu icra ederken kesmeye gidemez ve ekranı taramadığı için titreme yapıyor kanımca.. donanım kesmesini kullanırsan bu sorun ortadan kalkar komut işlerken bile program kesmeye gidebilir .. pic basicden protonu ayıran en büyük özelliklerden biriside budur .. donanım kesmesini araştırın derim ... kolay gelsin ...
ALLAH'a teslim olmuş bir insan ! Ne sultan tanir , ne sadrazam !

ete

Programa tekrar baktım da 8Mhz de çalışacağına dair bir ayar göremedim.
Bu işlemcide dahili OSC birden fazla frekansta çalışabiliyor. O halde hangisini tercih ettiğini OSCCOn registerine değer vererek seçmen gerekir.
OSCCON registerine %01110110 değerini vermen gerekir. Sanırım sorunu bu. Programın başına bu komutu ekle bakalım.

Ete

efor

enes hocam dediğinizdonanımsal için ayrı bir araştırma yapacağım.

Ete hocam dediğiniz gibi OSCCON reg ekleyince devre düzgün çalıştı. ama anlayamadım xtal 8 olarak belirttim ve harici olarak 8mhz kristal kullanıyorum ?

yardımlarınız içinde çok teşekkür ederim

ete

Xtal 8 programa yapılan bir bildiridir. Delay komutlarının düzgünce süre ayarlaması yapabilmesi için gereklidir.
Ama birden fazla seçeneği olan dahili OSC nin hangi frekansta çalışacağını OSCCON registeri belirlemektedir.
Ona değer vererek frekansı belirlemen gerekiyordu verince her şey normale dönmüş oldu. Program şu anda 8 Mhz ile çalışıyor.
Önceden rastgele (default ne ise) o frekansta çalışıyordu ve muhtemelende düşük bir frekans olduğu için titreme oluyordu.

Ete

efor

anladım hocam çok teşekkür ederim . akım ölçme kısmına geçince tekrar rahatsız ederim

efor

hocam şu akım ölçme kısmında da yardımcı olabilirmisiniz ?

analog okuma döngüsü içerisinde 20us kullanın demiştiniz fakat olmuyor o süre. for içerisinde 5usx20 yapınca simülasyondaki değer gerçek görünüyor. gerçketede doğru ölçermi bilemiyorum.

acs712-5 entegresi kullanıyorum.


For y=0 To 19
data1=0: ham=0
   For k=0 To 19

     ham=ADIn 0     
     If data1<ham Then data1=ham
     GoSub DELAY
     
   Next k
datah[y]=data1
Next y

For x=0 To 18
   For y=(X+1) To 19
      If datah[x]>datah[y] Then
          temp=datah[x]
           datah[x]=datah[y]
           datah[y]=temp
      EndIf
   Next
Next


toplam=0
For x=6  To 13
  toplam=TOPLAM+datah[x]
Next

temp=toplam/8
'****************************************************************


'*************** analog bilgiyi akım bilgisine çevir *************
deger=(50/1023)*temp
 
If deger<25 Then deger=25
 
deger=((deger-25)/0.0185)*0.707

DELAY:
For i=0 To 20
DelayUS 5
Next
Return


ete

ACS akım sensörü hiçakım çekilmediği zaman sana 2,5V çıkış verir. Bu sıfır akım noktasıdır. Bunun ADC karşılığı 511 dir.
Akım Pozitif yöndeçekildiğinde ADC karşılığında 512-1023 aralığında gelir. Akım negatif yönde çekildiğinde ise ADC karşılığı 0-510 aralığındadır. Devredeki oynamaları dikkate alarak söz konusu aralıkları 0-508 ve 514-1023 olarak kullanmak gerekir.
Dikkat edersen 5 A akım karşılığı sana 512-1023 aralığında bir ADC değeri vermektedir. Bu ise 511 birim ADC değeri demektir.
Bu durmda gerçek akım hesabında 0-1023 değerini değil 0-511 değerini esas alman gerekir.
Yani akım=(Okunan ADC değeri) * 5000/511 şeklinde bir hesap olması gerekir.
5 Amperlik akımın 5000 ma olarak hesaplandığına dikkatini çekerim. Sen farklı hesaplayacak isen formülü ona göre kurman gerekir.
Burada da Okunan ADC değeri olarak Absolute değer kullanıdığını unutma. Yani  Okunan değer=ABS(511-Okunan ADC) olması gerekir. Aksi halde şöyle bir mantık uygulaman gerekir.
If Okunan değer >511 then Akım =(Okunan ADC-511) * 5000/511
If Okunan değer <511 then Akım=(511-Okunan ADC) * 5000/511
Daha basit anlatmak gerekir ise 2,5V offset değerimiz olduğu için bunun üzerine okunan değer bizim çekilen akıma denk gelen değerimizdir. Yani sensör akım sıfır iken 511 versin akım sıfırdan büyük ise 511+ADC şeklinde bir değer verse sorun olmayacak idi. Gerçek ADC değerinden offset değeri çıkartılınca çekilen akıma karşılık gelen gerçek ADC değerini bulmuş oluyoruz. Ama akım çift yönlü çalıştığı için ters yönde çekilen akım ölçülmesi durumunda bu sefer olçülen değeri off set den çıkarmamız gerekecektir ki onu yapıyoruz.

Ete

efor

acs için internetteki diger programlarıda inceledim mantığını anladım fakat uygulamada filtreleme sıkıntısı oluyor

yazmış olduğum programda acs için sadece + alternanstaki gelen max değerleri 20 ad değişkene kaydediyorum, bubble sort yöntemi ile dataları küçükten büyüğe sıralıyorum ve orta kısımdan 8 adet datayı alıp ortalamasını alıyorum . sonucuda ac akım olarak hesaplayıp gösteriyorum fakat akım değeri farklı çıkıyor .

ac akımı ölçüp hesaplayacağımız farklı ve doğru sonuç alabileceğim program öneriniz varmıdır ? tecrübeye dayalı program

ete

Bildiğim bir program örneği yok maalesef.
Ac de akım ölçmek gerçekten zor.

Ete

efor

anladım hocam, denemeler ile bulmaya çalışacağım, yardımlarınız için teşekkür ederim

Powered by EzPortal