Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

stm32f4

Başlatan eeburakdemir, 08 Mart 2015, 23:27:46

eeburakdemir

arkadaslar merhaba. Stm32f4 iile ilgilenmem yeni sayılır. bir sorum olacak. NTC ile sıcaklık ölçme işlemi yapacağım. Okudugum adc degeri ile işlem yaparken double işlem yapmam gerekiyor. ne  float ne de double karakter tipini algılamıyor yada ben yapamıyorum. Çünkü log işlemi için double tipi  yapmam gerekiyor. yardımcı olurmusunuz ? ide olarak coocox kullanıyorum. bazen de keil . teşekkür ederim...
Asla pes etme...

zdelikan

Merhaba,

STM32F429ZI işlemcili discovery kitini yeni aldım bende sizin gibi yeni başlıyorum ve ciddi anlamda tek satır kod yazamadım henüz. Coocox ile çalışmayı düşünüyorum ve bilgisayarıma kurdum.

Sizin sorunuza sanırım yarın cevap verebilirim çünkü coocox ile çalışmış bir arkadaşım var, ondan sorunuzun cevabını öğrenirim ama ona sürekli ulaşamadığımdan sizin deneyimlerinizi benimle paylaşmanızı rica edebilirmiyim.

Çünkü daha önce .net micro framework ile Usbizi çip üzerinde çalışıyordum bu ortam bana gerçekten çok yabancı ve hızla öğrenmek istiyorum.

mdargut

@zdelikan
Bloğumda NUCLEO kiti ile Coide kullanımı için bir yazı dizisi oluşturmuştum, başlangıç için işine yarayabilir. Sadece mikrokontrolör seçimini elindeki kite göre yapmalısın.

@eeburakdemir
Nasıl bir hata veriyor derleyici? Sorunu tam olarak anlayamadım.

eeburakdemir

ben elimdeki kit ile ntc ile sıcaklık ölçümü yapacağım. bu yüzden sıcaklık okuma okurken formulde doğal log işlemi var , biliyorsunuz birçok yontem var bunun icin. float ve double tanımlamaları yapıyorum standart tanımlama yaptığımız gibi fakat hata vermiyor ama çalışmıyorda. yaptığım sonucu lcd de gösteriyorum hiçbirsey cıkmıyor.
Asla pes etme...

eeburakdemir

@zdelikan sıkıntılarını yaz buraya elimden geldiği kadar bilgilerimi paylaşırım. Gerekirse upload yaparım oradan çekersin  :)
Asla pes etme...

zdelikan

Selam Burak.

ADC den gelen değer 12 bit bir data. Gelen değeri integera okuma yapacaksın, sonra integer degeri,  float register tanımlayıp oraya atıp kullanabilirmişsin.

Bizim üstadın soruna yanıtı bu.

Umarım işine yarar.

eeburakdemir

@zdelikan arkadaşım ilgin alakan ve yardımın için teşekkür ederim. Ben float yada double tanımlıyorum ama bir türlü  olmuyor. Mesela bir float cinsinden değişkene değer atıyorum , sonra lcd de yazdırıyorum sonuç yazmıyor. double da aynı şekilde. stdio.h kütüphanesi de var . başkalarının kodlarında direk float değişken cinsinden tanımlamışlar ve çalışıyormuş.
Asla pes etme...

zdelikan

Valla üstadım bu gün bende deniycem ADC meselesini bakalım sonuç ne olacak denedikten sonra sana yazarım. Bu arada bu konuda beraber çalışmak isteyen arkadaşlar özelden mesaj atarlarsa sevinirim, en azından bu alanda ortak paylaşım yapalım çünkü Türkçe kaynak çok az en azından yeni başlayanlar bizim izimizden daha fazla bilgi ve destekle yola çıkarlar.

mufitsozen

#8
Alıntı yapılan: eeburakdemir - 12 Mart 2015, 21:56:10
başkalarının kodlarında direk float değişken cinsinden tanımlamışlar ve çalışıyormuş.

Sayin Burak kardesim, yazdigin program Kozmik gizlilik derecesinde oldugu icin gostermiyorsun zannederim. Yardimci olmaya calisanlarinda kor atis yapmaktan baska caresi yok.

Biraz alayci bir uslupla 'Benimde basima boyle bisey gelmisti. Arkadaslarimin programi calisiyordu, benimki calismiyordu. Sonradan ortaya ciktiki MS Visual Studio'ya Mufit'in programi ise hata ver diye saplama kod koymus, bende Borlanda gectim filan yazayim diye bile dusundum ama dogru olmaz.

Simdi

- Yazdigin kodu gormeden ne gibi bir hata yaptigini sana soyleyemeyiz. Sende eger yazdigin kodu buraya koymayacaksan hatayi tek basina bulacaksin.

- Kendi basina koddaki hatalari bulmak istersen bazi teknikler vardir. Ornegin donanimla ilgili fonksiyonlarin (tercihan bir #define/#ifdef vb ile) stub'larini yaparsin ve PCde Visual Studio vb bir ortamda interaktif olarak debug edebilirsin (step by step execute edersin o arada variable'lara watch edersin vs)

bunun disinda hem senin vaktin bosa cikar, cabalarin bosa cikar hemde sana yardim etmeye calisanlarin.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

mdargut

Alıntı yapılan: eeburakdemir - 12 Mart 2015, 21:56:10
@zdelikan arkadaşım ilgin alakan ve yardımın için teşekkür ederim. Ben float yada double tanımlıyorum ama bir türlü  olmuyor. Mesela bir float cinsinden değişkene değer atıyorum , sonra lcd de yazdırıyorum sonuç yazmıyor. double da aynı şekilde. stdio.h kütüphanesi de var . başkalarının kodlarında direk float değişken cinsinden tanımlamışlar ve çalışıyormuş.

Az önce NUCLEO kart üzerinde denedim sorun yok. Float değişken tanımlayıp değerini 7.5 atadım. Sprintf ile char dizine, sonrasında karakter LCD ye yazdırdım.

Mufit'in dediklerine katılıyorum. Daha önce de sordum ama hiç birşey paylaşmadın. Devre şemanı, kodunu, derleyicinin verdiği hatayı filan paylaş ki bizimde fikrimiz olsun.

eeburakdemir

arkadaşlar kusura bakmayın bunları şirket bilgisayarından yazdığım için ve bu aralar aşırı yoğun olduğumuz için koyamadım. Kısacası biraz aceleye geldi. Hepinizin tavsiyelerine bakıyorum ayrı ayrı. kod da kozmik birsey değil sıradan bir ntc ölçüm işi :) yanlış anlaşıldıysam affola :) eve gidince kodu da paylaşacağım :) ayrıca nucleo board da deneyen arkadaşım sana da teşekkür ederim , benüm problemimi denediğin için.
Asla pes etme...

eeburakdemir

arkadaşlar kod bu, fakat Temp değeri biraz garip. Devreyi gerçeklediğimiz zaman oda koşullarında 25.00 santigrat gösteriyor. Yani virgülden sonra bir basamak yazdırıyorum fakat hiç değişmiyor. Çakmakla ısıtıyorum fakat değerler çok garip oluyor yani doğru değerler değil. Ayrıca adc değeri sabit durmuyor.  Devre bağlantısı aşağıdaki gibidir.

(Ground) ---- (Thermistor) -------|------- (10k thermistor) ---- (+3v)
                                                      |
                                              Pin C0
Asla pes etme...

eeburakdemir

#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_adc.h"
#include "tm_stm32f4_delay.h"
#include "tm_stm32f4_hd44780.h"
#include "math.h"
#include <stdio.h>

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/

   int ADCResult;

   char data[50];
   char data1[50];

   double sicaklik;

void RCC_Configuration_Adc1(void)
{
  //for ADC1 on PC0 using IN10
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
}


void GPIO_Configuration(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;

     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_5;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
     GPIO_Init(GPIOA, &GPIO_InitStructure);

}


void GPIO_Configuration_Adc1(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_StructInit(&GPIO_InitStructure);

  //for ADC1 on PC0 using IN10
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
}


void ADC1_Configuration(void)
{
  ADC_CommonInitTypeDef ADC_CommonInitStructure;
  ADC_InitTypeDef ADC_InitStructure;

  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;

  ADC_CommonInit(&ADC_CommonInitStructure);

  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfConversion = 1;


  ADC_StructInit(&ADC_InitStructure);

  ADC_Init(ADC1, &ADC_InitStructure);

  ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_3Cycles);
  ADC_EOCOnEachRegularChannelCmd(ADC1, ENABLE);

  ADC_Cmd(ADC1, ENABLE);    //The ADC is powered on by setting the ADON bit in the ADC_CR2 register.
  //When the ADON bit is set for the first time, it wakes up the ADC from the Power-down mode.
}

double temp_calculate(int adc)
{

    double Temp;

    double ara;        //(10000*((4096/(adc-1))));

    ara=adc-1;

    ara=4096/ara;

    ara=ara*10000;

    Temp = log(ara);
   //         =log(10000/(4095/adc-1)) // for pull-up configuration


    Temp=pow(Temp,2);


    Temp=Temp*0.0000000876741;

    Temp=Temp+0.000234125;

    Temp=Temp*(log(ara));

    Temp=Temp+0.001129148;

    Temp=(1/Temp);

    //Temp = log(10000.0*((1024.0/RawADC-1)))
    //Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp )


    Temp = Temp - 273.15;            // Convert Kelvin to Celcius

    // Temp = (Temp * 9.0)/ 5.0 + 32.0; // Convert Celcius to Fahrenheit

    return Temp;


}

int main(void){

   RCC_Configuration_Adc1();
   GPIO_Configuration_Adc1();
   GPIO_Configuration();
   ADC1_Configuration();

   TM_HD44780_Init(16,2);


   while(1)
{

  ADC_SoftwareStartConv(ADC1);
  while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
  ADCResult= ADC_GetConversionValue(ADC1);


  sicaklik=temp_calculate(ADCResult);


  sprintf(data,"TEMP:%.2lfC%c",(double)sicaklik,223);
  sprintf(data1,"ADC:%d",ADCResult);
  TM_HD44780_Puts(0,0,data);
  TM_HD44780_Puts(0,1,data1);
  Delayms(50);


  if(sicaklik<30)
     GPIO_SetBits(GPIOA,GPIO_Pin_7);
  if(sicaklik>30)
     GPIO_ResetBits(GPIOA,GPIO_Pin_5);

}


}
Asla pes etme...

zdelikan

Üstadım devreyi yanlış kurmuşsun.

Öncelikle termistör bir dirençtir yani bir ucunu tutupta grounda bağlarsan diğer ucunu +3,3 volta bağladığında bir değer okuyamazsın.

Bir ucunu +3,3v a bağla diğer ucunuda borda ADC pinine.

Anlamlı bir değerı o zaman okursun. Ve birde termsitörün ntc ise çakmakla ısıtma. Hoş ptc yide çakmakla ısıtmaya kalkma. PTC ise üstüne parmağını koy, NTC ise bir parça soğuksu dolu bardağın dışına değdir.

Umarım sorunun çözülür.

JKramer

Alıntı yapılan: eeburakdemir - 15 Mart 2015, 15:24:06
arkadaşlar kod bu, fakat Temp değeri biraz garip. Devreyi gerçeklediğimiz zaman oda koşullarında 25.00 santigrat gösteriyor. Yani virgülden sonra bir basamak yazdırıyorum fakat hiç değişmiyor. Çakmakla ısıtıyorum fakat değerler çok garip oluyor yani doğru değerler değil. Ayrıca adc değeri sabit durmuyor.  Devre bağlantısı aşağıdaki gibidir.

(Ground) ---- (Thermistor) -------|------- (10k thermistor) ---- (+3v)
                                                      |
                                              Pin C0
(10k thermistor) kısmında thermistor yerine sabit direnç demek istemiştir, yani devre bağlantısında bir sorun yok.