Как автор рассчитал время сравнения в ардуино мега 2560

Ван Зунг
Offline
Зарегистрирован: 27.07.2022
Здравствуйте!
Я нашел код по методу векторной ШИМ. чилал и думал, но не понял. время T0, T1 , T2 мы знаем по формуле.
Но когда в коде автор написал такие значения t1_compA = 59664; t1_compB = 65008;...
Подскажите, пожалуйста! Как рассчитать, чтобы получить такие значения?
const uint16_t t_load = 59136;
const uint16_t t1_compA = 59664;
const uint16_t t1_compB = 65008;
const uint16_t t3_compA = 60240;
const uint16_t t3_compB = 64432;
const uint16_t t4_compA = 61808;
const uint16_t t4_compB = 62864;
const uint16_t t5_compA = 61232;
https://github.com/083chandan/SpaceVector_PWM/blob/master/refrences/Timing%20diagram/Waveforms%20Timings.pngt uint16_t t5_compB = 63440;

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Перестарался со вставкой кода, ничего не понятно - где код, где текст, где комментарии...

sadman41
Offline
Зарегистрирован: 19.10.2016

Берётся значение времени и делится на длительность такта МК и ещё раз делится на на предделитель таймера. Полученное будет искомым кол-вом тактов, которое и используется как точки сравнения А и B (COMPA и COMPB) для таймера.

Ван Зунг
Offline
Зарегистрирован: 27.07.2022
Я закрепил ссылку.
Я нашел код по методу векторной ШИМ. чилал и думал, но не понял. время T0, T1 , T2 мы знаем по формуле.
Но когда в коде автор написал такие значения t1_compA = 59664; t1_compB = 65008;...
Подскажите, пожалуйста! Как рассчитать, чтобы получить такие значения?
https://github.com/083chandan/SpaceVector_PWM/blob/master/refrences/Timing%20diagram/Waveforms%20Timings.png
BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Так ты прочти внимательнее что тебе в #2 написали!

Ван Зунг
Offline
Зарегистрирован: 27.07.2022

то есть: на пример для t1_compA = 59664;  t1_compA = 334us/(1/16e6)/256.

Скажите, как правильно рассчиать?

Ван Зунг
Offline
Зарегистрирован: 27.07.2022

в проекте, они рассчитали и объяснили как получить время.

А в коде шесть разных времени, Вы можете объяснить как получить такие времени?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

А так понятнее ?

59136 - начало отсчета

59136 0
59664 528 33 33
60240 1104 69 36
61232 2096 131 62
61888 2752 172 41
62864 3728 233 61
64432 5296 331 98
65008 5872 367 36
65536 6400 400 33
 
65536 - конец отсчета (при переполнении вызовется прерывание и в счетчик загрузится 59136)
 
Автор кода не учитывает накладные расходы на вызов прерывания и перезагрузку счетчика - цикл будет несколько больше чем 400 мс !
 
Имхо - можно было бы одним таймером обойтись - загружая разные значения в OCR ... Задействовать кучу таймеров и при этом дергать пины вручную - БРЕД !!!
Ван Зунг
Offline
Зарегистрирован: 27.07.2022

Большое спасибо Вам за помощь!

Скажите, пожалуйста! как перенаписать код, чтобы равно 1/2500=400 ms.

И можно ли подключить потенцимеотр, чтобы получить переменную частоту? 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Вы делить не умеете ! 1/2500=0.000400 это 400 мкС как в скетче.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018
Ван Зунг
Offline
Зарегистрирован: 27.07.2022

Автор кода не учитывает накладные расходы на вызов прерывания и перезагрузку счетчика - цикл будет несколько больше чем 400 мс !
Мой вопрос в вашем ответе.
Скажите, как поправить код, ровно 400 us?
Я загурузил .hex в протусе, измерил но не точно.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Создайте в Proteus проект с кодом. Скопируйте код и запустите отладку. Точки останова ставьте там где меняется состояние сигналов. В окне просмотра регистров AVR есть счетчик тактов - по нему и считайте/подгоняйте значения, которые грузятся в таймеры.