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

TU-104

Участник
  • Постов

    76
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о TU-104

  • Звание
    Частый гость
    Частый гость
  • День рождения 03.09.1984

Контакты

  • Сайт
    Array
  • ICQ
    Array
  1. А кто-нибудь использует в sam-e70 sdram контроллер и внешнюю память? В новых даташитах вырезано всё, что связано с ней. Кто-то проверял новые чипы? Это только в документах вырезали, чтоб ошибки не исправлять или прям всё, кристалл переразвели.
  2. Может, пошагово прерывания отключены, а в нормальном режиме срабатывают и вызывают фолт?
  3. Купить новых с десяток и не париться. Будет даже дешевле, чем контроллер покупать в чипдипе
  4. 1. Ничего вроде не поменялось 3. Что-то поменялось, немного "собраннее" что ли стал разброс, но все равно большой 2(не совсем п.2). Пока L3 был закорочен, просто приложил большой электролит на VDDOUT
  5. Из спецификации демо: BLM18PG471SN1D 6 L200,L201.... Murata IND FER BEAD 470 OHM@100MHZ 1A 25% 0603 У нас то же самое (хотя на 100% не уверен, куплено по документам BLM18PG471SN1D ). Демо-платы пока нет под рукой Да, на демо-плате такой же эффект
  6. Вот этот же кусок с их демо-платы Там как раз стоят X7R, X5R C200, C201,C202..C214 921,C922 Murata CAP,100NF,+/-10%,X7R,16V,SMD0402 C215 YAGEO CAP,1UF,+/-10%,X5R,10V,SMD0402
  7. Так LDO там встроенный (выход VDDOUT 1.2В), вот из даташита кусок а что не так с X5R на столе в комнатных условиях?
  8. Спасибо за наводку! Выкладываю результаты. Начальное состояние такое, измерял так (): Дальше подписано, 10 мкФ на VDDOUT Лучший результат 30мкФ на VDDPLL Но по даташиту и на демо-доске там только 0.1 мкФ. Вдруг оно(ядро или LDO) потом будет нестабильно запускаться?
  9. вроде как все выводы увешаны ими, примерно одинаково PLL|USBPLL. Даже usbpll без дросселя напрямую к +3.3В Добавил 10uF X5R на VDDPLL, и правда стало лучше
  10. Перепроверил всё ещё несколько раз - запустил демо-пример на двух платах. При выводе PLLA на пин - есть джиттер. При выводе UPLL - нету. Если ядро отладчиком остановить - то частота на ножке стабильна. Если ядро работает (в примере опрашивает регистр уарта, ждёт нажатия кнопки), то появляется такой вот "джиттер":
  11. Ну и ещё добавлю новость: в новой еррате написано не использовать SDRAM. И на страничке рекламы и в новом даташите сдрам контроллера нет... зато цветные колонтитулы добавили
  12. SAME70. Кто-нибудь использовал в нём выход частоты из встроенной PLLA? Почему-то у меня она получилась дёрганная и на это дёрганье как-то влияет FreeRTOS. Вот такая картинка в даташите, можно любой клок выдать на три определённых ноги PCK_0..2 Включаю выход PCK_1, источник выбираю PLL, делитель на 12 (300/12=25МГц) #define PIN_PCK_1 {PIO_PA17B_PCK1, PIOA, ID_PIOA, PIO_PERIPH_B, PIO_DEFAULT} PMC->PMC_SCDR = PMC_SCDR_PCK1; // disable PCK 1 while ((PMC->PMC_SCSR)& PMC_SCSR_PCK1); PMC->PMC_PCK[1] = PMC_PCK_PRES(11)| PMC_PCK_CSS_PLLA_CLK; //PMC_PCK_CSS_MCK; //; PMC->PMC_SCER = PMC_SCER_PCK1; while (!((PMC->PMC_SR) & PMC_SR_PCKRDY1)); В пустом проекте всё красиво выводится, осциллограф в режиме запоминания показывает сдвиги меньше 1 нс НО как только запускаю FreeRTOS, частота начинает "дёргаться" - фронты двигаются на +-5нс. Пробовал убрать все задачи - дёрганья есть, т.е. не в моих задачах дело. Пробовал в xPortSysTickHandler() поставить return - дёрганья пропадают. Появляются где-то в этом 1мсек обработчике xPortSysTickHandler portDISABLE_INTERRUPTS(); { /* Increment the RTOS tick. */ if( xTaskIncrementTick() != pdFALSE ) { /* A context switch is required. Context switching is performed in * the PendSV interrupt. Pend the PendSV interrupt. */ portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } } portENABLE_INTERRUPTS(); } PS. Если выводить 24МГц на ту же ногу, но от источника UPLL, то никаких дёрганий нет PPS убирал из этого обработчика по очереди всё что можно. Выяснил пока, что инструкции __DSB() ISB() в прерывании от СисТика "портят" частоту на ноге PCKxx. Как такое вообще может быть? ppps. Выглядит, что на дёрганье частоты PLLA влияет вообще всё - и прерывания и какой-либо код (не относящийся к работе с pll и с периферией портов). При этом с UPLL такого нет
  13. PPS: Вот Си вариант, работает под cortex-M7 с float, под целые так и не переделал, не понадобилось // буфер 240(30мс) s16 элементов накапливаю для обработки Герцелем// 3 цикла ДМА #define RX_DSP_LEN 240 // #define a1 :=2*cos(2*Pi*Ff/Fd); #define a1_1200 (float)1.1755705046 //1.1755705045849462583374119092781 #define a1_1600 (float)0.6180339888 //0.61803398874989484820458683436564 // вызывается из codec_work() при накоплении буфера 30мс void DSP_gertzel(){ s32 Summ = 0; s16 DCoff; u16 Amp; u32 i; float D0, D1, D2; float Amp12, Amp16; for (i=0;i<RX_DSP_LEN; i++){ Summ += Buf_DSP[i]; } DCoff = Summ/RX_DSP_LEN; // среднее арифм. DC offset Summ = 0; for (i=0;i<RX_DSP_LEN; i++){ Summ += abs(Buf_DSP[i]-DCoff); } Amp = (u16) round(((float)(Summ/RX_DSP_LEN)*PI/2)); // если общий уровень не в воротах, то просто считаю детекцию нулевой и выполняю что нужно if ((Amp<MIN_LVL_ADASE)||(Amp>MAX_LVL_ADASE)){ Amp12 = 0; Amp16 = 0; //d0printD(DEBUG_DSP, "\rDC=%d Amp=%d no proc xxx xxx ", DCoff, Amp); } else { // ******* сам алгоритм ********* // ********** 1200 ************** D1 = 0; D2 = 0; for (i=0; i<RX_DSP_LEN; i++){ D0 = Buf_DSP[i]+ a1_1200*D1-D2; D2 = D1; D1 = D0; } Amp12 = sqrt(D1*D1+D2*D2 - a1_1200*D1*D2); Amp12 = Amp12/(RX_DSP_LEN/2); // ********** 1600 ************ D1 = 0; D2 = 0; for (i=0; i<RX_DSP_LEN; i++){ D0 = Buf_DSP[i]+ a1_1600*D1-D2; D2 = D1; D1 = D0; } Amp16 = sqrt(D1*D1+D2*D2 - a1_1600*D1*D2); Amp16 = Amp16/(RX_DSP_LEN/2); // ******************************* } // Amp в норме // дальше определяем, какая частота присутствует. общий уровень отфильтрован выше if((Amp12 > MIN_LVL_ADASE)&&(Amp16> MIN_LVL_ADASE)){ (...) считаем на интервале 30мс обнаруженным } }
  14. Вот рабочий пример, на паскале правда, возможно поможет, синтаксис там понятный. Делал себе эмулятор когда-то, чтоб разобраться. В программе можно сгенерировать 2 частоты F0+F1, чтоб посмотреть, как алгоритм отрабатывает на таких сигналах. Для начала можно задать одну F0, тогда амплитуду F1 задать =0 Кнопка "Генерировать" - создаёт массив точек сгенерированного сигнала (число точек задаётся, Fs у меня всегда 8000 Гц) и выводит график. Дальше задаётся длина интервала оценки, на которые будет разбит сигнал и на каждом будет запущен алгоритм Герцеля, задаётся искомая частота и нажимается кнопка "Gortc proc". Синим цветом у меня вычисляется амплитуда всего сигнала за вычетом DC на интервале, и при одной частоте видно как к концу интервала амплитуда равна числу, которое выдает алгоритм герцеля (он выдаёт амплитуду на искомой частоте) Для сравнения еще сделано в целых числах, результат почти такой же точности(оранжевый график, он перекрывает бирюзовый) В архиве ехе-шник и .pas, часть нужного кода вставляю сюда: Procedure Gortc_Proc(); //const a1 = 0.618; // 2•cos(2PI•k) k=f/Fd var D0, D1, D2 : real; iD0, iD1, iD2 : Int64; //integer; i : integer; P : real; Ff: integer; a1: real; iA1: Int64; NumSamples : integer; // число выборок для интервал оценки. с новым интервалом фильтр обнуляется begin Fmain.Chart1.Series[3].Clear; Fmain.Chart1.Series[4].Clear; Fmain.Chart1.Series[5].Clear; Ff := Fmain.SpinEditFfind.Value; a1 :=2*cos(2*Pi*Ff/Fd); NumSamples := Fmain.SpinEditInterval.Value; // D0 := 0; D1 := 0; D2 := 0; for i:= 0 to NumPoints-1 do begin D0 := X_IN[i]+ a1*D1-D2; D2 := D1; D1 := D0; P := sqrt(D1*D1+D2*D2 - a1*D1*D2); P := P/(NumSamples/2); // pp := round(P) div 10; Fmain.Chart1.Series[4].AddXY(i, P); // сброс коэффициентов через N мс if (i mod NumSamples) =0 // 80*125us = 10ms then begin mLog(IntToStr(i)+'. AMP(f) на интервале '+IntToStr(round(P))); D1:=0; D2:=0; end; end; //вариант с целыми iA1 := round(a1*256); iD1 := 0; iD2 := 0; for i:= 0 to NumPoints-1 do begin iD0 := X_IN[i]+ ((iA1*iD1) div 256) -iD2; iD2 := iD1; iD1 := iD0; P := sqrt(abs(iD1*iD1+iD2*iD2- iA1*iD1*iD2/256)); P := P/(NumSamples/2); // pp := round(P) div 10; Fmain.Chart1.Series[5].AddXY(i, P); // сброс коэффициентов через N мс с новым интервалом if (i mod NumSamples) =0 // 80*125us = 10ms then begin mLog(IntToStr(i)+'. AMP(f) на интервале '+IntToStr(round(P))); iD1:=0; iD2:=0; end; end; end; PS. Наверно можно и в экселе сделать всё то же самое, скопировав формулы в сотню строк dsp_detect_d10.zip
×
×
  • Создать...