Перейти к содержанию
    

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

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

простой код:

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

 

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

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

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

post-28763-1313926766_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так же можно было изменять режимы работы ADC и разные периоды оцифровки.

 

Пробовал. На "гличи" это не влияло.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, я уже понял что этот проц какой-то недоделанный :(

Причем LPC2368 работает без нареканий...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

LPC1778 тоже вроде не глючит (в смысле АЦП)...

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А где сентябрьская? :smile3046:

 

на сайте вижу

English LPC176x Errata Sheet V9 (Jun 1, 2011)

Или NXP как всегда тормозят с обновлением ссылок?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...