Сергей Борщ 140 1 августа, 2023 Опубликовано 1 августа, 2023 · Жалоба 23 минуты назад, MPetrovich сказал: Я взял 10 разрядов потом, что АЦП в ATMega128 выдает 10-битный результат А АЦП тут при чем? Каким боком оно к синтезу синуса? 23 минуты назад, MPetrovich сказал: Однако, уже следующее значение аккумулятора фазы будет увеличено на 0,477*2^6=30,52Hz... Такая вот незадача... Вот этого не понял. При чем тут 2^6, откуда оно взялось? 16-битный аккумулятор фазы дает шаг перестройки частоты 0.47 Гц. То есть изменение приращения аккумулятора фазы на 1 изменит частоту на 0.47 Гц. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 81 1 августа, 2023 Опубликовано 1 августа, 2023 · Жалоба А АЦП зачем в этом деле? Методика DDS - Direct DIGITA synthesis - не использует аналоговую часть вовсе. Весь алгоритм работает программно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 6 1 августа, 2023 Опубликовано 1 августа, 2023 · Жалоба 6 minutes ago, Сергей Борщ said: Каким боком оно к синтезу синуса? К самому синтезу синуса АЦП не имеет отношения. АЦП снимает напряжение с движка потенциометра регулировки частоты. А результат преобразования используется для задания приращения аккумулятора фазы. 6 minutes ago, Сергей Борщ said: о есть изменение приращения аккумулятора фазы на 1 изменит частоту на 0.47 Гц. Да Спасибо большое за доходчивое объяснение. Мне только осталось неясно сколько же значений в таблицу синуса нужно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 1 августа, 2023 Опубликовано 1 августа, 2023 · Жалоба 5 минут назад, MPetrovich сказал: Мне только осталось неясно сколько же значений в таблицу синуса нужно... Зависит от того, насколько чистый синус вам нужен. Минимально - два значения 5 минут назад, MPetrovich сказал: АЦП снимает напряжение с движка потенциометра регулировки частоты. А результат преобразования используется для задания приращения аккумулятора фазы. y = kx + b в школах уже не проходят?. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 6 1 августа, 2023 Опубликовано 1 августа, 2023 · Жалоба 2 minutes ago, Сергей Борщ said: y = kx + b в школах уже не проходят?. Так я вроде то же написал парой постов ранее... Quote взять 16-ти битный аккумулятор и к 10-ти битному значению АЦП добавлять 64512, т.е ADC[10:0] | 0xFC00. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 1 августа, 2023 Опубликовано 1 августа, 2023 · Жалоба 6 минут назад, MPetrovich сказал: Спасибо большое за доходчивое объяснение. Наверное стоило написать так: "То есть изменение приращения в каждом периоде ШИМ аккумулятора фазы на 1 изменит частоту на 0.47 Гц." Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 6 1 августа, 2023 Опубликовано 1 августа, 2023 · Жалоба 2 minutes ago, Сергей Борщ said: изменение приращения в каждом периоде ШИМ аккумулятора фазы на 1 изменит частоту на 0.47 Гц. Ну да, ведь аккумулятор всё время крутит фазу по кругу с частотой ШИМ и заданным шагом приращения. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 1 августа, 2023 Опубликовано 1 августа, 2023 · Жалоба 6 минут назад, MPetrovich сказал: Так я вроде то же написал парой постов ранее... "Добавлять 64512" - это только "+ b" А через kx + b можно из любого данного количества бит получить любое необходимое. То есть АЦП может выдавать сколько угодно бит и выдаваемые им значения можно привести к любому требуемому диапазону N1...N2 приращения аккумулятора фазы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 6 1 августа, 2023 Опубликовано 1 августа, 2023 · Жалоба 2 minutes ago, Сергей Борщ said: "Добавлять 64512" - это только "+ b" А Вашей формуле "х" - это значение АЦП, а "к" - на сколько разрядов сдвинуть ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 6 1 августа, 2023 Опубликовано 1 августа, 2023 · Жалоба Я заранее извиняюсь за свою бестолковость, но я запутался У меня таблица синуса 36 значений (через 10 градусов), фазовый аккумулятор 16 разрядов. Правильно ли я понимаю, что если приращение фазы будет, скажем 100, то номер значения в таблице будет считаться как n = (100*х)/(65536/36), где х-число итераций с частотой ШИМ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 1 августа, 2023 Опубликовано 1 августа, 2023 · Жалоба 4 часа назад, MPetrovich сказал: а "к" - на сколько разрядов сдвинуть ? Это коэффициент, на который умножить. У AVR есть команда умножения, бояться умножений не нужно. 2 часа назад, MPetrovich сказал: У меня таблица синуса 36 значений (через 10 градусов), Не заставляйте контроллер делать дурную работу. Ему неудобно работать с таблицами размером не равным степени двойки. Зачем вам круглое число градусов? Вам один раз полюбоваться на круглые цифры при написании, а ему всю жизнь лишние команды молотить. Чем вам не нравится таблица из 64 значений (через пи/32 радиан)? 2 часа назад, MPetrovich сказал: о номер значения в таблице будет считаться как n = (100*х)/(65536/36), где х-число итераций с частотой ШИМ? Как остаток от деления (100*x)/(65536/36) на 36. Поэтому удобно делать размер таблицы равным степени двойки - тогда остаток от деления вычисляется простой операцией "двоичное И" либо усечением значения при переполнении переменной, а 65536/размер_таблицы - как логический сдвиг. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 6 2 августа, 2023 Опубликовано 2 августа, 2023 · Жалоба 12 hours ago, Сергей Борщ said: Как остаток от деления (100*x)/(65536/36) на 36. Поэтому удобно делать размер таблицы равным степени двойки - тогда остаток от деления вычисляется простой операцией "двоичное И" либо усечением значения при переполнении переменной, а 65536/размер_таблицы - как логический сдвиг. Вот в этой части Вашего ответа я не смог разобраться. Извините за тугодумство Почему удобно делать таблицу размером кратным степени двойки я понял. А вот что означает фраза "Как остаток от деления (100*x)/(65536/36) на 36."? Я думаю, что всё таки не остаток от деления, а целая часть числа, полученного при делении. 65536/размер_таблицы - это константа, её надо один раз посчитать и целую часть вставить в формулу. Я просто для иллюстрации хода своих рассуждений вставил это действие в формулу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 2 августа, 2023 Опубликовано 2 августа, 2023 · Жалоба 49 минут назад, MPetrovich сказал: Я думаю, что всё таки не остаток от деления, а целая часть числа допустим, прошло 1000000000 циклов приращения фазы. Даже не выполняя вычислений понятно, что результат вашего деления будет во много раз больше размера таблицы. Не говоря уже о том, что для хранения x потребуется переменная бесконечного размера . 49 минут назад, MPetrovich сказал: 65536/размер_таблицы - это константа, её надо один раз посчитать и целую часть вставить в формулу. Константа считается один раз, а деление 100x/константа контроллер должен будет выполнять на каждом проходе. В случае размера таблицы в 36 ячеек это будет число 1820.4(4) - вы будете выполнять деление в числах с плавающей точкой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 6 2 августа, 2023 Опубликовано 2 августа, 2023 · Жалоба 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; } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 2 августа, 2023 Опубликовано 2 августа, 2023 · Жалоба Все у вас правильно, при переполнении akk происходит операция akk = akk mod 2^16, а после деления на 2048 получается результат по модулю 32, т.е. остаток от деления на 32. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться