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

Как состряпать алгоритм синусоидального ШИМ?

13 минут назад, EdgeAligned сказал:

Правда, в этом случае таблица синуса должна быть достаточно большой, чтобы получить большой диапазон перестройки частоты.

Достаточно иметь большую разрядность аккумулятора фазы

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


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

11 minutes ago, EdgeAligned said:

Есть такой алгоритм, как DDS.

А при чём здесь прямой синтез частоты? Там ЦАП участвует.

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


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

3 минуты назад, EdgeAligned сказал:

Эммм... 360°/4 = 90°, вроде бы так. Сейчас на калькуляторе проверю на всякий случай 🙂

Если поменять местами X и Y  - участок единичной окружности от 0 до 45 градусов превращается в участок от 90 до 45 градусов :blush:

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


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

Если нужно формировать синус постоянной частоты, без резких разрывов фазы, то для расчета синуса нужно одно сложение и одно умножение... Без всяких таблиц.

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


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

42 minutes ago, Сергей Борщ said:

Достаточно иметь большую разрядность аккумулятора фазы

Насколько большую?

И сколько точек должно храниться в таблице синуса для мгновенных значений амплитуды?

45 minutes ago, Сергей Борщ said:

1/8 периода :blush:

В AD9833 хранятся табличные данные только об 1/4 части синусоиды.

38 minutes ago, Arlleex said:

Если нужно формировать синус постоянной частоты, без резких разрывов фазы, то для расчета синуса нужно одно сложение и одно умножение... Без всяких таблиц.

Формулу можно? А лучше в виде примерчика кода)))

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


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

30 минут назад, MPetrovich сказал:

Насколько большую?

Честно говоря мне лень излагать здесь всю теорию прямого цифрового синтеза. Почитайте хотя бы статью Леонида Ивановича, многое станет понятным.

30 минут назад, MPetrovich сказал:

В AD9833 хранятся табличные данные только об 1/4 части синусоиды.

Я рад за них. А я на ATmega8 выдавал ЧМ модуляцию без разрыва фазы для передатчика используя таблицу на 1/8 периода. :blum:

30 минут назад, MPetrovich сказал:

Формулу можно? А лучше в виде примерчика кода)))

Ключевые слова для Яндекса - "алгоритм Герцеля", генерация синусоиды - его частный случай.

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


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

Если я верно понимаю принцип прямого синтеза, то он реализует пропуск значений амплитуды из таблицы значений кратно изменению частоты fout = (М x fc)/2n.  М- число, определяющее выходную частоту, fc - тактовая частота, n - разрядность аккумлятора фазы. А разрядность аккумулятора фазы - это на сколько можно разбить период генерируемого сигнала. Чем меньше частота генерируемого сигнала, тем выше степень дискретизации. Однако, при большом объёме аккумуляторе фазы нужно иметь и большую таблицу значений амплитуды - по крайней мере, не меньше 1/4 объёма аккумулятора фазы...

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


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

15 минут назад, MPetrovich сказал:

Однако, при большом объёме аккумуляторе фазы нужно иметь и большую таблицу значений амплитуды - по крайней мере, не меньше 1/4 объёма аккумулятора фазы...

Нет, не обязательно. При малом размере таблицы вы можете выдавать одно и то же значение из таблицы несколько раз. Например, у вас аккумулятор фазы может быть 32-битный, но только 8 или, скажем, 6 старших бит использоваться для выборки из таблицы. 

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


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

36 minutes ago, Сергей Борщ said:

"алгоритм Герцеля"

X[n+1] = X[n-1] — K*X[n]   Это он?

16 minutes ago, Сергей Борщ said:

При малом размере таблицы вы можете выдавать одно и то же значение из таблицы несколько раз. Например, у вас аккумулятор фазы может быть 32-битный, но только 8 или, скажем, 6 старших бит использоваться для выборки из таблицы. 

Получается, что чем меньше частота генерируемого сигнала, тем меньше разрядов аккумулятора фазы используется. И управление частотой сводится к изменению количества используемых разрядов аккумулятора фазы. Так?

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


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

8 минут назад, MPetrovich сказал:

Это он?

Да

8 минут назад, MPetrovich сказал:

Получается, что чем меньше частота генерируемого сигнала, тем меньше разрядов аккумулятора фазы используется. И управление частотой сводится к изменению используемых разрядов аккумулятора фазы. Так?

Нет. Предположим, таблица у нас на 256 значений и аккумулятор фазы 16-битный, 8 старших бит используются для выборки из таблицы. Если на каждом шаге мы будем прибавлять к аккумулятору фазы по единичке, за 65536 шагов мы обойдем всю таблицу один раз и каждое значение таблицы будет выдано по 256 раз. Если мы будем прибавлять по 5, то за 65536 шагов мы обойдем таблицу 5 раз и каждое значение таблицы будет выдано 51 или 52 раза (каждое пятое будет выдано 52 раза, а остальные 51 раз). 

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


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

1 час назад, MPetrovich сказал:

Формулу можно? А лучше в виде примерчика кода)))

Вы среднюю школу прогуляли что-ль?

Изучается где-то в средних классах школы (ну или  - раньше точно изучалась):

image.png.3d62af2e9f0dcb46f32cb90772453e74.png

и позволяет считать синусоиду тратя только одну MAC-операцию на сэмпл. Без всяких таблиц и прочей 8-битной чуши. И гораздо быстрее (на ARM или DSP). 100500 раз тут уже описывал это.

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


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

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 Гц.

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


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

1 hour ago, Сергей Борщ said:

Предположим, что у вас ATmega работает на частоте вот прямо ровно-ровно 16 МГц

Тактовая у меня 8МГц и частота ШИМ 8000000/256=31250Гц.  Исходя из Ваших выкладок: аккумулятор на 32 разряда даст точность 31250/2^32=0,0000073Гц, а 10-разрядный даст точность 31250/2^10=30,52Гц. Я взял 10 разрядов потом, что АЦП в ATMega128 выдает 10-битный результат, а на АЦП как раз и строится (по большей части) снятие напряжения потенциометра регулировки частоты. Конечно, можно поднять разрядность до 16-ти сдвинув результат преобразования влево на 6 разрядов. Это даст увеличение точности в 64 раза, т.е получим дискретность 0,477Гц. Однако, уже следующее значение аккумулятора фазы будет увеличено на 0,477*2^6=30,52Hz... Такая вот незадача...

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


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

Кажется я погорячился))) Можно же взять 16-ти битный аккумулятор и к 10-ти битному значению АЦП  добавлять 64512, т.е ADC[10:0] | 0xFC00. Тогда АЦП будет использоваться полностью, а шаг частоты останется 0,477.

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


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

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

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

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

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

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

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

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

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

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