ADC okuma olmuyor

Başlatan yunus58, 01 Şubat 2018, 17:44:17

yunus58

Ben stm32f103c8t6 kullanıyorum,yapmaya çalıştığım bir adc versini arayüz ile göstermek usart ile.Yazdığım kodda bilgisiyar üzerinden hep 1 değerini okuyorum.Hatam nerede olabilir.Teşekkürler, iyi çalışmlar

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdlib.h>
char str[50];
uint32_t i;
uint16_t Read_ADC(void)
{
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);
	while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET)
	return ADC_GetConversionValue(ADC1);
}

void USART_Puts(USART_TypeDef*USARTx,volatile char*s)
{
while(*s)
{
   while(!(USARTx->SR & 0x00000040));
	 USART_SendData(USARTx,*s);
	*s++;
}
}

int main()
{
  uint16_t ADC_Data;
	GPIO_InitTypeDef GPIO_InitStructure;
	ADC_InitTypeDef  ADC_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	RCC_ADCCLKConfig(RCC_PCLK2_Div4);
	ADC_DeInit(ADC1);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);

	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;

	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_Init(GPIOA, &GPIO_InitStructure); 
   
	USART_InitStructure.USART_BaudRate=9600;
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode=USART_Mode_Tx;
	USART_InitStructure.USART_Parity=USART_Parity_No;
	USART_InitStructure.USART_StopBits=USART_StopBits_1;
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;
	USART_Init(USART2,&USART_InitStructure);
	USART_Cmd(USART2,ENABLE);
	//USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  
	ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;
	ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
	ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
	ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
	ADC_InitStructure.ADC_NbrOfChannel=1;
	ADC_InitStructure.ADC_ScanConvMode=DISABLE;
	ADC_Cmd(ADC1,ENABLE);
	ADC_Init(ADC1,&ADC_InitStructure);
	
	ADC_ResetCalibration(ADC1);
	 while(ADC_GetResetCalibrationStatus(ADC1));
	ADC_StartCalibration(ADC1);
   while(ADC_GetCalibrationStatus(ADC1));

while(1)
{
ADC_Data=Read_ADC();
	sprintf(str,"%d\n",ADC_Data);
	USART_Puts(USART2,str);
	i=600000;
	while(i)
		i--;


}

}

devrecii

#1
uint16_t Read_ADC(void)
{
                                                                     ///////////////////////////////////////////
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);
   ADC_SoftwareStartConvCmd(ADC1,ENABLE);
                                                                                                                          buraları while dönğüsünden önceye al
                                                                     /////////////////////////////////////////////////
         
   while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);   <--buradaki noktalı virgülü unutmuşsun
   
       return ADC_GetConversionValue(ADC1);
}


Usart doğru çalışıyormu diye bir text yada harf göndrip test etmelisin ilk önce

yunus58

dediğinizi yaptım.Şimdi de 1990 ile2100 arasında kafasına göre kendisi değer değiştiriyor.Acaba dediğinizi yanlış mı yaptım?



#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdlib.h>
char str[50];
uint32_t i;
uint16_t Read_ADC(void)
{

	while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
	return ADC_GetConversionValue(ADC1);
}

void USART_Puts(USART_TypeDef*USARTx,volatile char*s)
{
while(*s)
{
   while(!(USARTx->SR & 0x00000040));
	 USART_SendData(USARTx,*s);
	*s++;
}
}

int main()
{
  uint16_t ADC_Data;
	GPIO_InitTypeDef GPIO_InitStructure;
	ADC_InitTypeDef  ADC_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	RCC_ADCCLKConfig(RCC_PCLK2_Div4);
	ADC_DeInit(ADC1);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);

	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;

	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_Init(GPIOA, &GPIO_InitStructure); 
   
	USART_InitStructure.USART_BaudRate=9600;
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode=USART_Mode_Tx;
	USART_InitStructure.USART_Parity=USART_Parity_No;
	USART_InitStructure.USART_StopBits=USART_StopBits_1;
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;
	USART_Init(USART2,&USART_InitStructure);
	USART_Cmd(USART2,ENABLE);
	//USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  
	ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;
	ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
	ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
	ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
	ADC_InitStructure.ADC_NbrOfChannel=1;
	ADC_InitStructure.ADC_ScanConvMode=DISABLE;
	ADC_Cmd(ADC1,ENABLE);
	ADC_Init(ADC1,&ADC_InitStructure);
	
	ADC_ResetCalibration(ADC1);
	 while(ADC_GetResetCalibrationStatus(ADC1));
	ADC_StartCalibration(ADC1);
   while(ADC_GetCalibrationStatus(ADC1));
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(1)
{
ADC_Data=Read_ADC();
	sprintf(str,"%d\n",ADC_Data);
	USART_Puts(USART2,str);
	i=600000;
	while(i)
		i--;


}

}

yunus58

aşadaki kod çalışıyor.Ekranda Hello world yazısını çıkıyor.Ama ADC değeri üstte belirttiğim gibi yanlış okuyor.Şimdiden teşekkürler.

while(1)
{
ADC_Data=Read_ADC();
	sprintf(str,"Hello world\n");
	USART_Puts(USART2,str);
	i=600000;
	while(i)
		i--;


}

MC_Skywalker

#4
MCU'nun ADC Ref ayağındaki voltajı kontrol edin.  Çin işi stm kartlarında bu durumla karşılaştım.

http://www.st.com/content/ccc/resource/technical/document/application_note/group0/3f/4c/a4/82/bd/63/4e/92/CD00211314/files/CD00211314.pdf/jcr:content/translations/en.CD00211314.pdf

Ayrıca değişkenini tanımlarken 0'a eşitlemeyi unutma.
float ADCRaw=0;

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
	if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOC))
		{
			
			ADCRaw = HAL_ADC_GetValue(hadc);
				Vin = 3.31 * (ADCRaw/4095);			//VRef * (ADC Data/2^ADCbit)      
	  }
			
}
/* USER CODE END 0 */


SPI LCD ekrana aşağıda ki gibi gönderiyorum fakat Çin işi STM kitin ADCRef ayağındaki voltaj problemi beni çok uğraştırmıştı.
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
		
		HAL_ADC_Start_IT(&hadc);
		
		float X[100], ToplamX=0;
			int j;
			X[0] = Vin;										   //okudugumuz degeri dizinin ilk elemanina
				for (int i=0;i<99;i++) 				//99 kere döngü döner
					{
						j = 98 - i; 							//98 den 0 e dogru geriye saydiralim
						X[j+1] = X[j] ; 					// Her seferinde eski X[j] degerini bir eskisinin yerine tasiyalim
					}
				for (int y=0;y<99;y++)
					{
						ToplamX += X[y];					// tüm X degerlerini toplayip 10 a bölüyoruz.		
					}
				OrtalamaX = ToplamX/100;			

		sprintf(lcd_buff,"%.3f V", OrtalamaX);
		ssd1306_SetCursor(10,15);
		ssd1306_WriteString(lcd_buff,Font_11x18,White);
					
		sprintf(lcd_buff,"ADC RAW: %.2f",ADCRaw);
		ssd1306_SetCursor(0,45);
		ssd1306_WriteString(lcd_buff,Font_7x10,White);			
		
		ssd1306_UpdateScreen();
		HAL_Delay(10);
		
  }
  /* USER CODE END 3 */

devrecii

Yada arkadaş yanlış yerden giriş yapıyor  ;D

yunus58

Aynı sorun bende de var nasıl düzeltiniz peki?

Alıntı yapılan: MC_Skywalker - 02 Şubat 2018, 15:39:02
MCU'nun ADC Ref ayağındaki voltajı kontrol edin.  Çin işi stm kartlarında bu durumla karşılaştım.

http://www.st.com/content/ccc/resource/technical/document/application_note/group0/3f/4c/a4/82/bd/63/4e/92/CD00211314/files/CD00211314.pdf/jcr:content/translations/en.CD00211314.pdf

Ayrıca değişkenini tanımlarken 0'a eşitlemeyi unutma.
float ADCRaw=0;

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
	if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOC))
		{
			
			ADCRaw = HAL_ADC_GetValue(hadc);
				Vin = 3.31 * (ADCRaw/4095);			//VRef * (ADC Data/2^ADCbit)      
	  }
			
}
/* USER CODE END 0 */


SPI LCD ekrana aşağıda ki gibi gönderiyorum fakat Çin işi STM kitin ADCRef ayağındaki voltaj problemi beni çok uğraştırmıştı.
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
		
		HAL_ADC_Start_IT(&hadc);
		
		float X[100], ToplamX=0;
			int j;
			X[0] = Vin;										   //okudugumuz degeri dizinin ilk elemanina
				for (int i=0;i<99;i++) 				//99 kere döngü döner
					{
						j = 98 - i; 							//98 den 0 e dogru geriye saydiralim
						X[j+1] = X[j] ; 					// Her seferinde eski X[j] degerini bir eskisinin yerine tasiyalim
					}
				for (int y=0;y<99;y++)
					{
						ToplamX += X[y];					// tüm X degerlerini toplayip 10 a bölüyoruz.		
					}
				OrtalamaX = ToplamX/100;			

		sprintf(lcd_buff,"%.3f V", OrtalamaX);
		ssd1306_SetCursor(10,15);
		ssd1306_WriteString(lcd_buff,Font_11x18,White);
					
		sprintf(lcd_buff,"ADC RAW: %.2f",ADCRaw);
		ssd1306_SetCursor(0,45);
		ssd1306_WriteString(lcd_buff,Font_7x10,White);			
		
		ssd1306_UpdateScreen();
		HAL_Delay(10);
		
  }
  /* USER CODE END 3 */


Analog

#7
Herkese merhaba. Bende bir adc uygulaması geliştirmeye çalışıyorum ve 32-bit işlemcilerde yeniyim. Elimdeki 32f429 kartı ile basit bir adc yapmaya çalıştım ama kod da herhangi bir hata olmasa da çıkışta hiçbirşey görmüyorum. Sizce hatam nerede olabilir ?
#include "stm32f4xx.h"                  // Device header

uint16_t Read_ADC(void)
{
	
	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;

			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_AIN;
	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_CommonInitStructure.ADC_DMAAccessMode= ADC_DMAAccessMode_Disabled;
	ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles;
	ADC_CommonInit(&ADC_CommonInitStructure);
	
	ADC_InitStructure.ADC_Resolution					= ADC_Resolution_8b;
	ADC_InitStructure.ADC_ScanConvMode=DISABLE;
	ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;
	ADC_InitStructure.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_None;
	ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
	ADC_InitStructure.ADC_NbrOfConversion=1;
	
	ADC_Init(ADC1,&ADC_InitStructure);
	ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_56Cycles);
	ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
	ADC_DMACmd(ADC1, ENABLE);
	ADC_Cmd(ADC1,ENABLE);
	ADC_SoftwareStartConv(ADC1);
	
	//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_data=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);
		}
		
	}
	
}