Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: ali.bayuk - 21 Haziran 2014, 16:38:10

Başlık: STM32F0 ADC sorunu
Gönderen: ali.bayuk - 21 Haziran 2014, 16:38:10
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++);
    }
}
 
Başlık: Ynt: STM32F0 ADC sorunu
Gönderen: 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.
Başlık: Ynt: STM32F0 ADC sorunu
Gönderen: tekosis - 23 Haziran 2014, 20:54:24
Hocam keşke anlasam da yazsam yardımcı olabilsem. kolay gelsin...
Başlık: Ynt: STM32F0 ADC sorunu
Gönderen: muhittin_kaplan - 23 Haziran 2014, 23:58:52
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 ?
Başlık: Ynt: STM32F0 ADC sorunu
Gönderen: CLR - 24 Haziran 2014, 00:24:03
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.
Başlık: Ynt: STM32F0 ADC sorunu
Gönderen: muhittin_kaplan - 24 Haziran 2014, 01:47:01
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);
Başlık: Ynt: STM32F0 ADC sorunu
Gönderen: ali.bayuk - 24 Haziran 2014, 17:02:07
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.
Başlık: Ynt: STM32F0 ADC sorunu
Gönderen: muhittin_kaplan - 24 Haziran 2014, 17:20:17
Kendi internal temp sensoru okumak mi istiyorsun
Başlık: Ynt: STM32F0 ADC sorunu
Gönderen: ali.bayuk - 24 Haziran 2014, 17:24:44
evet @muhittin_kaplan hocam öyle bir başlangıç yapayım dedim
Başlık: Ynt: STM32F0 ADC sorunu
Gönderen: muhittin_kaplan - 24 Haziran 2014, 18:10:12
http://www.embedds.com/introducing-to-stm32-adc-programming-part2/ (http://www.embedds.com/introducing-to-stm32-adc-programming-part2/)
Başlık: Ynt: STM32F0 ADC sorunu
Gönderen: ali.bayuk - 24 Haziran 2014, 20:30:04
@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.