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

adnega

Свой
  • Постов

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

  • Посещение

  • Победитель дней

    3

Весь контент adnega


  1. 2МБит M24M02-DRMN6TP. Можно найти рублей по 90 в партии от 200 штук. Можно на одну шину посадить несколько микросхем. Например, 4 штуки по 1Мбиту CAT24M01WI-GT3 (33 руб/шт).
  2. Я допускаю, что энергия импульса может определяться не только высотой (амплитудой), но и шириной импульса (длительностью). Приведенная схема способна к получению амплитуды верхушки и учету длительности.
  3. Может, в этом причина. У реального сигнала ограниченный спектр и энергия в нем одна. У импульса с генератора спектр иной и энергия иная. Опубликуете картинку импульса? МК может непрерывно оцифровывать сигнал, а компаратор лишь скажет, когда максимум достигнут и это даст команду на обработку записанного в кольцевом буфере отрезка. Т.е. вполне может анализироваться форма, по которой сигнал нарастает.
  4. Он весьма хорош. Не проверял, но если он ошибку не тупо по квадрату считает, а учитывает значение функции, то это практически идеал. Но если из 32 разрядов 20 для задачи достаточно, то можно ничего не пересчитывать. Позже отписал: там стоит беззнаковый учет насыщения, поэтому маленький отрицательный "не ноль" становится нулем. Кста, насчет A0 - оно получилось 8 битное - это тоже используется. Еще я попробовал полином 4 степени - только 3 знака после запятой получается - выигрыш мал, о потери в три разряда.
  5. Как я понял что сделал jcxz: - полином 6 степени неплохо аппроксимирует четвертинку синуса; - значения для отрицательного аргумента равны значениям как у положительного, но со знаком минус, поэтому сразу избавляемся от знака; - оставшийся горбик симметричен, если аргумент находится во второй половине горбика, то симметрично пересчитываем его в первую половину; - после этих манипуляций получаем аргумент в четвертинке - считаем полином 6 степени с учетом насыщения; - учитываем знак аргумента, возвращаем результат. у меня получилась такая максимальная погрешность = -0.000000514, типа 20 разрядов честные. зеленый - четверть синусоиды, красный - аппроксимация полиномом 6-й степени на этом участке. Полином чуть-чуть отличается: -0.9245958*x^6+3.146588*x^5-0.1971828*x^4-5.1333584*x^3-0.0029408*x^2+3.1416923*x-(6.462529*10^(-7)). Для получения коэффициентов домножить на 2^28. Кста, нулевой коэффициент тоже не равен нулю, но это, видимо, метод наименьших квадратов сделал минимальную ошибку для всего диапазона.
  6. Я считал для двух каналов по 16 бит и без master clock. Тогда так: HSE=8M делитель HSE /M = /5 на входах PLL 1.6M MainPLL: *N = *210, /P = /2, /Q = /7 1.6M * 210 = 336M VCO, 336M / 2 = 168M PLLCLK, 336M / 7 = 48M USB. PLLI2S: *N = *192, /R = 5 1.6M * 192 = 307.2M VCO, 307.2M / 5 = 61.44M I2SCLK 61440k / (32 * 2 * (2 * 2 + 1) * 4) = 61440k / (64 * 5 * 4) = 48k Сойдет?
  7. А какие именно делители не понятны? /M=8 это делитель перед PLL2S. он у вас тоже 8. PLL2SN - это *N в блоке PLL2S - у вас x197, а должен быть x384. PLL2SR - это /R в блоке PLL2S - у вас /2, а должен быть /5. Таким образом частота I2S у вас будет не 98.5МГц, а 76.8МГц. Затем в настройках I2S нужно задать делитель 100, но в регистрах он разбит на две части - см. описание I2SPR Поскольку передаются два канала, то делитель I2S должен быть не 100 (как я указал выше), а 50=25*2+0.
  8. Попробовал размотать код от jcxz: получается полином 6-ой степени (для ряда Тейлора странные коэффициенты), причем A0 != 0 поэтому sin(0) будет != 0. Что!?
  9. Я, думаю, так может быть: sin(T + t) = sin(T) * cos(t) + cos(T) * sin(t) T - табличные значения, t - отклонение от табличного значения. sin(t) = t - t^3/3! + t^5/5! - ... = (((1/5!)t^2 - 1/3!)t^2 + 1)t cos(t) = 1 - t^2/2! + t^4/6! - ... = ((1/6!)*t^2 - 1/2!)t^2 + 1 Как у jcxz сделано самому интересно.
  10. Только если в начале каждого стимула обнулять расчеты.
  11. Неа, нужно будет многократно рассчитывать значения - может и погрешность набежать.
  12. Кста, все может получиться и на 8МГц кварце: - /M = /8 - PLL2SN = x384 - PLL2SR = 5 - I2SPR_I2SDIV = 50 - I2SPR_ODD = 0 8M / 8 * 384 / 5 / 50 / 2 = 48k * 16 Обращаю внимание, что предделитель I2S не обязан быть степенью двойки (как у SPI, например)
  13. Если генераторы независимые, то смысла нет. А если генератор общий, то проблем с синхронизацией будет меньше. Кста, если частоту I2S сделать равной степени двойки (например, 65536), то и с делениями полегчает.
  14. Раз уж мы про округления, то f_ton = 8000 f_smpl = 46875 def divRound(a, b): return ((a + b // 2) // b) p1 = 0 p2 = 0 for i in range(f_smpl): p1 += divRound(f_ton << 32, f_smpl) p1 &= 0xFFFFFFFF; p2 += f_ton if p2 > f_smpl: p2 -= f_smpl p3 = (p2 << 32) // f_smpl p3 &= 0xFFFFFFFF print(i, p1, p3, p1 - p3) p3 дает нулевую фазовую ошибку через f_smpl семплов, а p1 дает ошибку 1.63E-6. warn{это Python, поэтому // - это не комментарий, а целочисленное деление}
  15. ((10) + ((1) / 2) / 1 = (10 + 1 / 2) / 1 = (10 + 0) / 1 = 10
  16. Фазу можно точнее накапливать (например, алгоритм Брезенхема), но будет небольшой фазовый шумок. У jcxz без фазового шума, но с небольшим отклонением по частоте (где-то в 6 знаке после запятой 8000.0000016298145 Гц).
  17. Ряд Тейлора? Т.е. иметь заранее вычисленные значения синуса, а рядом Тейлора достраивать промежуточные значения? Я примерно о том же и говорю: для ускорения можно в добавок к таблицам значений синуса в конкретных точках, хранить значения коэффициентов ряда Тейлора для данной точки. Затем берем дельту, дельту в кубе, в пятой и т.д. и делам свертку?
  18. Сигнал заранее известен, можно настроить DMA в кольцевом режиме и готовить половинки заранее - FPU в помощь.
  19. ТС, видимо, не хочет заниматься арифметикой, а хочет использовать константный массив.
  20. Сконвертировать можно sof->rbf можно при помощи Convert Programming File (есть в меню File проекта). Внизу нужно будет нажать Add File и добавить ваш sof. Либо установить соответствующую галочку в настройках проекта.
  21. Нормальное желание. Только грузить лучше не по JTAG, а через PS (Passive Serial). Примерно так: - дергаете nCONFIG на GND; - CONF_DONE падает вниз; - затем через DCLK и DATA0 подаете битовый поток (из .rbf, но там биты в байте обращены); - получаете на CONF_DONE единицу. Многое зависит от объема прошивки (кста, поддерживается сжатие), у меня при DCLK порядка 20 МГц получилось чуть более 20 мс. Это как раз EP2: ep2_data.rbf ep2_ps.dsl Для второго циклона: https://www.intel.in/content/dam/www/programmable/us/en/pdfs/literature/hb/cyc2/cyc2_cii51013.pdf Пример main.c
  22. Насчет цен все сложно, а документацию можно тут подсмотреть.
  23. Все реально. Если код не модифицирующийся - тогда совсем легко. Когда вы укажите функции секцию, то она скомпилируется с адресами из ОЗУ, но копия будет лежать во flash. Стартап на этапе инициализации секций должен скопировать образ из flash в ОЗУ. Все! - функцию/обработчик можно вызывать.
  24. Перенести можно только всю таблицу целиком. Но можно и не переносить: вектора во flash, обработчик прерывания в ОЗУ.
×
×
  • Создать...