-
Постов
10 908 -
Зарегистрирован
-
Посещение
-
Победитель дней
31
Сообщения, опубликованные Сергей Борщ
-
-
6 минут назад, MPetrovich сказал:
Так я вроде то же написал парой постов ранее...
"Добавлять 64512" - это только "+ b"
А через kx + b можно из любого данного количества бит получить любое необходимое. То есть АЦП может выдавать сколько угодно бит и выдаваемые им значения можно привести к любому требуемому диапазону N1...N2 приращения аккумулятора фазы.
-
6 минут назад, MPetrovich сказал:
Спасибо большое за доходчивое объяснение.
Наверное стоило написать так: "То есть изменение приращения в каждом периоде ШИМ аккумулятора фазы на 1 изменит частоту на 0.47 Гц."
-
5 минут назад, MPetrovich сказал:
Мне только осталось неясно сколько же значений в таблицу синуса нужно...
Зависит от того, насколько чистый синус вам нужен. Минимально - два значения
5 минут назад, MPetrovich сказал:АЦП снимает напряжение с движка потенциометра регулировки частоты. А результат преобразования используется для задания приращения аккумулятора фазы.
y = kx + b в школах уже не проходят?.
-
2 часа назад, destroit сказал:
мне нужны катушки разных размеров-геометрии
Для одного изделия нужны были катушки, диаметр что-то около 4 мм, количество витков от 2 до десяти. Нашли китайцев, они изготовили. Быстро, недорого и с прекрасной повторяемостью в отличие от намотанный вручную. А освободившийся от ручного изготовления этих катушек человек занялся более полезным делом, принося больше прибыли за единицу времени (раз уж мы о зарабатывании денег).
-
23 минуты назад, MPetrovich сказал:
Я взял 10 разрядов потом, что АЦП в ATMega128 выдает 10-битный результат
А АЦП тут при чем? Каким боком оно к синтезу синуса?
23 минуты назад, MPetrovich сказал:Однако, уже следующее значение аккумулятора фазы будет увеличено на 0,477*2^6=30,52Hz... Такая вот незадача...
Вот этого не понял. При чем тут 2^6, откуда оно взялось? 16-битный аккумулятор фазы дает шаг перестройки частоты 0.47 Гц. То есть изменение приращения аккумулятора фазы на 1 изменит частоту на 0.47 Гц.
-
42 минуты назад, Сергей Борщ сказал:
Если на каждом шаге мы будем прибавлять к аккумулятору фазы по единичке, за 65536 шагов мы обойдем всю таблицу один раз
Дополню:
Предположим, что у вас ATmega работает на частоте вот прямо ровно-ровно 16 МГц, таблица состоит из 8-битных значений и режим ШИМа обычный, то есть частота ШИМа у вас 16000000 / 256 = 62500 Гц. Также предположим, что аккумулятор фазы 32-битный. Чтобы выдать частоту 1 Гц, нужно на каждый период ШИМа увеличивать аккумулятор фазы на 0x100000000 / 62500 = ~68719.476736. Ближайшее целое будет 68719 и реальная выдаваемая частота получится 68719 / (0x100000000 / 62500) = ~0.999993063 Гц. Если на каждый период ШИМ мы будем увеличивать аккумулятор фазы на 68720 - выдаваемая частота получится 1.000007614. Меняя приращение аккумулятора фазы меняем частоту с шагом 62500 / 0x100000000 = ~0.000014552 Гц. То есть разрядность аккумулятора влияет только на точность или шаг установки частоты. Хотим получить 1000 Гц - прибавляем к аккумулятору фазы 1000 * 0x100000000 / 62500 = 68719476, реальная частота получится 68719476 * (0x100000000 / 62500) = 999.99998929 Гц.
-
8 минут назад, MPetrovich сказал:
Это он?
Да
8 минут назад, MPetrovich сказал:Получается, что чем меньше частота генерируемого сигнала, тем меньше разрядов аккумулятора фазы используется. И управление частотой сводится к изменению используемых разрядов аккумулятора фазы. Так?
Нет. Предположим, таблица у нас на 256 значений и аккумулятор фазы 16-битный, 8 старших бит используются для выборки из таблицы. Если на каждом шаге мы будем прибавлять к аккумулятору фазы по единичке, за 65536 шагов мы обойдем всю таблицу один раз и каждое значение таблицы будет выдано по 256 раз. Если мы будем прибавлять по 5, то за 65536 шагов мы обойдем таблицу 5 раз и каждое значение таблицы будет выдано 51 или 52 раза (каждое пятое будет выдано 52 раза, а остальные 51 раз).
-
15 минут назад, MPetrovich сказал:
Однако, при большом объёме аккумуляторе фазы нужно иметь и большую таблицу значений амплитуды - по крайней мере, не меньше 1/4 объёма аккумулятора фазы...
Нет, не обязательно. При малом размере таблицы вы можете выдавать одно и то же значение из таблицы несколько раз. Например, у вас аккумулятор фазы может быть 32-битный, но только 8 или, скажем, 6 старших бит использоваться для выборки из таблицы.
-
30 минут назад, MPetrovich сказал:
Насколько большую?
Честно говоря мне лень излагать здесь всю теорию прямого цифрового синтеза. Почитайте хотя бы статью Леонида Ивановича, многое станет понятным.
30 минут назад, MPetrovich сказал:В AD9833 хранятся табличные данные только об 1/4 части синусоиды.
Я рад за них. А я на ATmega8 выдавал ЧМ модуляцию без разрыва фазы для передатчика используя таблицу на 1/8 периода.
30 минут назад, MPetrovich сказал:Формулу можно? А лучше в виде примерчика кода)))
Ключевые слова для Яндекса - "алгоритм Герцеля", генерация синусоиды - его частный случай.
-
3 минуты назад, EdgeAligned сказал:
Эммм... 360°/4 = 90°, вроде бы так. Сейчас на калькуляторе проверю на всякий случай 🙂
Если поменять местами X и Y - участок единичной окружности от 0 до 45 градусов превращается в участок от 90 до 45 градусов
-
13 минут назад, EdgeAligned сказал:
Правда, в этом случае таблица синуса должна быть достаточно большой, чтобы получить большой диапазон перестройки частоты.
Достаточно иметь большую разрядность аккумулятора фазы
-
19 минут назад, MPetrovich сказал:
Может ещё какие варианты предложите?
Прямой цифровой синтез (DDS)
-
21 минуту назад, EdgeAligned сказал:
В принципе, в самом минимальном варианте достаточно 1/4 периода
1/8 периода
-
3 часа назад, artemkad сказал:
ЗЫ. Кстати, та-же логика должна была подсказать, что при расширении полосы вдвое, спектральная плотность мощности полезного сигнала тоже падает вдвое...
Естетственнно. Но при передаче ШПС нет необходимости заполнять сигналом и слушать всю полосу одновременно, а вот глушить нужно всю полосу..
-
29 минут назад, Vladimir_T сказал:
джиттер порядка 48 ns
10 тактов системной частоты. Ядро между прерываниями спит или все же выполняет какие-то (не всегда однотактовые) команды?
-
33 минуты назад, Vladimir_T сказал:
Во время работы выводится сигнал для контроля частоты выборок.
Выведите этот же сигнал в прерывании таймера, прерывание АЦП пока запретите. Сравните.
-
1 час назад, jcxz сказал:
Поэтому, для повышения помехоустойчивости, полосу сужают.
Гм. А ученые (не британские) считают иначе. Даже придумали шумоподобные сигналы и методы расширения спектра.
В 30.07.2023 в 01:56, artemkad сказал:Чем шире полоса - тем проще заглушить.
Правда? Банальная логика подсказывает, что для заглушения вдвое большей полосы требуется вдвое большая мощность.
-
Я догадываюсь, что у китайцев дешевле. Но может устроят из ТМЕ?
-
2 минуты назад, MegaVolt сказал:
Беда в том что 3 GPS не помогут.
Есть же еще ГЛОНАСС и китайский BeiDou.
-
57 минут назад, MegaVolt сказал:
Главная сложность это понять что те GPS что есть врут и переключится на альтернативные средства.
Говорят, у моряков есть поговорка: "выходя в море надо брать или один компас, или три".
-
А, это же GD32, у него такты ожидания флеша не влияют на работу. Хотя у них есть application note про проблемы при программном сбросе, к сожалению не смог найти ее в интернете.AN012 GD32 programming instructions on reset (rev. 1.0).pdf
-
7 минут назад, Грустый_embedded сказал:
флеш, где лежит сама программа загрузчика, адрес 0x8000530
Загрузчик перед этим настраивает тактирование, разгоняет ядро?
-
1 час назад, Грустый_embedded сказал:
всегда по одному и тому же адресу вместо значения 0x22 наблюдаю 0x20
По какому адресу? Флеш? ОЗУ? Регистр периферии?
-
6 часов назад, Arlleex сказал:
В альтиуме оно называется part swap, что мне показалось логичнее.
По аналогии с part number я бы понял это название как "поменять местами микросхемы". Тут же имеются ввиду именно логические элементы и даже не важно, меняются ли они местами внутри одного или разных корпусов.
Как состряпать алгоритм синусоидального ШИМ?
в Программирование
Опубликовано · Пожаловаться
Это коэффициент, на который умножить. У AVR есть команда умножения, бояться умножений не нужно.
Не заставляйте контроллер делать дурную работу. Ему неудобно работать с таблицами размером не равным степени двойки. Зачем вам круглое число градусов? Вам один раз полюбоваться на круглые цифры при написании, а ему всю жизнь лишние команды молотить. Чем вам не нравится таблица из 64 значений (через пи/32 радиан)?
Как остаток от деления (100*x)/(65536/36) на 36. Поэтому удобно делать размер таблицы равным степени двойки - тогда остаток от деления вычисляется простой операцией "двоичное И" либо усечением значения при переполнении переменной, а 65536/размер_таблицы - как логический сдвиг.