реклама на сайте
подробности

 
 
> ADC, LPC29xx
toweroff
сообщение Feb 23 2012, 11:37
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



LPC2929, ADC0

Что-то не пойму, выдает 0 на выходе.
Вход сам никуда не подключен, хочу посмотреть, как "шумит" разряд 0

Подскажите, как правильно его инициализировать и использовать без прерывания? Подозреваю, что тут-то собака и порылась...

Пока сделано так:

Код
void ADC0_Stop( void )
{
  /* if in continuous mode and conversion is progress,
  wait until it finishes. */
  while ( (ADC0_STATUS & 0x01)&&(ADC0_CONFIG & 0x01) );        
  ADC0_CTRL = (0x01<<1);
  return;
}


Код
U32 ADC0_Get_Value( void )
{
U32 regVal;
    ADC0_Start();

    while (ADC0_STATUS & 0x01);        

    regVal = (ADC0_ACD5 & 0x3FF);

    ADC0_Stop();

    //ADC0_CTRL = (0x01<<1);

    return regVal;
    
}


Код
// Init
void ADC0_Init( void )
{
U32 regVal = 0;

    ADC0_Stop();

    CGU_FDIV_CONF1 = (0x02<<24)|(1<<12)|(26<<0);
    /* Make sure FDIV1 is present. */
    while ( !(CGU_RDET & (0x01<<6)) );
    /* Configure the ADC clock to 32kHz (FDIV1/4)*/
    ADC_CLK_CONF = CLK_SEL_PLL_FDIV1 | AUTOBLK | DIV1;        /* For ADC */
    

    ADC0_ACC0 = 0x0A;            /* AD1 channel 0~7 are 10-bit resolution */

    regVal = ADC0_CONFIG;
    regVal &= ~(0x01<<0);            /* single scan. */
  
    /* Positive and negative edge of MSCSS timer(START3). */
    ADC0_CONFIG = regVal | (1<<15);// | (1<<14);

  return;
}


Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
mempfis_
сообщение Feb 24 2012, 06:39
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



lpc2368, взял из примеров

CODE
#ifndef adc_h
#define adc_h

#define PCADC (1ul<<12) //бит разрешения тактирования
#define PINSEL_ADC0 (0x1ul<<14) //настройка PINSEL1 для ADC0
#define PINMODE_ADC0_MSK (3ul<<14)
#define PINMODE_ADC0_PU_PD_OFF (2ul<<14)

//-------------------------------------------
//делитель тактовой частоты
#define PCLK_ADC_div4 (0ul<<24)
#define PCLK_ADC_div1 (1ul<<24)
#define PCLK_ADC_div2 (2ul<<24)
#define PCLK_ADC_div8 (3ul<<24)

#define PCLK_ADC_div PCLK_ADC_div1
#define Fcclk_ADC_div 1ul
//-------------------------------------------


#define ADC_INTERRUPT_FLAG 1 /* 1 is interrupt driven, 0 is polling */

#define ADC_OFFSET 0x10
#define ADC_INDEX 4

#define ADC_DONE 0x80000000
#define ADC_OVERRUN 0x40000000
#define ADC_ADINT 0x00010000

#define ADC_NUM 8 /* for LPC23xx */
#define ADC_CLK 1000000 /* set to 1Mhz */

#define Vref 3030 //mV


#endif //adc_h


CODE
//-----------------------------------
//процедура конфигурирования ADC
void ConfigureADC( unsigned int ADC_Clk )
{
//включаем тактирование ADC
PCONP |= PCADC;

//определяем делитель тактовой частоты adc
if(PCLK_ADC_div == 0)
{
PCLKSEL0 &= ~PCLK_ADC_div;
}
else
{
PCLKSEL0 |= PCLK_ADC_div;
}

//настройка pinsel/pinmode adc0
PINSEL1 |= PINSEL_ADC0;
PINMODE1 &= ~PINMODE_ADC0_MSK; //
PINMODE1 |= PINMODE_ADC0_PU_PD_OFF; //отключаем все подтягивающие резисторы

//натройка делителя тактовой частоты на 1МГц
AD0CR = ( 0x01 << 0 ) | /* SEL=1,select channel 0~7 on ADC0 */
( ( (Fcclk/Fcclk_ADC_div) / ADC_Clk - 1 ) << 8 ) | /* CLKDIV = Fpclk / 1000000 - 1 */
( 0 << 16 ) | /* BURST = 0, no BURST, software controlled */
( 0 << 17 ) | /* CLKS = 0, 11 clocks/10 bits */
( 1 << 21 ) | /* PDN = 1, normal operation */
( 0 << 22 ) | /* TEST1:0 = 00 */
( 0 << 24 ) | /* START = 0 A/D conversion stops */
( 0 << 27 ); /* EDGE = 0 (CAP/MAT singal falling,trigger A/D conversion) */
}
//-----------------------------------

//-----------------------------------
unsigned int ADC0Read( unsigned int channelNum )
{
unsigned int regVal, ADC_Data;

/* channel number is 0 through 7 */
if ( channelNum >= ADC_NUM )
{
channelNum = 0; /* reset channel number to 0 */
}
AD0CR &= 0xFFFFFF00;
AD0CR |= (1 << 24) | (1 << channelNum);
/* switch channel,start A/D convert */


while ( 1 ) /* wait until end of A/D convert */
{
regVal = ADDR0;

/* read result of A/D conversion */
if ( regVal & ADC_DONE )
{
break;
}
}

AD0CR &= 0xF8FFFFFF; /* stop ADC now */
if ( regVal & ADC_OVERRUN ) /* save data when it's not overrun, otherwise, return zero */
{
return ( 0 );
}

ADC_Data = ( regVal >> 6 ) & 0x3FF;
return ( ADC_Data ); /* return A/D conversion value */
}
//-----------------------------------


Работает в нескольких проектах без нареканий.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Feb 24 2012, 15:35
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(mempfis_ @ Feb 24 2012, 10:39) *
lpc2368, взял из примеров

и как оно с моим камнем ?
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Feb 24 2012, 15:56
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(toweroff @ Feb 24 2012, 18:35) *
и как оно с моим камнем ?


Упс. Сорри. И правда абсолютно разные камни. Могу скинуть пример из IAR5.40 ADC в lpc2919. Но там пример по прерываниям.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Feb 24 2012, 18:10
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(mempfis_ @ Feb 24 2012, 19:56) *
Упс. Сорри. И правда абсолютно разные камни. Могу скинуть пример из IAR5.40 ADC в lpc2919. Но там пример по прерываниям.

кодбандл и у меня есть... даже есть MCB2900
вот только CD от нее протерял sad.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 13:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01385 секунд с 7
ELECTRONIX ©2004-2016