Jump to content

    
Sign in to follow this  
Allregia

АЦП в LPC1768

Recommended Posts

возникала непонятка с 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;
  }
}

 

Да, в периоде этих пичков я никакой закономерности не увидел.

Проблема точно в АЦП, т.к. если я просто постоянно пишщу в ЦАП констанку, то на выходе пичков нет.

Возможно это из-за асинхронного (по сравнению с конверсией) чтения регистра результата АЦП, но тогда я не очень понимаю как барст должен работать. Я полагал что его можно читать в произвольный момент времени.

Share this post


Link to post
Share on other sites

Барст оказался не причем: когда я его убрал (не устанавливаю 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.

 

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

 

Почитал. Так что, получается это глюк этого процессора, и его АЦП вообще нельзя пользоваться, если не фильтровать эти глитчи?!

Share this post


Link to post
Share on other sites

Чтобы убрать эти глитчи, написал вот такой медианнный фильтр по 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];
}

Share this post


Link to post
Share on other sites

Народ, ну помогите-же кто-нибудь!

 

простой код:

  while(1){
    while (!((Res=LPC_ADC->ADDR5) & (1UL<<31)));         // Wait for Conversion end
    LPC_DAC->DACR = Res &0xFFC0;
}

 

Потоенциометр на входе АЦП стоит на нуле, что на выходе ЦАПа - видно на фотке.

Медианный фильтр что я привел выше - не помогает.

Ну я уже не знаю что делать!!!

post-28763-1313926766_thumb.jpg

Share this post


Link to post
Share on other sites

В итоге, решили от LPC1768 в окончательной версии продукта избавится, поставим PIC32.

На надежность и качество изделий Микрочипа вроде никогда нареканий небыло.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

насчёт стабильности у LPC1768 проблемы не только с АЦП а вообще с любым внешним интерфейсом, как оказалось что захват значения таймера по фронту сигнала очень сильно глючит если этот фронт имеет время нарастания/спада более 1нс и тд. А так же с SPI - выхода SPI имеют время нарастания и спада от 5 до 10нс что очень плохо для FPGA без входов шмитта ибо у них быстродействие сотни МГц и приводит к ложному клоку во время перехода в области неопределённого состояния.

Тут сам чип весьма неудачный. но если нужно дёшево то в принципе фильтрами обвешать реально возможно и всё будет стабильно работать.

Share this post


Link to post
Share on other sites
LPC1778 тоже вроде не глючит (в смысле АЦП)...

Возможно. Зато errata по RTC и USB Host убивает наповал.

А в свежей сентябрьской errata добавили еще и ограничение по скорости ISP 57600. Фантастика.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this