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

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

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

Я взял 10 разрядов потом, что АЦП в ATMega128 выдает 10-битный результат

А АЦП тут при чем? Каким боком оно к синтезу синуса?

 

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

Однако, уже следующее значение аккумулятора фазы будет увеличено на 0,477*2^6=30,52Hz... Такая вот незадача...

Вот этого не понял. При чем тут 2^6, откуда оно взялось? 16-битный аккумулятор фазы дает шаг перестройки частоты 0.47 Гц. То есть изменение приращения аккумулятора фазы на 1 изменит частоту на 0.47 Гц.

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


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

А АЦП зачем в этом деле? Методика DDS - Direct DIGITA synthesis - не использует аналоговую часть вовсе. Весь алгоритм работает программно

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


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

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

Каким боком оно к синтезу синуса?

К самому синтезу синуса АЦП не имеет отношения. АЦП снимает напряжение с движка потенциометра регулировки частоты. А результат преобразования используется для задания приращения аккумулятора фазы.

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

о есть изменение приращения аккумулятора фазы на 1 изменит частоту на 0.47 Гц.

Да

Спасибо большое за доходчивое объяснение.

Мне только осталось неясно сколько же значений в таблицу синуса нужно...

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


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

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

Мне только осталось неясно сколько же значений в таблицу синуса нужно...

Зависит от того, насколько чистый синус вам нужен. Минимально - два значения :biggrin:

 

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

АЦП снимает напряжение с движка потенциометра регулировки частоты. А результат преобразования используется для задания приращения аккумулятора фазы.

y = kx + b в школах уже не проходят?.

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


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

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

y = kx + b в школах уже не проходят?.

Так я вроде то же написал парой постов ранее...

Quote

взять 16-ти битный аккумулятор и к 10-ти битному значению АЦП  добавлять 64512, т.е ADC[10:0] | 0xFC00.

 

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


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

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

Спасибо большое за доходчивое объяснение.

Наверное стоило написать так: "То есть изменение приращения в каждом периоде ШИМ аккумулятора фазы на 1 изменит частоту на 0.47 Гц."

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


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

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

изменение приращения в каждом периоде ШИМ аккумулятора фазы на 1 изменит частоту на 0.47 Гц.

Ну да, ведь аккумулятор всё время крутит фазу по кругу с частотой ШИМ и заданным шагом приращения.

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


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

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

Так я вроде то же написал парой постов ранее...

"Добавлять 64512" - это только "+ b" :dance3:

А через kx + b можно из любого данного количества бит получить любое необходимое. То есть АЦП может выдавать сколько угодно бит и выдаваемые им значения можно привести к любому требуемому диапазону N1...N2 приращения аккумулятора фазы.

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


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

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

"Добавлять 64512" - это только "+ b"

А Вашей формуле "х" - это значение АЦП, а "к" - на сколько разрядов сдвинуть ?

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


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

Я заранее извиняюсь за свою бестолковость, но я запутался :umnik2:

У меня таблица синуса 36 значений (через 10 градусов), фазовый аккумулятор 16 разрядов. Правильно ли я понимаю, что если приращение фазы будет, скажем 100, то номер значения в таблице будет считаться как n = (100*х)/(65536/36), где х-число итераций с частотой ШИМ?

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


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

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

а "к" - на сколько разрядов сдвинуть ?

Это коэффициент, на который умножить. У AVR есть команда умножения, бояться умножений не нужно.

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

У меня таблица синуса 36 значений (через 10 градусов),

Не заставляйте контроллер делать дурную работу. Ему неудобно работать с таблицами размером не равным степени двойки. Зачем вам круглое число градусов? Вам один раз полюбоваться на круглые цифры при написании, а ему всю жизнь лишние команды молотить. Чем вам не нравится таблица из 64 значений (через пи/32 радиан)?

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

о номер значения в таблице будет считаться как n = (100*х)/(65536/36), где х-число итераций с частотой ШИМ?

Как остаток от деления (100*x)/(65536/36) на 36. Поэтому удобно делать размер таблицы равным степени двойки - тогда остаток от деления вычисляется простой операцией "двоичное И" либо усечением значения при переполнении переменной, а 65536/размер_таблицы - как логический сдвиг.

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


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

12 hours ago, Сергей Борщ said:

Как остаток от деления (100*x)/(65536/36) на 36. Поэтому удобно делать размер таблицы равным степени двойки - тогда остаток от деления вычисляется простой операцией "двоичное И" либо усечением значения при переполнении переменной, а 65536/размер_таблицы - как логический сдвиг.

Вот в этой части Вашего ответа я не смог разобраться. Извините за тугодумство:blush:

Почему удобно делать таблицу размером кратным степени двойки я понял. А вот что означает фраза "Как остаток от деления (100*x)/(65536/36) на 36."? Я думаю, что всё таки не остаток от деления, а целая часть числа, полученного при делении.

65536/размер_таблицы - это константа, её надо один раз посчитать и целую часть вставить в формулу. Я просто для иллюстрации хода своих рассуждений вставил это действие в формулу.

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


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

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

Я думаю, что всё таки не остаток от деления, а целая часть числа

допустим, прошло 1000000000 циклов приращения фазы. Даже не выполняя вычислений понятно, что результат вашего деления будет во много раз больше размера таблицы. Не говоря уже о том, что для хранения x потребуется переменная бесконечного размера :crazy:.

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

65536/размер_таблицы - это константа, её надо один раз посчитать и целую часть вставить в формулу.

Константа считается один раз, а деление 100x/константа контроллер должен будет выполнять на каждом проходе. В случае размера таблицы в 36 ячеек это будет число 1820.4(4) - вы будете выполнять деление в числах с плавающей точкой?

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


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

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

Константа считается один раз, а деление 100x/константа контроллер должен будет выполнять на каждом проходе.

Я переписал таблицу на 32 значения. Здесь я полностью с Вами согласен)

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

допустим, прошло 1000000000 циклов приращения фазы. Даже не выполняя вычислений понятно, что результат вашего деления будет во много раз больше размера таблицы. Не говоря уже о том, что для хранения x потребуется переменная бесконечного размера

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

 

P.S. Я уже получил на выходе МК три фазы и меняю их частоту от 0Гц до 465Гц. Однако, хочется разобраться до конца.

вот код прерывания, в котором вычисляется номер значения в таблице и подставляются в фазы синусоид:

ISR(TIMER1_OVF_vect)//PWM_ON interrupt
{
 if(!(TIFR & (1<<TOV1)))
   {
    TIFR |= (1<<TOV1);//clear TIM1 Overflow flag

   OCR1A = PWM1[num];  //ШИМ 1
   OCR1B = PWM2[num];  //ШИМ 2
   OCR1C = PWM3[num];  //ШИМ 3 
   num = akk/2048;//65536/32=2048
   akk += akk_shift;
   }   
}

 

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


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

Все у вас правильно, при переполнении akk происходит операция akk = akk mod 2^16, а после деления на 2048 получается результат по модулю 32, т.е. остаток от деления на 32.

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


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

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

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

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

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

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

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

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

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

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