Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

ADC uygulama hatası

Başlatan Analog, 06 Mart 2018, 00:14:44

Analog

Herkese merhaba
Paylaştığım kodda ADC uygulamasını gerçekleştirmek istedim ama kullandığım kartta (stm32f429) çıkış alamıyorum. İnceleyip hatamı gösterirseniz sevinirim. Şimdiden teşekkürler
#include "stm32f4xx.h"                  // Device header

uint16_t Read_ADC(void)
{
	ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_56Cycles);
	ADC_SoftwareStartConv(ADC1);
	while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
	return ADC_GetConversionValue(ADC1);
}

long map( long x, long in_min, long in_max, long out_min, long out_max)
{
return (x-in_min)*(out_max-out_min)/(in_max-in_min)+out_min;
}

int main(void)
{
	uint16_t								adc_data;
	uint16_t								adc_data2;
	GPIO_InitTypeDef				GPIO_InitStructure;
	ADC_InitTypeDef					ADC_InitStructure;
	ADC_CommonInitTypeDef		ADC_CommonInitStructure;
	DAC_InitTypeDef					DAC_InitStructure;
	
	RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA, ENABLE); //to use DAC
	RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOD, ENABLE); //LEDLER
	RCC_AHB2PeriphClockCmd (RCC_APB2Periph_ADC1, ENABLE); //ADC
	RCC_AHB1PeriphClockCmd (RCC_APB1Periph_DAC, ENABLE); //DAC
	
	//DAC CHANNEL 1 
	GPIO_InitStructure.GPIO_Pin								= GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode							= GPIO_Mode_AN;
	GPIO_InitStructure.GPIO_PuPd							= GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	//LEDLER
	GPIO_InitStructure.GPIO_Mode 							= GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_Pin								= GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14;
	GPIO_InitStructure.GPIO_OType							= GPIO_OType_PP;
	GPIO_Init(GPIOD,&GPIO_InitStructure);
	
	//ADC CHANNEL
	GPIO_InitStructure.GPIO_Mode							= GPIO_Mode_AN;
	GPIO_InitStructure.GPIO_Pin								= GPIO_Pin_0;
	GPIO_InitStructure.GPIO_OType							= GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd							= GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	//ADC CONFIGURATIONS
	ADC_CommonInitStructure.ADC_Mode					= ADC_Mode_Independent;
	ADC_CommonInitStructure.ADC_Prescaler			= ADC_Prescaler_Div4;
	ADC_CommonInit(&ADC_CommonInitStructure);
	ADC_InitStructure.ADC_Resolution					= ADC_Resolution_8b;
	ADC_Init(ADC1,&ADC_InitStructure);
	ADC_Cmd(ADC1,ENABLE);
	
	//DAC CONFIGURATIONS
	DAC_InitStructure.DAC_Trigger 						= DAC_Trigger_None;
	DAC_InitStructure.DAC_WaveGeneration			= DAC_WaveGeneration_None;
	DAC_InitStructure.DAC_OutputBuffer				= DAC_OutputBuffer_Enable;
	DAC_Init(DAC_Channel_1, &DAC_InitStructure);
	DAC_Cmd(DAC_Channel_1, ENABLE);
	
	while(1)
	{
  	adc_data=Read_ADC();
		adc_data2=map(adc_data,0,255,0,4095);
		DAC_SetChannel1Data(DAC_Align_12b_R, adc_data);
		
		if(adc_data<51)
		{
		GPIO_ResetBits(GPIOD, GPIO_Pin_12);
		GPIO_ResetBits(GPIOD, GPIO_Pin_13);
    GPIO_ResetBits(GPIOD, GPIO_Pin_14);			
		}
		
		if(50<adc_data &&adc_data<101)
		{
		GPIO_SetBits(GPIOD, GPIO_Pin_12);
		GPIO_ResetBits(GPIOD, GPIO_Pin_13);
    GPIO_ResetBits(GPIOD, GPIO_Pin_14);
		}
		
		if(100<adc_data &&adc_data<151)
		{
		GPIO_SetBits(GPIOD, GPIO_Pin_12);
		GPIO_SetBits(GPIOD, GPIO_Pin_13);
    GPIO_ResetBits(GPIOD, GPIO_Pin_14);
		}
		
		if(150<adc_data &&adc_data<255)
		{
		GPIO_SetBits(GPIOD, GPIO_Pin_12);
		GPIO_SetBits(GPIOD, GPIO_Pin_13);
    GPIO_SetBits(GPIOD, GPIO_Pin_14);
		}
		
	}
	
}

dumansiz

ADC girişine ne bağlı?
D portunun 12,13,14 çıkışlarına ne bağlı? Çıkış alamadım derken neyi kastediyorsunuz?
Şema verirseniz daha iyi olur?
Hem DAC çıkışı, hemde D portunun pinleri adc girişine uygulanan gerilimi gösteriyor galiba.
While'ın içinde bekleme olmadığı için D portunun 12,13,14 pinleri çok hızlı bir şekilde değişebilir.
Eğer bu pinlere led bağlıysa, ledlere bakarak anlayamazsınız.
ADC'nin çözünürlüğünü biraz karıştırmışsınız. 8 bit ayarlamışsınız ama 0..4096 olarak çevirmeye çalışmışsınız.

halil82ist

if(150<adc_data &&adc_data<255)

150 den küçük ve 255 den küçükse yazıyor . sanırım şöyle olacak

if(150>adc_data &&adc_data<255) 150 ile 255 arasında ise .

adc'nin düzgün çalışıp çalışmadığına st'nin  STMstudio programı ile bakabilirsin . Eklediğin registerlerin değerini pc ekranında anlık gösteriyor .


dumansiz

@halil82ist
Kodun bahsettiğiniz kısmında yanlışlık yok.
150 "adc_data"dan küçükse ve "adc_data" 255'den küçükse, şeklinde yazıyor orada.
Yani "adc_data"150 ile 255 arasında. Ve bu doğru.