ну, я был не в курсе, что максимальная амплитуда равна у вас 100. но ничто не мешает сделать ее 500. зачем нагружать МК еще дополнительными вычислениями, чтобы 100 превратить в 500. не нужен там нигде полупериод в сомножителях. где-то в другом месте должно вычисляться значение градусов от прошедшего времени (от величины периода). а в приведенной формуле фигурирует уже готовое значение градусов. но я не возражаю, если прямо в эту формулу вставить вычисление градусов, а не считать его отдельно. но суть от того, где и как вычисляются градусы, не меняется.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Вот так получается самое то for ( int y =0; y < 181 ; y ++) { arr_pwm_1 [y] =500 + sin ( y / 57.29578) * amplituda; } Амплитуда от 1 до 500. Но приходится использовать цикл а это время в итоге мк не совсем успевает . Если сделать массив на 50 значений то движок работает мягенько но значений амплитуды всего 50. Может таки попробовать забить готовые значения синуса и просто их подставлять ?
Не надо каждый раз молотить весь массив. Нужно считать только три значения для выбранной амплитуды: Коэф заполнения для ШИМ каналов для угла который надо выставить X, X +120 градусов и X +240 градусов.
Какой смысл каждый раз пересчитывать всю таблицу, если в любой момент может прилететь задание на смену частоты и амплитуды.
Выкинуть операции с плавающей точкой. Перемножать десятки тысяч для 32-битного МК будет приятнее, чем считать плавающую точку. В идеале не использовать float, double и т.п. Только следить, что бы за 2^32 не выходили.
Таблица для 100% синуса явно проще, останется только вычислить амплитуду.
так ясен фуй, что брать из таблицы во много раз быстрее, чем вычислять синус ... а таблицу можно сделать любого размера, хоть на 1000 значений. а чтобы не мучится с анализом, в каком квадранте находимся, а потом еще применять разные формулы в зависимости от знака синуса, сделать на весь период (0-360 градусов), а не на одну четверть. и пусть в таблице будут отрицательные значения синуса - МК их поймет правильно. взял значение прямо из таблицы, умножил на амплитуду и прибавил 500.
да, далеко не всегда нужна плавающая точка. в подавляющем большинстве случаев хватает целочисленной арифметики. есть одна древняя программистская хитрость, когда в целых числах нужно умножить на число меньше 1. такой сомножитель представляет число, которое при делении, например, на 65536 получает нужное дробное число. например, нужно дробное число 0,327. умножаем 0,327 * 65536 = 21430. далее наше число умножаем на 21430 и отбрасываем 2 младших байта (делим на 65536). в результате получаем умножение на 0,327.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
a++; b ++; c ++; arr_pwm_1 [a] =500 + arr_sin [a] * amplituda; Вот так сделал То есть заходим в прерывание и пересчитываем одновременно следующее значение синуса и амплитуду
Добавлено after 1 minute 57 seconds: Но если резко менять частоту то вибрация немного есть .
Было дело. Auto reload preload включен в таймере? Ну и в целом надо сидеть и искать узкие места. По хорошему сидеть с лог. анализатором и искать аномалии в ШИМ. .
Sanchogus, С готовой таблицы забитой в память работает вообще чётко. Но в таблицу данные забивал с сайта proqont.ru Как по мне одно значение амплитуды на 1 герц частоты для скалярника достаточно даже если корректировать амплитуду при изменении DC звена .
строго говоря, при линейной зависимости напряжения от частоты нужно добавлять некоторое напряжение, равное падению на обмотке двигателя при заданном токе. то есть, даже если задать частоту НОЛЬ, то на двигатель всё равно должно поступать напряжение, для обеспечения тока в обмотках. и формула для расчета амплитуды будет выглядеть как сумма некоторой константы и зависимости напряжения от частоты.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Starichok51, Вы имеете в виду чтоб когда 0 герц подавать напругу чтоб вал не крутился ? Вообще на графиках видно что амплитуда начинается не с ноля , как вы правильно подметили ,а с какого-то напряжение . Я сделал так что начальную амплитуду можно задавать в меню. А к примеру у danfosa можно в ручную задавать амплитуду на разных частотах. Применял это на практике очень удобно , особенно когда двигатель с перемотки уже .
Добавлено after 2 minutes 12 seconds: Кто нибуть пользовался аппаратным модулем вычислении плавающей точки ? Его нужно как то вызвать или он автоматом работает ?
с Данфоссами мне приходилось работать. они могут автоматически вычислить сопротивление обмоток и эту "добавку" напряжения, как я помню, тоже могут вычислить автоматически. но если автонастройку не запускать, то да, можно задать вручную. крутизну характеристики (Вольт/Гц), как я понимаю, Данфосс тоже вычисляет автоматически. например, двигатель на 380 Вольт, а "добавка" напряжения равна 30 Вольт. тогда крутизна будет равна (380 - 30) / 50 = 7 Вольт/Гц.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Starichok51, Вы имеете в виду для компенсации скольжения изменять амплитуду под нагрузкой ? Типа если двигатель на 10 кВт то при токе в 2 ампера скольжение его вырастит на какой - то градус , чтоб это скомпенсировать добавляем к примеру 10 вольт.?
Странная аномалия получается у меня использую такую формулу arr_pwm_1 [t] =500 + (arr_sin [t] * amplituda); За 1000 не выходим синусоида тока идеальная на всех частотах Двигатель работает мягенько но ток потребления даже на 50 герцах 1 ампер движок кипит уже не знаю куда смотреть.
скольжение не измеряется в градусах, это относительные единицы или проценты если на 100 умножать s=(n0-n)/n0, n0 - частота вращения поля, об/мин, n - частота вращения ротора, об/мин. Как вы разрабатываете систему управления откройте сначала книжку по эл. машинам. 1А ток - мощность двигателя, как подключен и какое напряжение на него подаётся? Чем и где измерялся ток, который 1А
DC-AC, Я не много не правильно выразился . Я имел в виду что если на вал двигателя приложить усилие то скорость вращения ротора будет замедляется а ток в обмотках статора увеличится. Так вот если к примеру при увеличении тока на 10 процентов от тока холостого хода увеличить частоту или амплитуду ( но лучше думаю частоту ) то можно компенсировать замедление ротора под нагрузкой. По поводу тока в 1 ампер не заметил амплитуда была слишком большая аж 270 вольт на 50 герц ах.
В интернете есть такие синусоиды векторной шим. ВОПРОС зачем ее в пике то есть 90 градусов провал если бы было без провала кпд был бы больше ? И каким образом можно его достичь? Или это из-за смещение центра ?
Добавлено after 3 minutes 37 seconds: Starichok51, При 25 герцах амплитуда была около 270 вольт вот движок и кипел . Когда увеличил таблицу с 180 до 360 значений не поменял таймер . Вот показометр показывал 50 а по факту было 25 а амплитуда у меня привязана к частоте .
Это и есть векторная ШИМ, или ШИМ с третьей гармоникой. Позволяет использовать весь потенциал DC-звена, в отличии от чистого синуса. Формулы, вроде как уже кидали тут.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 38
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения