Allregia 0 Posted August 18, 2011 · Report post возникала непонятка с 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; } } Да, в периоде этих пичков я никакой закономерности не увидел. Проблема точно в АЦП, т.к. если я просто постоянно пишщу в ЦАП констанку, то на выходе пичков нет. Возможно это из-за асинхронного (по сравнению с конверсией) чтения регистра результата АЦП, но тогда я не очень понимаю как барст должен работать. Я полагал что его можно читать в произвольный момент времени. Quote Ответить с цитированием Share this post Link to post Share on other sites
scifi 0 Posted August 18, 2011 · Report post Кажется, это уже обсуждалось: треск АЦП LPC1768. Quote Ответить с цитированием Share this post Link to post Share on other sites
Allregia 0 Posted August 18, 2011 · Report post Барст оказался не причем: когда я его убрал (не устанавливаю 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. Спасибо, сейчас почитаю. Почитал. Так что, получается это глюк этого процессора, и его АЦП вообще нельзя пользоваться, если не фильтровать эти глитчи?! Quote Ответить с цитированием Share this post Link to post Share on other sites
Allregia 0 Posted August 19, 2011 · Report post Чтобы убрать эти глитчи, написал вот такой медианнный фильтр по 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]; } Quote Ответить с цитированием Share this post Link to post Share on other sites
Allregia 0 Posted August 21, 2011 · Report post Народ, ну помогите-же кто-нибудь! простой код: while(1){ while (!((Res=LPC_ADC->ADDR5) & (1UL<<31))); // Wait for Conversion end LPC_DAC->DACR = Res &0xFFC0; } Потоенциометр на входе АЦП стоит на нуле, что на выходе ЦАПа - видно на фотке. Медианный фильтр что я привел выше - не помогает. Ну я уже не знаю что делать!!! Quote Ответить с цитированием Share this post Link to post Share on other sites
Allregia 0 Posted August 23, 2011 · Report post В итоге, решили от LPC1768 в окончательной версии продукта избавится, поставим PIC32. На надежность и качество изделий Микрочипа вроде никогда нареканий небыло. Quote Ответить с цитированием Share this post Link to post Share on other sites
porty 0 Posted August 23, 2011 · Report post опыт показал что это ошибка внутреннего устройства контроллера, где то результат либо не защелкивается либо мультипликсируется как попало. Но если подшаманить настройками никак не влияющими на ADC, например скоростью SPI то можно получить гарантированную работоспособность ADC на разных кристаллах в разных условиях с полным циклом испытаний (климатика, е-м совместимость и тд). Как побобрать - мы подбирали наугад. Просто брали например настройки делителя SPI и повышали или понижали скорость благо запас был. При этом всё стабильно работало, как бы не дорабатывай программу алгоритмически не изменяя скорости работы переферии и частот. Так же можно было изменять режимы работы ADC и разные периоды оцифровки. Quote Ответить с цитированием Share this post Link to post Share on other sites
Allregia 0 Posted August 23, 2011 · Report post Так же можно было изменять режимы работы ADC и разные периоды оцифровки. Пробовал. На "гличи" это не влияло. Quote Ответить с цитированием Share this post Link to post Share on other sites
porty 0 Posted August 23, 2011 · Report post насчёт стабильности у LPC1768 проблемы не только с АЦП а вообще с любым внешним интерфейсом, как оказалось что захват значения таймера по фронту сигнала очень сильно глючит если этот фронт имеет время нарастания/спада более 1нс и тд. А так же с SPI - выхода SPI имеют время нарастания и спада от 5 до 10нс что очень плохо для FPGA без входов шмитта ибо у них быстродействие сотни МГц и приводит к ложному клоку во время перехода в области неопределённого состояния. Тут сам чип весьма неудачный. но если нужно дёшево то в принципе фильтрами обвешать реально возможно и всё будет стабильно работать. Quote Ответить с цитированием Share this post Link to post Share on other sites
Allregia 0 Posted August 26, 2011 · Report post Да, я уже понял что этот проц какой-то недоделанный :( Quote Ответить с цитированием Share this post Link to post Share on other sites
HARMHARM 0 Posted August 28, 2011 · Report post Да, я уже понял что этот проц какой-то недоделанный :( Причем LPC2368 работает без нареканий... Quote Ответить с цитированием Share this post Link to post Share on other sites
Axel 0 Posted September 13, 2011 · Report post LPC1778 тоже вроде не глючит (в смысле АЦП)... Quote Ответить с цитированием Share this post Link to post Share on other sites
HARMHARM 0 Posted September 18, 2011 · Report post LPC1778 тоже вроде не глючит (в смысле АЦП)... Возможно. Зато errata по RTC и USB Host убивает наповал. А в свежей сентябрьской errata добавили еще и ограничение по скорости ISP 57600. Фантастика. Quote Ответить с цитированием Share this post Link to post Share on other sites
Alechek 0 Posted September 19, 2011 · Report post А где сентябрьская? :smile3046: на сайте вижу English LPC176x Errata Sheet V9 (Jun 1, 2011) Или NXP как всегда тормозят с обновлением ссылок? Quote Ответить с цитированием Share this post Link to post Share on other sites
HARMHARM 0 Posted September 19, 2011 · Report post Нашел случайно через гугль тут. Quote Ответить с цитированием Share this post Link to post Share on other sites