STM32f4 ile ADC örneği ?

Başlatan mir_as82, 05 Ağustos 2013, 11:11:28

mir_as82

CooCox derleyicisi ile stm32f4 adc örneği kod örneği olan arkadaş var mı acaba? Kodların yanınca açıklamalı olan olurda daha iyi olur. Muhittin hocam senin örneğine baktım ama farklı bir işlemci için yapılmış ve bazı yerlerdeki kodlar da hata veriyor. Ve coocox ta adc işlemi için hangi fonksiyonları kullanacağımı bilyorum. stm32f10x için yapmışsınız ben stm32f4 ile aynısı yaptım bazı kodlarda hata verdi.

EMP_Otto

#include "stm32f4xx.h"
void Init()
{
    RCC->CFGR |= 0x00009400;         // AHB ve APB hizlarini max degerlere set edelim
    RCC->CR |= 0x00010000;            // HSE Xtal osc calismaya baslasin
    while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
    RCC->PLLCFGR = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
//  RCC->PLLCFGR = 0x07402A04;     // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
    RCC->CR |= 0x01000000;            // PLL calismaya baslasin  (Rehber Sayfa 95)
    while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
//  FLASH->ACR = 0x00000705;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
    while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
    RCC->AHB1ENR |= 0x0000000F;    // GPIO A,B,C,D clock'u aktif edelim
    GPIOD->MODER = 0x55000000;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin)
    GPIOD->OSPEEDR= 0xFFFFFFFF;   // GPIOD nin tum cikislari en yuksek hizda kullanacagiz

}
///////////////ADC MODULU AYARLARI/////////////////////////////
void ADC_init(void)
    {
	GPIOC->MODER=0x00000C00;           //c5 ANALOG mode YAPILDI
	RCC->APB2ENR|=0x00000100;          //ADC1 MODULU CLOCK AKTIF
	ADC1->CR1|=0x02000000;             //8 BİT CÖZÜNÜRLÜK SECİLDİ
	ADC1->SMPR2=0x00000007;            //EN DUSUK CEVRIM HIZI SECILDI
	ADC1->SQR1=0x00000000;             //1 KANAL CEVRİME GİRECEK
	ADC1->SQR3 |= 0x0000000F;          //İLK PC5 GİRECEK CEVRİME
	ADC->CCR|=0x00030000;              //CLOCK 8 E BOLUNDU
	ADC1->CR2|=0x00000001;             //ADON BİTİ SET EDİLDİ(ADC Yİ AKTİF ETTİK)

    }
////////////////////////////////////////////////////////////////

/////////////////////ADC OKUMA /////////////////////////////////
uint8_t adc_oku(void)
{
  ADC1->CR2|=0x40000000;         //ADC aktif
  uint8_t deger=0;
  while(!(ADC1->SR & 0x00000002)); //Cevrim bitene kadar bekle
  deger=ADC1->DR;
  return deger;
}
/////////////////////////////////////////////////////////////////
void delay()
  {
    unsigned int i=0;
	for(i=0;i<0x90000000;i++);
  }
int main()
{
	 Init();
     ADC_init();
	 float  sonuc;

	 while(1)
	  {
		sonuc=adc_oku();
		sonuc=sonuc*0.01160784314;  //  Vdd voltajı/255
		if(sonuc<1)
			GPIOD->ODR=0x00001000;
		if(sonuc>1 && sonuc<2)
			GPIOD->ODR=0x00002000;
		if(sonuc>2 && sonuc<2.5)
			GPIOD->ODR=0x00004000;
		if(sonuc>2.5)
			GPIOD->ODR=0x00008000;
       }
}


Merhaba hocam coocox ile yaptım gayet güzel çalısıyor.Fakat hazır kütüphaneleri kullanmadım.İnsallah işine yarar
Bu işler zordur,özveri ister...

mir_as82

#2
hocam şu kodları stm32f4 nasıl uyarlarız?
    RCC_PREDIV1Config(RCC_PREDIV1_Source_HSE,RCC_PREDIV1_Div1);// bu kodu nasıl düzeltmeliyim mi coocoxta hata vermesin?
    RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_3);//Configures the main PLL clock source, multiplication and division factors. 24MHZ
    RCC_ADCCLKConfig(RCC_PCLK2_Div2); //ADC max 12 mhz olabilir. APB1 Bus hızı 24

Yukarıdaki satırların 3 ü de hata veriyor. Bunları nasıl düzeltmeliyim?



muhittin_kaplan

coide de yeni bir proje aç, işlemcini vs yi seç, cmis boot core ları seç, adc,gpio,rcc dosyalarını dahil et. kodu yapıştır derle.

GPIOC.0 ı giriş olarak hazırlamış.


#include "stm32f4xx.h"
#include "stm32f4xx_adc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
 
int ConvertedValue = 0; //Converted value readed from ADC
 
 
void adc_configure(){
 ADC_InitTypeDef ADC_init_structure; //Structure for adc confguration
 GPIO_InitTypeDef GPIO_initStructre; //Structure for analog input pin
 //Clock configuration
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//The ADC1 is connected the APB2 peripheral bus thus we will use its clock source
 RCC_AHB1PeriphClockCmd(RCC_AHB1ENR_GPIOCEN,ENABLE);//Clock for the ADC port!! Do not forget about this one ;)
 //Analog pin configuration
 GPIO_initStructre.GPIO_Pin = GPIO_Pin_0;//The channel 10 is connected to PC0
 GPIO_initStructre.GPIO_Mode = GPIO_Mode_AN; //The PC0 pin is configured in analog mode
 GPIO_initStructre.GPIO_PuPd = GPIO_PuPd_NOPULL; //We don't need any pull up or pull down
 GPIO_Init(GPIOC,&GPIO_initStructre);//Affecting the port with the initialization structure configuration
 //ADC structure configuration
 ADC_DeInit();
 ADC_init_structure.ADC_DataAlign = ADC_DataAlign_Right;//data converted will be shifted to right
 ADC_init_structure.ADC_Resolution = ADC_Resolution_12b;//Input voltage is converted into a 12bit number giving a maximum value of 4096
 ADC_init_structure.ADC_ContinuousConvMode = ENABLE; //the conversion is continuous, the input data is converted more than once
 ADC_init_structure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;// conversion is synchronous with TIM1 and CC1 (actually I'm not sure about this one :/)
 ADC_init_structure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//no trigger for conversion
 ADC_init_structure.ADC_NbrOfConversion = 1;//I think this one is clear :p
 ADC_init_structure.ADC_ScanConvMode = DISABLE;//The scan is configured in one channel
 ADC_Init(ADC1,&ADC_init_structure);//Initialize ADC with the previous configuration
 //Enable ADC conversion
 ADC_Cmd(ADC1,ENABLE);
 //Select the channel to be read from
 ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_144Cycles);
}
int adc_convert(){
 ADC_SoftwareStartConv(ADC1);//Start the conversion
 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));//Processing the conversion
 return ADC_GetConversionValue(ADC1); //Return the converted data
}
int main(void){
 adc_configure();//Start configuration
    while(1){//loop while the board is working
     ConvertedValue = adc_convert();//Read the ADC converted value
    }
}