Daha önceki yazımda tek bir kanaldan okuma yaparak, değere göre pwm üretmiştik. bu yazımda ise çok kanaldan analog sinyal okuyacağız. Budeğerleri CoIDE de ki “değişkenler” penceresinden görebileceğiz.
Programa Geçecek Olursak
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
#include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_flash.h" void SetSysClockTo24(void) { int i; /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------*/ /* RCC system reset(for debug purpose) */ RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); for(i=0;i<0x000FFFF;i++); FLASH_SetLatency(FLASH_Latency_0); RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div1); RCC_PREDIV1Config(RCC_PREDIV1_Source_HSE,RCC_PREDIV1_Div1); RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_3); RCC_PLLCmd(ENABLE); while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while (RCC_GetSYSCLKSource() != 0x08) { } } void ADC_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; //Katılım Sağlanıyor RCC_ADCCLKConfig(RCC_PCLK2_Div2); //ADC max 12 mhz olabilir RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //ADC ye Clock Uygulanıyor ADC_DeInit(ADC1);//Tüm Degerler Varsayılan Olarak Ayarlanıyor reset durumu sonrası /* ADC1 Config ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); //Yukardaki tüm ayarlamalar ADC1 için Uygula ADC_Cmd(ADC1, ENABLE); //AÇ ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); } int readADC1(char channel) { ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_1Cycles5); ADC_SoftwareStartConvCmd(ADC1, ENABLE); // Çevrime Başla while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //Çevrim Bitene Kadar Bekle return ADC_GetConversionValue(ADC1); // ADC değerini Gönder } int main(void) { int Deger_1,Deger_2,Deger_3; SetSysClockTo24(); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;//Pin0,1,2 seçilecek GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//Alternatif IN olarak düzenlenecek GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//Port 50Mhz de çalışacak GPIO_Init(GPIOC, &GPIO_InitStructure);// Yukardaki tümişlemler GPIOC için yapılacak. ADC_Configuration(); while(1) { Deger_1=readADC1(10); Deger_2=readADC1(11); Deger_3=readADC1(12); } } |
Programda GPIOC.0, GPIOC.1 ve GPIOC.2 analog diriş olarakkullanılmıştır. Sırasıyla Bu Pinlerin bağlı olduğu ADC kanalını ReadADC
Fonksiyonuna parametre olarak gönderiyoruz. Böylelikle istediğimiz ölçümü yapabiliyoruz.int readADC1(char channel)
CoIDE de değerleri görebilmek için Debug modda olmanız gerekir. Unutmadan Analog girişlerimiz en fazla vcc yani 3.3v olabilir.
Proje ağacına GPIO,RCC,FLASH ve ADC kütüphanelerinin eklenmiş olması ve CMSIS Boot ve CMSIS Core un da eklenmiş olması gerekir.
İyi Çalışmalar.
Proje ağacına GPIO,RCC,FLASH ve ADC kütüphanelerinin eklenmiş olması ve CMSIS Boot ve CMSIS Core un da eklenmiş olması gerekir.
İyi Çalışmalar.
Ziyaretci : 1848