Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

STM32F0 ADC sorunu

Başlatan ali.bayuk, 21 Haziran 2014, 16:38:10

ali.bayuk

Arkadaşlar merhaba,
STM32F0 discovery kiti üzerinde program yazmaya çalışıyorum ve ADC konusunda bir sıkıntı yaşıyorum. CoIDE 1.7.6 kullanıyorum. okuma yaptığımda değerlerim hep 4095 geliyor. ARM konusunda bilgili olmadığımdan yorum yapamadım. Nerede yanlış yapıyor olabilirim, yardımcı olursanız sevinirim. Kolay Gelsin.

#include <stdint.h>
#include <system_stm32f0xx.h>
#include <stm32f0xx_gpio.h>
#include "stm32f0xx.h"
#include "stm32f0xx_adc.h"
#include "stm32f0xx_dma.h"
#include "stm32f0xx_rcc.h"
#include <stm32f0xx_usart.h>
#include <stm32f0xx_misc.h>

#define ADC1_DR_Address 0x40012440

uint32_t TempSensVoltmv = 0, VrefIntVoltmv = 0;
uint16_t RegularConvData_Tab[2];

void uart_send_char(char chr);
void uart_send_string(unsigned char *string);

void USART2_IRQHandler(void)
{
	char temp;
	temp=USART_ReceiveData(USART2);
	uart_send_char(temp);
}

void uart_send_char(char chr)
{
	while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
	USART_SendData(USART2, chr);
}

void uart_send_string(unsigned char *string)
{
    while(*string)
    {
    	uart_send_char(*string);
        *string++;
    }
}

int main(void)
{
	uint32_t times;
	char str[20];

	ADC_InitTypeDef     ADC_InitStructure;
	DMA_InitTypeDef     DMA_InitStructure;
	USART_InitTypeDef 	USART_InitStructure;
	GPIO_InitTypeDef 	GPIO_InitStructure;
	NVIC_InitTypeDef 	NVIC_InitStruct;
	/*rcc ayrlarıe*************************************/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
	/*gpio ayarları************************************/
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	/*usart ayarları***********************************/
	USART_InitStructure.USART_BaudRate = 115200;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_Init(USART2, &USART_InitStructure);
	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
	/*kesme ayarları***********************************/
	NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStruct);
	/******************************************************/
	USART_Cmd(USART2,ENABLE); //usart2 aktif et
	/******************************************************/
	ADC_DeInit(ADC1);
	/*dma ayarları*****************************************/
	DMA_DeInit(DMA1_Channel1);
	DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;
	DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)RegularConvData_Tab;
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
	DMA_InitStructure.DMA_BufferSize = 2;
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
	DMA_InitStructure.DMA_Priority = DMA_Priority_High;
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
	DMA_Init(DMA1_Channel1, &DMA_InitStructure);

	DMA_Cmd(DMA1_Channel1, ENABLE);

	ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
	ADC_DMACmd(ADC1, ENABLE);
	/*adc ayarları******************************************/
	ADC_StructInit(&ADC_InitStructure);
	ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
	ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward;
	ADC_Init(ADC1, &ADC_InitStructure);

	ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor , ADC_SampleTime_55_5Cycles);
	ADC_TempSensorCmd(ENABLE);

	ADC_ChannelConfig(ADC1, ADC_Channel_Vrefint , ADC_SampleTime_55_5Cycles);
	ADC_VrefintCmd(ENABLE);

	ADC_GetCalibrationFactor(ADC1);
	ADC_Cmd(ADC1, ENABLE);

	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
	ADC_StartOfConversion(ADC1);

	while(1)
    {
	    while((DMA_GetFlagStatus(DMA1_FLAG_TC1)) == RESET );
	    DMA_ClearFlag(DMA1_FLAG_TC1);

//	    TempSensVoltmv = (uint32_t)((RegularConvData_Tab[0]* 3300) / 0xFFF);
//	    VrefIntVoltmv  = (uint32_t)((RegularConvData_Tab[1]* 3300) / 0xFFF);

	    TempSensVoltmv = RegularConvData_Tab[0];
	    VrefIntVoltmv  = RegularConvData_Tab[1];

	    uart_send_string("----------------------\r\n");
	    sprintf(str,"Sicaklik: \t%d\r\n",TempSensVoltmv);
		uart_send_string(str);

	    sprintf(str,"VRef: \t\t%d\r\n",VrefIntVoltmv);
		uart_send_string(str);
		uart_send_string("----------------------\r\n");
		for(times = 0; times < 5000000; times++);
    }
}
 

ali.bayuk

arkadaşlar sanırım kimse bir hata göremedi. ben biraz daha uğraşayım bulabilirsem hatayı burada da paylaşırım.

tekosis

Hocam keşke anlasam da yazsam yardımcı olabilsem. kolay gelsin...
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

muhittin_kaplan

Ali Hocam, Kodlarında Usart felanda var, İlk Etapta Salt ADCyapsan ve Debugda Takip Etsen Daha iyi olu hem hatayı bulmanda yardımcı olur.
birde neden pinler PU durumda ?

CLR

Alıntı yapılan: ali.bayuk - 23 Haziran 2014, 16:03:14
arkadaşlar sanırım kimse bir hata göremedi. ben biraz daha uğraşayım bulabilirsem hatayı burada da paylaşırım.

Analog portun gpio ayarlarını yapmamışsın, 2 tane port tanımlamışsın ikiside çıkış, hangi porta temperature sensör bağladıysan o portu analog input olarak tanımlaman lazım. Temp sensör board üzerinde ise, örnek programlar içinde gpio tanımlamaları vardır.
Knowledge and Experience are Power

muhittin_kaplan

hocam şurada AF yapmış gibi geldi bana ama,
okadar karmaşanın içinde gözümden de kaçmış olabilir. (orayına neden AF yapmış AIN olmalıydı sanırım)

GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

ali.bayuk

merhaba,

iki pin tanımladım ikiside AF çünkü onlar seri iletişim için.
Analogdan okumaya çalıştığım değerler mikrodenetleyicinin kendi içindeki sıcaklık sensörleri ve vref voltajı. bunları tamamen Coide nin kendi adc örneğinden aldım.
ayrıca sadece analog ölçmeye  çalıştığımda da debug ekranında aynı değerleri görüyorum yani 4095 max değeri.

cevaplarınız için teşekkür ederim, sorunu bulabilirsem paylaşırım.
iyi günler dilerim.

muhittin_kaplan

Kendi internal temp sensoru okumak mi istiyorsun

ali.bayuk

evet @muhittin_kaplan hocam öyle bir başlangıç yapayım dedim


ali.bayuk

@muhittin_kaplan hocam, verdiğiniz linkide inceledim. sizdeki stmf1 serisi için örnek, en benzer halini yaptım yinede olmadı. daha sonra st nin kendi kütüphanesini denedim onda da max değer gördüm. zannediyorum donanımsal bir sıkıntım var. yardımlarınız için teşekkür ederim.

kolay gelsin.