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

 
 
 
Reply to this topicStart new topic
> Не работает ADC LPC2478
sherr
сообщение Aug 19 2009, 18:48
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 257
Регистрация: 10-06-06
Из: Ставрополь
Пользователь №: 17 955



Не работает ADC LPC2478 -- при попытке опросить канал выдаёт набор чисел типа 512,896,960,512.....,
не зависящий от выбора канала и значения PINSEL. Привожу код инициализации(укороченный из Keil-
овского примера, перепроверен по даташиту дважды ...
Код
#include "LPC23xx.h"                        /* LPC23xx definitions */
#include "type.h"
#include "adc.h"

volatile DWORD ADC0Value[ADC_NUM];
volatile DWORD ADC0IntDone = 0;


/*****************************************************************************
** Function name:        ADCInit
**
** Descriptions:        initialize ADC channel
**
** parameters:            ADC clock rate
** Returned value:        true or false
**
*****************************************************************************/
ADC_INIT( DWORD ADC_Clk )
{
  /* Enable CLOCK into ADC controller */
  PCONP |= (1 << 12);


  AD0CR = ( 0x01 << 0 ) |     /* SEL=1,select channel 0~7 on ADC0 */
        ( ( 18000000 / 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) */

  
}

/*****************************************************************************
** Function name:        ADC0Read
**
** Descriptions:        Read ADC0 channel
**
** parameters:            Channel number
** Returned value:        Value read, if interrupt driven, return channel #
**
*****************************************************************************/
DWORD ADC_READ( BYTE channelNum )
{

  DWORD 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 = *(volatile unsigned long *)(AD0_BASE_ADDR
            + ADC_OFFSET + ADC_INDEX * channelNum);
    /* read result of A/D conversion */
    if ( regVal & ADC_DONE )
    {
      break;
    }
  }    
        
  AD0CR &= 0xF8FFFFFF;    /* stop ADC now */    

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

}
Тоже присоединяю в архиве вместе с adc.h .

Неужели спалил ADC, или я чего-то не заметил в коде,
кстати PINSEL выбирается в основной программе. wassat.gif wassat.gif
Прикрепленные файлы
Прикрепленный файл  200809.ZIP ( 1.59 килобайт ) Кол-во скачиваний: 14
 
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Aug 19 2009, 19:00
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(sherr @ Aug 19 2009, 21:48) *
Не работает ADC LPC2478 ...
PCONP |= (1 << 12);
AD0CR = ( 0x01 << 0 ) | /* SEL=1,select channel 0~7 on ADC0 */
( ( 18000000 / 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) */

Судя по стилю ... проверяйте дальше. Что, воспользоваться хэдером с человеческими определениями религия не позволяет?

/* A/D Control Register */
typedef struct{
__REG32 SEL : 8;
__REG32 CLKDIV : 8;
__REG32 BURST : 1;
__REG32 CLKS : 3;
__REG32 : 1;
__REG32 PDN : 1;
__REG32 : 2;
__REG32 START : 3;
__REG32 EDGE : 1;
__REG32 : 4;
} __adcr_bits;


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
sherr
сообщение Aug 19 2009, 20:11
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 257
Регистрация: 10-06-06
Из: Ставрополь
Пользователь №: 17 955



Хороший хидер, спасибо. И всё же, ...
Go to the top of the page
 
+Quote Post
sherr
сообщение Aug 21 2009, 16:53
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 257
Регистрация: 10-06-06
Из: Ставрополь
Пользователь №: 17 955



Подскажите пожалуйста как можно проверить жив ли АЦП физически или хотя бы дайте заведомо рабочий кусочек кода инициализа-
ции + измерение ( user manual в этой части смотрел многократно, крамолы в коде не нашел), нужно решить вопрос о необходимости
замены контроллера ну или ваяния внешнего контроллера TS на AtMega 8 или чем-то подобном sad.gif sad.gif
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Aug 21 2009, 18:49
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(sherr @ Aug 21 2009, 19:53) *
Подскажите пожалуйста как можно проверить жив ли АЦП физически ...

В ИАР АРМ есть много примеров, в том числе и рабочий пример для LPC2478.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post

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

 


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


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