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

MPetrovich

Свой
  • Постов

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

  • Посещение

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


  1. Нет, не вариант. Искажается форма синуса на отрицательной полуволне.
  2. Я тут подумал, может для таблицы в 36 значений вычислить другой размер фазового аккумулятора? Скажем такой: 36*1024=36864 Да! Это работает! Только надо аккумулятор во такой сделать: 36*2048=73728 И длина таблицы тогда не влияет на частоту, при одинаковом шаге получается одинаковая частота.
  3. Так это в железе определено настройками таймера. Программирование здесь ни при чём. Или вместо 31250 Вы предлагаете определить: #define F_PWM 31250 ? Я на осциллографе ПЕРИОД измеряю. Он поверенный, развёртка точная. Частоту я вижу на экране, но это результат 1/Т. Длина таблицы 32 или 36. Я так понимаю, что чем длиннее таблица, тем меньше раз повторяется каждое значение при одинаковом шаге аккумулятора. По формуле подсчёта частоты выходит, что длина таблицы на частоту не влияет. Но так ли это я не уверен...
  4. Да, так и получается. Fcpu=8Mhz; PWM = 8-bit; Fpwm=8000000/2^8=31250Hz. Никакой магии) Так и считаю. Но измеренный на осциллографе курсорами период даёт частоту на 2Гц больше при akk_shift = 106. Да бог с ней, с индикацией. Меня больше всего волнует сейчас вопрос как связать длину таблицы с выходной частотой. В формуле подсчёта частоты длина таблицы вообще не участвует, но на практике при таблице в 36 значений частота уменьшается в 1,67 раза. Откуда это берётся я не могу понять.
  5. Нет, "в плюс". Каким образом N-е значение таблицы может быть пропущено? Аккумулятор же перебирает их подряд, а шаг всегда на пару-тройку порядков меньше аккумулятора. Так что даже при большой частоте все значения таблицы будут по нескольку раз подряд выбраны в прерывании.
  6. Кстати, хотел заметить, что кратное двум количество значений в таблице для ШИМ даёт неприятный побочный эффект - при прямом подсчёте и выводе на индикацию частоты синуса display = (((uint32_t)akk_shift) * 31250)/65536; набегает ошибка примерно в 2Гц на 50ГЦ. И происходит это похоже из-за "некруглости" таблицы. То же самое, я думаю, будет наблюдаться и при переключении ключей по фазам. В обоих вариантах коммутации - при сдвиге на 180гр и на 120гр - надо иметь чёткое попадание в точки на синусе, соответствующие 30*N = (Пи/6)*N градусов .
  7. Да, в схеме управления, которую я пытаюсь реализовать, ШИМ подаётся только на верхние ключи фаз. Я мысль вроде ухватил. Только вот мне кажется для схемы со сдвигом на 180гр. надо старший бит синуса использовать. Тогда можно для нижнего ключа делать if(PWM1 & 0x80)LOW_KEY1 =1; Ну и для остальных фаз так же.
  8. Так я это и делаю, только через значение синуса. А вот это отчего то не пришло в голову... Действительно просто. Спасибо за очередную подсказку! На каждую фазу по два ключа - к плюсу и к земле.
  9. Не смог пока придумать приемлемый вариант переключения ШИМ-синуса между верхними и нижними ключами. Реализовал на данный момент такой вариант: отслеживаю значения синуса и при значении, совпадающим с нужной фазой, переключаюсь. Устраивает в этом методе то, что есть dead-time между выключением верхнего и включением нижнего ключа (и наоборот). Не устраивает то, что всё это делается в прерывании формирования ШИМ и длительность прерывания сильно увеличивается (но, как ни странно, ШИМ по-прежнему формируется нормально).
  10. После преодоления этапа получения синуса через DDS возникла проблема с тем, какая часть этого синуса используется. Судя по коммутационным диаграммам (с замыканием нижних ключей в фазах на землю без ШИМ), используется только половина периода от 0 до 180гр. Вот картинка по сигналам на входах драйверов ключей нечётные - верхние ключи, чётные - нижние.
  11. Вот нашёл такую формулу: sin3(q) = sin(q)+1/6sin(3q). Она похоже иллюстрирует Ваш метод)
  12. Да, я в курсе. только пока не разобрался как получить эту кракозябру. Преобразованием Фурье не очень хочется заморачиваться)))
  13. Я об этом не знал. Благодарю за подсказку. Ок. Переписал) Кстати сказать, ни объём данных, ни объём программы не изменились после компиляции...
  14. А в чём выгода? Каким образом этот режим ШИМ уменьшит вторую гармонику синуса? Мне бы надо третью гармонику прикрутить к синусу, чтобы динамический диапазон по амплитуде на обмотках поднять.
  15. Урааа!!! Спасибо Вам огромное! Особенно за ангельское терпение в общении с таким тугим собеседником, как я))) Это первый DDS, который я написал)
  16. Я переписал таблицу на 32 значения. Здесь я полностью с Вами согласен) Вы меня окончательно сбили с толку. Если не затруднит, напишите пожалуйста как должна выглядеть формула подсчёта номера в таблице значений синуса. 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; } }
  17. Вот в этой части Вашего ответа я не смог разобраться. Извините за тугодумство Почему удобно делать таблицу размером кратным степени двойки я понял. А вот что означает фраза "Как остаток от деления (100*x)/(65536/36) на 36."? Я думаю, что всё таки не остаток от деления, а целая часть числа, полученного при делении. 65536/размер_таблицы - это константа, её надо один раз посчитать и целую часть вставить в формулу. Я просто для иллюстрации хода своих рассуждений вставил это действие в формулу.
  18. Я заранее извиняюсь за свою бестолковость, но я запутался У меня таблица синуса 36 значений (через 10 градусов), фазовый аккумулятор 16 разрядов. Правильно ли я понимаю, что если приращение фазы будет, скажем 100, то номер значения в таблице будет считаться как n = (100*х)/(65536/36), где х-число итераций с частотой ШИМ?
  19. А Вашей формуле "х" - это значение АЦП, а "к" - на сколько разрядов сдвинуть ?
  20. Ну да, ведь аккумулятор всё время крутит фазу по кругу с частотой ШИМ и заданным шагом приращения.
  21. К самому синтезу синуса АЦП не имеет отношения. АЦП снимает напряжение с движка потенциометра регулировки частоты. А результат преобразования используется для задания приращения аккумулятора фазы. Да Спасибо большое за доходчивое объяснение. Мне только осталось неясно сколько же значений в таблицу синуса нужно...
  22. Кажется я погорячился))) Можно же взять 16-ти битный аккумулятор и к 10-ти битному значению АЦП добавлять 64512, т.е ADC[10:0] | 0xFC00. Тогда АЦП будет использоваться полностью, а шаг частоты останется 0,477.
×
×
  • Создать...