cosinus hesablama

Başlatan recebcolak, 18 Nisan 2008, 22:22:08

recebcolak

selam arkadalar picbasicde cosinus nasıl hesablanıyor yardım edermisiniz.
ben herkesi sevdim bilmiyorum sevildimmi?

ftsahin

Picbasic çok gelişmiş olmasa da cos fonksiyonuyla cosinus hesaplaması yapıyor. Picbasicde float tipi değişken olmadığı için sonuç  byte cinsinden çıkıyor.

'Kullanımı :  sonuc = cos açı
basla:
     a =cos 0 '0 derece sonuç 127
     b = cos 64 '90 derece  sonuç 0
     c= cos 128 '180 derece sonuç 127
     d= cos 192 '270 derece sonuç 0
     lcdout $fe,2,#a,"   ",#b,"   "
     lcdout $fe,$c0,#c,"   ",#d,"   "
     pause 100
goto basla



Matematikte 0-359 arasında değişen açıyı picbasicde 0..255 olarak verebiliyoruz.  Bu dönüşümü hesaplamak için

yeniaçı= açı*255/359 formülünü kullanabiliriz.

Matematikte cos fonksiyonundaki en yüksek değer olan 1' in picbasicde karşılığı 127.  Negatif sonuçları kullanmak istiyorsak bir bitlik durum değişkeni tanımlayıp açı derecesinin aralığına göre (90..270 arası)  bu değişkeni set edebiliriz.

turkronik

Ben de çok uğraştım bu cosinüs belası için.

Projemizde  3 fazlı motorun akım gerilim güç cosfi gibi değerlerini göstermemiz lazım diğerleri tamam ama cosfi de takılıp kaldık.Başka biri tarafından yazılan cosfi programı aşağıdaki sıfır geçiş dedektörü devresinden gelen verilere göre denedik ancak verimli sonuç elde edemedik(proteusda çok iyi çalışıyor ama).
Biz de picbasic plus da tekrar yazmaya çalışıyoruz ancak basic in cos fonksiyonunu bitürlü kullanamadık.ftsahin hocamın anlattıklarını da pek anlayamadım.cos 60 deyince 0,5 değerini verecek hale getiremedik bir türlü kodları.C yi bilmeyince projenin diğer kısımlarını basic de yazdık elimizdeki c kodunu değerlendiremedik yani.

Özetle;
Devreyi proteusta sıfır geçiş kullanmadan deniyoruz,gerçekte kullandığımız devre hakkında ve cos hakkında yardım etmenizi rica ediyorum çok az zamanımız kaldı.Şimdiden çok teşekkür ederim.İyi çalışmalar.

proteus şeması:

[IMG]http://pic1.resimupload.com/r3/thumb_508443513.BMP[/IMG]

Sıfır Geçiş devresi

[IMG]http://pic1.resimupload.com/r5/thumb_443309637.bmp[/IMG]

Cosfi için bulduğumuz C Kodları

[/code]#include "main.h"
#include "LCD4sat.c"
#include <math.h>
#define katsayi pi/180.0
//------------------------------------------------------------------------------
#int_RB
void  RB_isr(void)
{
unsigned char temp,hangi;
temp = ( 0xf0 & input_b() );
hangi = temp ^ old_b;
if ( !(temp & (1<<7) ) && (hangi & (1<<7) ) )
  {
  set_timer1(0);
  t1h=0;
  }
if ( !(temp & (1<<6) ) && (hangi & (1<<6) ) )
  {
  hesap = get_timer1();
  hesapla=1;
  }
old_b=temp;
}
//------------------------------------------------------------------------------
void main()
{

unsigned int16 sonuc;
unsigned char c;
  setup_adc_ports(NO_ANALOGS);
  setup_adc(ADC_OFF);
  setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
 
  lcd_init();
  enable_interrupts(INT_RB);
  enable_interrupts(GLOBAL);
 
hesapla=0;
  // TODO: USER CODE!!
while (1)
  {
  if (hesapla)
     {
     sonuc = hesap*0.018;
     if ( sonuc > 180)
        c='E';
        else
        if (sonuc)
           c='K';
           else
           c='R';
     printf(lcd_putc, "\fcosfi= %1.4f %c",cos(sonuc*katsayi),c);  
     hesapla=0;
     }
 
  }
}


Bizim yapmaya çalıştığımız PICBasic Plus kodları:

[code]       
dim cosfi as byte
dim katsayi,radyan as float
dim hesap as word
dim syc as byte
katsayi=360/20000
radyan=3.14/180
SYMBOL TIMER1 = TMR1L.WORD
T1CON=%00110000

bas:

if  portb.6=1 then
T1CON.0=1     'timer aktif
endif
if portb.7=1 then
T1CON.0=0    'timer pasif
hesap=TIMER1*radyan*katsayi     '
cosfi=cos hesap
print at 1,1,"cos = ",dec cosfi
TIMER1=0
endif

goto bas
Beynimin %98 lik kısmına sesleniyorum.Beyin yangelip yatma yeri değildir!!!  http://www.selcuktarget.com/ http://www.robotmalzemeleri.com/

ftsahin

Aşağıdaki kod sadece timer süresine bağlı olarak faz farkını buluyor.  Proteusta faz farkının 90 derece olduğu durumda timer 333'e kadar sayıyor. 333 değerini 90 derece varsayarak programı ona göre düzenledim.  Katsayı ve radyan değişkenlerini kullanmaya gerek duymadım.  Faz farkı bulma konusunda fazla bilgim olmadığı için yaptığım hesaplar yanlış olabilir. İsterseniz programı deneyin ve gerekirse timer süresini  gerçek devrede yeniden okuyarak gerekli düzenlemeleri yapın.

Burada sonuç oran değişkeninde gösteriliyor.


Device 16F877

OPTION_REG = $55 ' Set TMR0 configuration and enable porta pullups 53 ac

TRISC = %11111111

DelayMS 100 

PORTC=0

PORTB=0

 

 

 

Dim cosfi As Byte 

Dim katsayi As Float 

Dim radyan As Float

Dim hesap As Word 

Dim syc As Byte 

Dim yaz As Byte

Dim oran As Float

Declare LCD_INTERFACE 4

Declare LCD_DTPIN PORTB.4

Declare LCD_ENPIN PORTB.3

'DECLARE LCD_RWPIN PORTB.2

Declare LCD_RSPIN PORTB.1

 

Declare ADIN_RES 10 ' 10-bit result required 

Declare ADIN_TAD FRC ' RC OSC chosen 

Declare ADIN_STIME 50 ' Allow 50us sample time 

 

katsayi=360/20000 

radyan=3.14/180 

Symbol TIMER1 = TMR1L.Word 

T1CON=%00110000 

bas: 

If PORTC.0=1 Then 

T1CON.0=1 'timer aktif 

yaz=1

EndIf 

If PORTC.1=1 Then 

T1CON.0=0 'timer pasif 

If yaz=1 Then

hesap=TIMER1 

hesap=hesap*64/333

cosfi=Cos hesap 

oran = cosfi/127

Print At 1,1,"cos = ",Dec cosfi," ",#hesap," " 

Print At 2,1,"Cosfi = ",#oran," " 

yaz=0

EndIf

TIMER1=0 

EndIf 

GoTo bas

recebcolak

turkronik
ilgin için teşekkürler kardeş.

ftsahin
devre şemasını eklemen münkünmü.sagolasınız.
ben herkesi sevdim bilmiyorum sevildimmi?

ftsahin

@recebcolak,

Yeni bir devre  çizmedim yukarıda turkronik arkadaşın çizdiği proteus şemasını kullandım.

turkronik

recebcolak :
rica ederim ben birşey yapmadım aslında ben de sorun yaşadığım için elimdeki kaynakları ve denemelerimi açıkça yazdım ki sorum iyi anlaşılıp faydalı bir yanıt alayım.Gene de bir faydam dokunduysa ne mutlu:)

ftsahin arkadaşım da sağolsun bir program yazmış çok ufak hatalarla ölçüyor cosfi yi.Ben de ona çok teşekkür ederim.

Herkese kolay gelsin
Beynimin %98 lik kısmına sesleniyorum.Beyin yangelip yatma yeri değildir!!!  http://www.selcuktarget.com/ http://www.robotmalzemeleri.com/