Stm32F103 Adc çevrimini tamamlamıyor.

Başlatan Emre_Tuncay_, 03 Haziran 2017, 23:34:37

Emre_Tuncay_

merhaba
Stm32f103'e keilde ADC uygulaması geliştirmek istiyorum.Basit bir gerilim ölçmek istiyorum.İşlemci ilk çalışma anında 2 kere dönüştürme yapıyor ama daha sonra adc'den okuma yapmak istediğimde en son değerde kalıyor.Bu durumları debug ile registerları okuyarak takip ediyorum.İşlemciye reset verdiğimde ADC1 in SR registerindeki EOC biti(dönüşüm tamalanınca oluşan kesme bayragı) 2 kere 1 seviyesine geliyor ve bundan sonra birdaha çevrim işlemi olmuyor.Sorun nerede bulamadım yardımcı olurmusunuz.Kodlarım aşagıdaki gibi.
#include "stm32f10x.h"                  // Device header
#include "stm32f10x_adc.h"              // Keil::Device:StdPeriph Drivers:ADC

uint16_t ADC_Read(void)
{
 ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_28Cycles5);
 ADC_SoftwareStartConvCmd(ADC1,ENABLE);
 while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
 return ADC_GetConversionValue(ADC1);	
}
int main(void)
{
	uint8_t ADC_val=0;
	GPIO_InitTypeDef GPIO_InitStructure;
	ADC_InitTypeDef  ADC_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitStructure.GPIO_Mode             = GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Pin              = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed            = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	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);
	ADC_Cmd (ADC1,ENABLE);	


	ADC_ResetCalibration(ADC1);
	while(ADC_GetResetCalibrationStatus(ADC1));
	ADC_StartCalibration(ADC1);	
	while(ADC_GetCalibrationStatus(ADC1));

	
	ADC_Cmd (ADC1,ENABLE);	
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);

	while(1)
	{
		ADC_val=ADC_Read();
	}
}

mg1980

Ölçmeye çalıştığınız gerilim 3.3v seviyesinden yüksek olmasın!

Emre_Tuncay_

hayır 3.3v'dan büyük bir değer ölçmüyorum.Ölçümü reset verdikten sonra dogru yapıyor ama belli bir süre sonra (3sn) en son ölçtüğü degerde kalıyor.

mg1980

UART haberleşmesinde 5v modülden gelen TX sinyali gerilim bölücü olmadığında kilitlenmeye sebep oluyordu da belki ona benzer bir şeydir diye düşünmüştüm.

Emre_Tuncay_


crazy

Bu örnek güzel çalışıyor hocam
#include "stm32f10x.h"                  // Device header
//#include <stdio.h>
 

unsigned temp;

void ADC1_2_IRQHandler(void)
{
   
	 if(ADC1->SR & 0x00000002)
	{
		ADC1->SR=0; // adc bayrağını temizle
	        temp =ADC1->DR;
	}
        
	
}
int main(void)
{
	
	
	RCC->APB2ENR |= 0x00000004; // IO port A clock enable
        GPIOA->CRL &= ~0x000000C0;	// 14MHz
	RCC->CFGR |= 0x0000C000; //ADCPRE: ADC prescaler /11: PCLK2 divided by 8
	RCC->APB2ENR |= 0x00000200 ; //ADC1EN: ADC 1 interface clock enable     
	NVIC->ISER[0] |= 0x00040000; 
	ADC1->SMPR2 =0x00000008;//001: 7.5 cycles
	ADC1->CR1 = 0x00000020;//Bit 5 EOCIE: Interrupt enable for EOC
	
	
	//111: SWSTART //1: Enable ADC and to start conversion//1: Conversion on external event enabled //1: Continuous conversion mode
	ADC1->CR2 = (1<<17) |(1<<18) |(1<<19) | (1<<0) | (1<<20) | (1<<1); 
	
	ADC1->SQR1 = 0x00000000;
	ADC1->SQR2 = 0x00000000;
	ADC1->SQR3 = 0x00000001; //1st conversion in regular sequence
	
 
	ADC1->CR2 |= 0x00400000;//1: Starts conversion of regular channels
	while(1)
	{
		
		    
	}
}

Emre_Tuncay_

Dediginiz kodu denedim ama bende güzel çalışmadı değer hep 1962 de takılı kalıyor.Acaba benim clock ayarlarındamı bir sorun var 8mhz'de çalıştırıyorum işlemciyi.

Emre_Tuncay_

Sorunu çözdüm tamamen benim acemiliğim bu uygulamayı yapmamın nedeni kullanılan registerların ne işe yaradıkları değiştirildiklerinde nasıl değişiklikler olur onu görmekti.
Hatam ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; Satırını DISABLE yapmam tabi böyle yapınca ADC sürekli çalışmıyor bunu düzeltince sürekli çalışmaya başladı.