Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: Kaanx - 29 Mayıs 2014, 10:01:06

Başlık: C de formül yazma yardım !
Gönderen: Kaanx - 29 Mayıs 2014, 10:01:06
Merhaba arkadaşlar. C ile şu formülleri yazmam gerekiyor vakti olan yardımcı olabilir mi acaba  ?

ppb= ((VB/ VC - 1 ) *RL/Ro *10-c)^1 /m

Rs/Ro=(VB/ VC - 1) *RL/Ro

Arduino da ppm hesaplmam için gerekli Arduino idede yazıcam. Aynı şekilde stm32f4 içinde yazmam gerekiyor. Keil de
Başlık: Ynt: C de formül yazma yardım !
Gönderen: Burak B - 29 Mayıs 2014, 10:16:13
Yazmışsın işte :)


    float ppb;
    float RsRo;

    ppb = ((VB/VC - 1) * (RL/Ro) * (10-c)) ^ (1 /m);

    RsRo = (VB/VC - 1) * (RL/Ro);

Başlık: Ynt: C de formül yazma yardım !
Gönderen: SpeedyX - 29 Mayıs 2014, 10:34:30
(10-c)) ^ (1 /m); burada ^ işareti üs anlamına gelmez, dikkat!!
Başlık: Ynt: C de formül yazma yardım !
Gönderen: ErsinErce - 29 Mayıs 2014, 10:55:41
kök ile üs arasında ohm ile siemens arasındaki bağıntı olduğundan

o yazım şekli ile üs anlamına gelir ama kodlarken m. dereceden kök işlemi daha hızlı olabilir,
iki türlü de denemek lazım
Başlık: Ynt: C de formül yazma yardım !
Gönderen: muuzoo - 29 Mayıs 2014, 11:10:34
Alıntı yapılan: ErsinErce - 29 Mayıs 2014, 10:55:41
kök ile üs arasında ohm ile siemens arasındaki bağıntı olduğundan

o yazım şekli ile üs anlamına gelir ama kodlarken m. dereceden kök işlemi daha hızlı olabilir,
iki türlü de denemek lazım

Hocam C 'de ^ operatörü XOR işlemini temsil ediyor. O yazımda xor işlemi yapılmış olmuyor mu?
Başlık: Ynt: C de formül yazma yardım !
Gönderen: Burak B - 29 Mayıs 2014, 11:15:53
Pardon benim hatam. Doğru ^ üst almaz XOR yapar. Aceleyle cevap yazdım. Doğrusu aşağıdaki gibi olacak.

#include <math.h>

    float ppb;
    float RsRo;

    ppb = pow((VB/VC - 1) * (RL/Ro) * (10-c), 1 /m);

    RsRo = (VB/VC - 1) * (RL/Ro);


Burada verdiğim üst alma standart C kütüphanesi kullanıyor. Hızlı olsun derseniz pow() fonksiyonunu kendiniz uygun bir optimizasyonla yazmalısınız.

Hız için x^y = e^(y*ln(x)) olduğundan bunu optimize etmek gerekiyor.
Başlık: Ynt: C de formül yazma yardım !
Gönderen: ErsinErce - 29 Mayıs 2014, 11:28:19
Alıntı yapılan: muuzoo - 29 Mayıs 2014, 11:10:34
Hocam C 'de ^ operatörü XOR işlemini temsil ediyor. O yazımda xor işlemi yapılmış olmuyor mu?

doğru xor işlemi, artık ezbere gittiğimizden herhalde 1/m den dolayı direk üs mü kök mü sorusunun üzerine gittim =)
Başlık: Ynt: C de formül yazma yardım !
Gönderen: Burak B - 29 Mayıs 2014, 12:02:18
Bu ^ işaretinin gözümüzden kaçması çok önemli bir hata aslında. Bu tip şeylere çok dikkat etmek gerekli. Çünkü eğer hayatı ilgilendiren bir projede kod yazıyor olsaydık derleyici burada hata vermeden kodu derleyecekti. PC-Lint bile bu hatanın üstesinden gelemez.
Başlık: Ynt: C de formül yazma yardım !
Gönderen: picusta - 29 Mayıs 2014, 22:06:22
Alıntı yapılan: ByteMaster - 29 Mayıs 2014, 12:02:18
Bu ^ işaretinin gözümüzden kaçması çok önemli bir hata aslında. Bu tip şeylere çok dikkat etmek gerekli. Çünkü eğer hayatı ilgilendiren bir projede kod yazıyor olsaydık derleyici burada hata vermeden kodu derleyecekti. PC-Lint bile bu hatanın üstesinden gelemez.
üniter testler de çikmaz mi ? Bu tip formülleri elbet tek tek çalistirip sonuçlarini karsilastirmak gerekir.
Başlık: Ynt: C de formül yazma yardım !
Gönderen: Burak B - 29 Mayıs 2014, 22:16:04
Alıntı yapılan: picusta - 29 Mayıs 2014, 22:06:22
üniter testler de çikmaz mi ? Bu tip formülleri elbet tek tek çalistirip sonuçlarini karsilastirmak gerekir.

Evet çıkar. :) Oralara girersek TDD nedir diye kökten anlatmak lazım. Ben kısa kısa geçtim. Zira bu konuları benden çook çook daha iyi anlatabilecek üstadlarım var forumda.
Başlık: Ynt: C de formül yazma yardım !
Gönderen: z - 29 Mayıs 2014, 22:29:01
Alıntı yapılan: ByteMaster - 29 Mayıs 2014, 12:02:18
Bu ^ işaretinin gözümüzden kaçması çok önemli bir hata aslında. Bu tip şeylere çok dikkat etmek gerekli. Çünkü eğer hayatı ilgilendiren bir projede kod yazıyor olsaydık derleyici burada hata vermeden kodu derleyecekti. PC-Lint bile bu hatanın üstesinden gelemez.

Float degiskenler uzerinde logic islemler yapilabilirmi? Derleyicinin hata vermesi lazim.
Başlık: Ynt: C de formül yazma yardım !
Gönderen: Burak B - 29 Mayıs 2014, 22:39:11
Alıntı yapılan: z - 29 Mayıs 2014, 22:29:01
Float degiskenler uzerinde logic islemler yapilabilirmi? Derleyicinin hata vermesi lazim.

Bende bilmiyorum bir deneyin hocam sonucu bizimle paylaşın. Hatta eğer hata veriyorsa float değişkenleri XOR etmek mümkün müdür acaba ? Yada bu mantıklı mıdır ?
Başlık: Ynt: C de formül yazma yardım !
Gönderen: Tagli - 30 Mayıs 2014, 08:11:23
Bence mümkündür ancak mantıklı değildir. Derleyici bunları iki tane 32 bitlik veri gibi görür ve XOR yapar. Çıkan sonucun da hiçbir anlamı olmaz. Bence hata değil ama uyarı vermesi gerekir.
Başlık: Ynt: C de formül yazma yardım !
Gönderen: Burak B - 30 Mayıs 2014, 10:15:49
Aslında integral veri türü gerektirdiğine dair hata verir. Yani @z hocam haklı. Ayrıca float sayıların XOR edilmesi anlamsız olduğundan derleyiciler ve ben yukarıda hernekadar aksini belirtmiş gibi görünsemde (sadece acaba kim araştıracak diye düşünmüştüm.) PC-Lint gibi static analiz araçları buna müsade etmez. Ancak her ne kadar mantıksız olsa da yapılamaz ve her derleyici tarafından algılanabilir değildir.

float işlemler için XOR bu sebeple tanımlanmamıştır. Ama ben psikopatım ve bunu yapacam derseniz yapılır. Buna benzer birşeyde '%' mod operatörüdür. ama bunun için fonksiyon fmod() kullanımı vardır. Çünkü float sayılarda mod mantıklı bir işlemdir.

Başlık: Ynt: C de formül yazma yardım !
Gönderen: Kaanx - 03 Haziran 2014, 11:35:21
Arkadaşlar yorumlara göre ortaya cıkan formul ve ortamdaki ozon miktarını hesaplayıp PPB değerini gösteren formülüm

//VARIABLES FOR OZONE SENSOR   
float Vc=0.0;
float ratio=0.0;
float x=0.0;
float ppbvalue=0.0;
float ppb=0.0;
float c=1.505;
float m=-0.903;
float Ro=23850.0;

float Rs=0.0;
float Rl=10000.0; //or 20000k  ohm

  //MQ-131 Ozone Sensor Read 
   float Vc=5.0*analogRead(Ozone_sensor_pin)/1024;
  Rs=(float)(5.0/Vc-1)*Rl;
 
  ratio=(float)Rs/Ro;
  x=pow(10,-c);
 
  ppbvalue=ratio*x;
  ppb=(float)pow(ppbvalue,1/m);



Sadece formülazasyon kısmı burada bu kod arduino içinde yazılmıstır.

Kullanılan sensörün datasheet i ----> https://www.futurlec.com/Datasheet/Sensor/MQ-131.pdf (https://www.futurlec.com/Datasheet/Sensor/MQ-131.pdf)

Bu sensör için verilen grafiğe göre formül çıkardım ve değerlerim yukarıda bulabilirsiniz. Bana göre formül güzel çalışmıyor. yani İstediğim değerleri göremiyorum absürd degerleri gördüm hep , Ro hesaplayamadım sabit değer alıyorum sürekli 20 k ohm civarı ve RL yide aynı şekilde kafama göre 10k yada 20 k alarak işlemlerimi yapıyorum. Belkide sorun katsayılarımda da olabilir bilemiyorum vakti olan varsa ilgilenebilirse cok makbule geçer. Datasheette grafik logaritmik kagıda yazılmıs yani çözerken ona dikkat ederek çözebilirisniz
logaritmik kagıt ile ilgili ders içinde ---> https://www.lhup.edu/~dsimanek/scenario/errorman/graphs2.htm (https://www.lhup.edu/~dsimanek/scenario/errorman/graphs2.htm) linkini kullanabilirsiniz. Şimdiden teşekkür ediyorum

Başlık: Ynt: C de formül yazma yardım !
Gönderen: Klein - 03 Haziran 2014, 12:16:34

//MQ-131 Ozone Sensor Read 
   float Vc=5.0*analogRead(Ozone_sensor_pin)/1024;
  Rs=(float)(5.0/Vc-1)*Rl;

Diğer kısımlarda hata olup olmadığını bilmiyorum. İncelemedim. ama bu kısım doğruluğu etkiler.
 
5.0 olarak gösterdiğiniz değer 5V 1024 ADC çözünürlüğü sanırım.
Meslek hayatık boyunca , bir kere bile   (referans / çözünürlük * adc_değeri) formülüne değerleri bu şekilde girip doğru sonucu alamadım.
çok istedim ama olmadı.

formüle 5.0 şeklinde bir değer girmek için doğruluk sınıfı çoook yüksek bir referans kullanmanız gerek.
ADC'den gelen değeri bbu şekilde doğrudan girebilmek için, sensör çıkışının çook yüksek doğrulukta olması gerek. Datasheetten gördüğüm kadarıyla doğruluk %2 , ölçüm doğruluğu %5

Doğru sonucu almak için yapmanız gereken şey; kalibrasyon.
Önce hiç ozon olmayan bir ortamda ADC değerini okuyup,  Offset değerini bulacaksınız. Sonra sensörün ölçebildiği en yüksek ozon miktarına mümkün olduğunca yaklaşıp ,  kalibreli bir ozon sensöründen okuduğunuz değeri ve sizin ADCden okuduğunuz değeri alıp bunu span olarak belirleyeceksiniz, sonra da, linearizasyon gerektiriyorsa, linearizasyon yapacaksınız.

Diğer ksımları incelemediğim için, başka hatalar var mı bilmiyorum. Ama bu dediklerimi apmadığınız sürece, diğer hataları düzeltseniz bile asla doğru sonucu alamazsınız.
Başlık: Ynt: C de formül yazma yardım !
Gönderen: Gökhan BEKEN - 03 Haziran 2014, 12:22:08
Alıntı yapılan: Klein - 03 Haziran 2014, 12:16:34
5.0 olarak gösterdiğiniz değer 5V 1024 ADC çözünürlüğü sanırım.
Meslek hayatık boyunca , bir kere bile   (referans / çözünürlük * adc_değeri) formülüne değerleri bu şekilde girip doğru sonucu alamadım.
çok istedim ama olmadı.
Hocam ADC'yi voltaj olarak göstermek için
(referans / çözünürlük * adc_değeri)
yerine hangi metodu tavsiye edersiniz?
Başlık: Ynt: C de formül yazma yardım !
Gönderen: Klein - 03 Haziran 2014, 12:30:59
mesajın altında anlattım. Hiç bir zaman oraya girilen değerler tutmaz.
5.0 dediniz ama referansınız gerekten 5.000V değildir,  R1=1000 dersiniz ama hiç bir zaman o direncin değeri 1000 değildir.
Ancak her cihaz için bu değerleri tek tek ölçer ve formüle girerseniz, o zaman tutar.
Başlık: Ynt: C de formül yazma yardım !
Gönderen: Gökhan BEKEN - 03 Haziran 2014, 12:36:30
Yani önce hangi aralıklarda, hangi ADC değerleri alıyorum ona bakıp geniş bir liste yapacağız.
MCU ile ölçüm yaparken bu liste ile karşılaştıracağız, kabaca hangi aralıktaysa o iki değer arasında olduğuna kanıt getireceğiz.
Sonra bir formülle, orantı kurup gerçek değere daha(oldukça) yakın bir sonuç göstereceğiz.
Sonucun gerçekliğe olan yakınlığı ilk yaptığımız listenin büyüklüğü ile doğru orantılı.

Doğru anlamış mıyım?
Başlık: Ynt: C de formül yazma yardım !
Gönderen: Kaanx - 03 Haziran 2014, 12:51:11
Alıntı yapılan: Klein - 03 Haziran 2014, 12:16:34

//MQ-131 Ozone Sensor Read 
   float Vc=5.0*analogRead(Ozone_sensor_pin)/1024;
  Rs=(float)(5.0/Vc-1)*Rl;

Diğer kısımlarda hata olup olmadığını bilmiyorum. İncelemedim. ama bu kısım doğruluğu etkiler.
 
5.0 olarak gösterdiğiniz değer 5V 1024 ADC çözünürlüğü sanırım.
Meslek hayatık boyunca , bir kere bile   (referans / çözünürlük * adc_değeri) formülüne değerleri bu şekilde girip doğru sonucu alamadım.
çok istedim ama olmadı.

formüle 5.0 şeklinde bir değer girmek için doğruluk sınıfı çoook yüksek bir referans kullanmanız gerek.
ADC'den gelen değeri bbu şekilde doğrudan girebilmek için, sensör çıkışının çook yüksek doğrulukta olması gerek. Datasheetten gördüğüm kadarıyla doğruluk %2 , ölçüm doğruluğu %5

Doğru sonucu almak için yapmanız gereken şey; kalibrasyon.
Önce hiç ozon olmayan bir ortamda ADC değerini okuyup,  Offset değerini bulacaksınız. Sonra sensörün ölçebildiği en yüksek ozon miktarına mümkün olduğunca yaklaşıp ,  kalibreli bir ozon sensöründen okuduğunuz değeri ve sizin ADCden okuduğunuz değeri alıp bunu span olarak belirleyeceksiniz, sonra da, linearizasyon gerektiriyorsa, linearizasyon yapacaksınız.

Diğer ksımları incelemediğim için, başka hatalar var mı bilmiyorum. Ama bu dediklerimi apmadığınız sürece, diğer hataları düzeltseniz bile asla doğru sonucu alamazsınız.

Hocam dediğinizi anladım zaten ben ölçüm yaptıgımda avometre ile kodun söylediği arasında 0.5v akdar bir fark oluyor. http://www.sensorsportal.com/DOWNLOADS/MQ131.pdf (http://www.sensorsportal.com/DOWNLOADS/MQ131.pdf) bu datasheete göre 1. sayfanın altıdna formüller var bizde ona göre yazmıs bulunmaktayız. diğer referans bir örnek te burada http://www.iitk.ac.in/dord/power/documents/projects/aqms-phase1.pdf (http://www.iitk.ac.in/dord/power/documents/projects/aqms-phase1.pdf) bu linke olayı daha iyi anlatıyor. Olay benim parametrelerde sanırsam. Yani NŞA  da oda kşullarında  ozon değeri 30- 50 ppb arası falan diyorlar ben bunu referans aldım. Söyle bir durumda var mesela ben buradan VC yi ekrana bastırdıgımda 5.0 hiç olmuyor mak 3.7 falan kalıyor başlangıc değeri olarak da 1.5 volt falan oluyor.

Birde özellikle dedğiniz yerde bir hata yok sanırım ben mi göremedim. Oradaki ADC den okuyup voltaj hesaplatma işlemi dogru değil mi her ne kadar tam değer vermemiş olsada :) 
Başlık: Ynt: C de formül yazma yardım !
Gönderen: Klein - 03 Haziran 2014, 12:58:57
Hata hesaplamada değil. 
Ama şuna da dikkat et. Linear olmayan sistemlerin kalibrasyonundaki küçük farklar , sonuç üzerinde çok büyük farklara neden olabilir. Atmosferdeki ozon oranını tahmini olarak  aldığınızı da düşünüp , hata payına bunu da eklersek, sonu hiç tahmin etmediğin bir yere gidebilir.
Belki de hesaplamaların , formüllerin doğru , ancak buradaki  kayıklıkların toplamı + inear olmayan sistem faktörü birleşince böyle oluyor.

Edit : Ama yine de başka bir yerlerde hata olup olmadığını iyi araştır.  Sonra aleti kalibre edeceğim diye günlerce uğraştıktan sonra , hata başka yerde çıkarsa, kulaklarım çınlasın istemem :)
Başlık: Ynt: C de formül yazma yardım !
Gönderen: Kaanx - 03 Haziran 2014, 13:04:08
haklısınız hocam sanırm bende değerlerimi buna göre değiştirmeliyim mesela ben ortamda ki ozon değerini 150 ppb ile 500 ppb arasında tutmaya calısıyordum bunu 75 e 300 gibi değer aralıgıdna ceksem mantıklı olucak . Sizce ?

Başlık: Ynt: C de formül yazma yardım !
Gönderen: Klein - 03 Haziran 2014, 13:09:02
Ortamdaki ozon değeri hakkında hiç fikrim yok. ne desem boş. 
Önerim şu olur.  Eğer bu bir hobi projesiyse,  çok dert etmeye gerek yok.  üç aşağı beş yukarı  tutuyorsa, amacına ulaşmıştır. Ama ticari projeyse, ve kullanılacağı yerde doğruluk önemliyse, bu iş tahminle olmaz. Muhakkak kalibreli bir cihaz temin edip , referanslarınızı buna göre düzeltmeniz gerekir.
Başlık: Ynt: C de formül yazma yardım !
Gönderen: Kaanx - 03 Haziran 2014, 13:12:24
Ticari olucak hocam. Sorunda su dediğinizi gibi bir cihaza denk gelmedim dhaa önce o yuzden referans değerlerine göre gidiyoruz sürekli. Ozon değerlerini ölçen cihazlar ile ilgili fikriniz var mı ?
Başlık: Ynt: C de formül yazma yardım !
Gönderen: Klein - 03 Haziran 2014, 13:29:28
Bu işle hiç uğraşmadım. İnternette bir ka link buldum. Onlar da aşağıda. 
Belki de kalibratör lmadan da farklı yollarla kalibrasyon yapma yöntemleri vardır.  Bilimsel yayınların yapıldığı sitelerden veya patent sitelerinden araştırmak faydalı olabilir.

http://www.twobtech.com/model_306.htm (http://www.twobtech.com/model_306.htm)
http://www.coleparmer.com/Product/Eco_Sensors_A_21ZX_Ozone_Monitor_digital/SC-86316-30 (http://www.coleparmer.com/Product/Eco_Sensors_A_21ZX_Ozone_Monitor_digital/SC-86316-30)
http://www.environics.com/Product/ambient-monitor-calibrator-with-ozone-generator/series-6100/ (http://www.environics.com/Product/ambient-monitor-calibrator-with-ozone-generator/series-6100/)
http://www.directindustry.com/prod/teledyne-advanced-pollution-instrumentation/calibrators-ozone-o3-analyzers-22283-1253625.html (http://www.directindustry.com/prod/teledyne-advanced-pollution-instrumentation/calibrators-ozone-o3-analyzers-22283-1253625.html)
http://www.ozonesolutions.com/info/ozone-monitor-calibration (http://www.ozonesolutions.com/info/ozone-monitor-calibration)
http://www.ecotech.com/calibration/gas-calibrator (http://www.ecotech.com/calibration/gas-calibrator)
Başlık: Ynt: C de formül yazma yardım !
Gönderen: Kaanx - 03 Haziran 2014, 13:52:22
Teşekkürler hocam yardımlarınız için. :)