Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: АЦП в LPC1768
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Allregia
возникала непонятка с burst режимом в LPC1768:
включен 1 вход, подключенный к потенциометру, данные с его регистра рещультата переписываются в ЦАП.
Кручу потенциометр и смотрю осциллографом выход ЦАПа - там все меняется о 0 до 3в, но - периодически проскакивают ипульсы, то вверх то вниз, колеблящейся амплитуды, доходящей до 0 и до питания.
Если ставлю потенциометр в 0, то на выходе ЦАПа ноль, с положительными импульсами, если ставлю потенциометр в макс - на вхыоде 3в и импульсами до нуля (не всегда. амплитуд дрожит).
Длительность импульсов около 8мкс.
Про работает на 100мгц, частота периферии вся 1/4. В программе работает только прерывание SysTick и мертвый цикл в мейне:
Код такой:
Код
//------------------------------------------------------------------------------
void ADC_Init (void) {

  LPC_PINCON->PINSEL3 &= ~(3UL<<30);               /* P1.31 is GPIO */
  LPC_PINCON->PINSEL3 |=  (3UL<<30);               /* P1.31 is AD0.5 */

  LPC_SC->PCONP       |=  (1<<12);               /* Enable power to ADC block */

  LPC_ADC->ADCR        =  (1<< 5) |              /* select AD0.5 pin */
                                    (4<< 8) |              /* ADC clock is 25MHz */
                                    (1<<16) |              // burst  mode
                                    (1<<21);               /* enable ADC */
}
//--------------------------------------------------------------------------------
void DAC_Init(void){
      LPC_PINCON->PINSEL1 |= (2UL<<20);    /* set p0.26 to DAC output */  
      LPC_DAC->DACCTRL |=(1<<1); // dowble buffer  
}
//--------------------------------------------------------------------------------
int main(void){
  if (SysTick_Config(SystemCoreClock / 1000)) { // Setup SysTick Timer for 1 msec interrupts  
    while (1);                                  // Capture error
  }
  
  halPORTS_Config(); // конфигурирование портов
  DAC_Init();
  ADC_Init();
  while(1){
    LPC_DAC->DACR = 0xFFC0 & LPC_ADC->ADDR5;
  }
}


Да, в периоде этих пичков я никакой закономерности не увидел.
Проблема точно в АЦП, т.к. если я просто постоянно пишщу в ЦАП констанку, то на выходе пичков нет.
Возможно это из-за асинхронного (по сравнению с конверсией) чтения регистра результата АЦП, но тогда я не очень понимаю как барст должен работать. Я полагал что его можно читать в произвольный момент времени.
scifi
Кажется, это уже обсуждалось: треск АЦП LPC1768.
Allregia
Барст оказался не причем: когда я его убрал (не устанавливаю 16-й бит в конциге АЦП), а сделал вручную:
Код
  while(1){
    LPC_ADC->ADCR |=  (1<<24);                     /* start conversion */
    while (!(LPC_ADC->ADGDR & (1UL<<31)));         /* Wait for Conversion end */
    LPC_DAC->DACR = LPC_ADC->ADGDR &0xFFC0;
    LPC_ADC->ADCR &= ~(7<<24);                     /* stop conversion */
  }


Получил те-же импульсы!

Цитата
Кажется, это уже обсуждалось: треск АЦП LPC1768.


Спасибо, сейчас почитаю.

Почитал. Так что, получается это глюк этого процессора, и его АЦП вообще нельзя пользоваться, если не фильтровать эти глитчи?!
Allregia
Чтобы убрать эти глитчи, написал вот такой медианнный фильтр по 3-м точкам. Но может мжно как-то проще?

Код
uint32_t Med(uint32_t D){
static uint32_t DataArray[3]={0,0,0};
uint32_t Res,Max, Min,MaxV, MinV,i;

   Res=0;
   Max=Min=0;
   DataArray[2]=D;
   MaxV=DataArray[Max];
   MinV=DataArray[Min];
   for(i=1;i<3;i++){ // search max/min
      if(DataArray[i]>MaxV){
         Max=i; MaxV=DataArray[i];
      }
      if(DataArray[i]<MinV){
       Min=i;  MinV=DataArray[i];
      }
   }

  for(i=0;i<3;i++){  // select index not equal to Min or Max
    if((i!=Min)&&(i!=Max)){
      Res=i; break;
    }
  }
  DataArray[0]=DataArray[1];
  DataArray[1]=DataArray[2];
  return DataArray[Res];
}
Allregia
Народ, ну помогите-же кто-нибудь!

простой код:
Код
  while(1){
    while (!((Res=LPC_ADC->ADDR5) & (1UL<<31)));         // Wait for Conversion end
    LPC_DAC->DACR = Res &0xFFC0;
}


Потоенциометр на входе АЦП стоит на нуле, что на выходе ЦАПа - видно на фотке.
Медианный фильтр что я привел выше - не помогает.
Ну я уже не знаю что делать!!!
Allregia
В итоге, решили от LPC1768 в окончательной версии продукта избавится, поставим PIC32.
На надежность и качество изделий Микрочипа вроде никогда нареканий небыло.
Porty
опыт показал что это ошибка внутреннего устройства контроллера, где то результат либо не защелкивается либо мультипликсируется как попало. Но если подшаманить настройками никак не влияющими на ADC, например скоростью SPI то можно получить гарантированную работоспособность ADC на разных кристаллах в разных условиях с полным циклом испытаний (климатика, е-м совместимость и тд). Как побобрать - мы подбирали наугад. Просто брали например настройки делителя SPI и повышали или понижали скорость благо запас был. При этом всё стабильно работало, как бы не дорабатывай программу алгоритмически не изменяя скорости работы переферии и частот. Так же можно было изменять режимы работы ADC и разные периоды оцифровки.
Allregia
Цитата
Так же можно было изменять режимы работы ADC и разные периоды оцифровки.


Пробовал. На "гличи" это не влияло.
Porty
насчёт стабильности у LPC1768 проблемы не только с АЦП а вообще с любым внешним интерфейсом, как оказалось что захват значения таймера по фронту сигнала очень сильно глючит если этот фронт имеет время нарастания/спада более 1нс и тд. А так же с SPI - выхода SPI имеют время нарастания и спада от 5 до 10нс что очень плохо для FPGA без входов шмитта ибо у них быстродействие сотни МГц и приводит к ложному клоку во время перехода в области неопределённого состояния.
Тут сам чип весьма неудачный. но если нужно дёшево то в принципе фильтрами обвешать реально возможно и всё будет стабильно работать.
Allregia
Да, я уже понял что этот проц какой-то недоделанный sad.gif
HARMHARM
Цитата(Allregia @ Aug 26 2011, 20:08) *
Да, я уже понял что этот проц какой-то недоделанный sad.gif

Причем LPC2368 работает без нареканий...
Axel
LPC1778 тоже вроде не глючит (в смысле АЦП)...
HARMHARM
Цитата(Axel @ Sep 13 2011, 10:57) *
LPC1778 тоже вроде не глючит (в смысле АЦП)...

Возможно. Зато errata по RTC и USB Host убивает наповал.
А в свежей сентябрьской errata добавили еще и ограничение по скорости ISP 57600. Фантастика.
Alechek
А где сентябрьская? smile3046.gif

на сайте вижу
Цитата
English LPC176x Errata Sheet V9 (Jun 1, 2011)

Или NXP как всегда тормозят с обновлением ссылок?
HARMHARM
Нашел случайно через гугль тут.
Altemir
Цитата(HARMHARM @ Sep 18 2011, 18:51) *
Возможно. Зато errata по RTC и USB Host убивает наповал.

По RTC, как понимаю, проблема в потере одной секунды на тысячу циклов включения/выключения? Решение через RC-цепочку лечит, вроде. Не пробовали? В целом камнем LPC177x довольны? Правильно ли я понял, что предельная частота SDRAM-контроллера 80МГц?

P.S. Прошу прощения, что вклинился в тему, но ради пары вопросов отдельный топик создавать не стал.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.