Табличные значения рассчитываются под конкретный алгоритм программы. Общая только функция y=sin(ωt)+Kп*sin(3ωt), Kп - коэффициент предмодуляции третьей гармоникой (0,15-0,20), выбирать исходя их конкретного формирователя ШИМ, как ограничение устроено, исходя из конкретного алгоритма. Подходит и для описания сектора под SVPWM. На 10квт в звезде пойдёт модуль BSM50, да и 75 само собой. ωt - образуют угол в радианах, ω - 2пf - угловая частота, t - время. Это стандартная формула. У Вас
Олег Олегович писал(а):
y=sin ((2×3.14 × c )/180 )+1 × (a) где С это точка синусоиды то есть от 0 до 180 . А это период таймера
, то-же самое 2п*с/180 - это шаг синусоиды, по 2 градуса шагает. А множить на период таймера - это что амплитуда?
DC-AC, Да это амплитуда . То есть получается обе формулы правильные. У вас забиты готовые таблицы или вы находу амплитуду меняете в зависимости от частоты?
DC-AC, На сколько помню у вас 360 точек то есть при изменении частоты нужно заходит в цикл и переписывать 360 значений массива . И что pic успевает это делать ???Или вы берете массив один и тот же и просто множите его уменьшая или увеличивая значения ?
Sanchogus, Если частота выростить на 1 герц то нужен полностью пересчитанный массив то есть на 360 градусов синусоиды нужно пересчитать все значения. Вы имеете в виду считать каждый градус ?
Зачем всё пересчитывать, просто множатся исходные значения, напряжение не зависит от выходной частоты (в смысле построения программы, можно задать любое на любой частоте просто изменив задание)
DC-AC, Пробовал умножить. Получается вот что: к примеру берём значение из таблицы 500 при периоде таймера 1000, тогда верхний и нижний ключи открыты одинаково (мёртвое время не считаем ), так вот если мы просто множим значение 500 к примеру на 0.2 то получается что амплитуда на выходе падает НО за счет закрытия верхнего ключа, тоесть верхний ключ открыт меньше, а нижний так как он комплементарный больше в следствии чего нижний ключ кипит, а верхний холодный . Я перечитывал таблицу на ходу - для уменьшения амплитуды увеличивал время нулевых векторов . Что скажете, может есть какой-то еще вариант ?
Беру половину периода таймера в данный момент (он у меня плавает в процессе работы) sg_inverter.tim_arr_half и прибавляю к нему еще кусок из половины периода*текущий угол*амплитуда (0-100) и делю на хитропопое число (100 от амплитуды*1000от макс табличного ШИМ). В итоге получаю при нулевой амплитуде ровно половину периода (т.е. меандр), который по мере увеличения амплитуды становиться синусом. Для остальных четвертей свои расчеты, но аналогично. Спойлер
Код:
//по заданному углу и амплитуде возвращает коэф. заполнения ШИМ uint32_t sg_inverter_pwm_calc(uint16_t angle, uint16_t *amplitude, uint16_t *freq) //т.к. таблица только на одну четверть синуса, то недостающие углы вычисляем нехитрыми математическими операциями { uint32_t buffer; if (angle > 359) angle-= 359; //если как-то убежали за диапазон, то возвращаемся в него, по идее надо выпилить отсюда if (sg_inverter.amplitude > 100) sg_inverter.amplitude = 100;
Нет. Я периодом таймера задаю выходную частоту. При этом держу частоту ШИМ в диапазоне 3-6 кГц. На низких частотах повторяю один и тот же цикл несколько раз. При ускорении начинаю выкидывать углы. До 50 Гц шаг 3 градуса, после 6 и выше.
Рассматривал вариант с DDS генератором, но чет до конца не вкурил, как при низкой частоте тактирования обеспечить стабильную выходную частоту без дрожания фронтов.
F103c8t6, но рисую вариант stm32g070kb. Удобный корпус для пайки 32 пина, 2 ноги питания, норм цена, 2.5 Мсемпла ацп и куча таймеров. В качестве силы был stgips20k60 (точнее он и сейчас есть), сейчас смотрю под ikcm20l60, ибо дешевле (500-600 р за модуль). Целевая мощность 1.5-2.2 кВт в зависимости от модуля.
arr_pwm_1 [a_] =(( sin ((2 * 3.14) * a_ / 180) +1 )* amplituda_ + (500 - amplituda_)); Такая получилась формула .Изменяя amplituda_ можно менять время работы нулевых векторов соответственно и амплитуду на выходе .
Для проверки построить в экселе график для всех углов с ячейкой под задание амплитуды. Если при нулевой амплитуде будет линия по уровню 50%, а при 100% синус на полный размах от нуля до макс заполнения в вершинах, то норм.
ошибочка тут закралась. чтобы перевести градусы в радианы, либо не должно быть двойки, либо делить на 360. а поскольку все равно используется плавающая точка (число 3,14), то проще угол делить сразу на величину 1 радиана в градусах. в итоге, вместо такого нагромождения приходим к выражению: sin (a_ / 57.29578) и к слову, 3,14 - очень грубое приближения числа Пи для подобных расчетов. а также вся формула ошибочна. нет необходимости прибавлять 1 к значению синуса. я считаю, должно быть так: arr_pwm_1 [a_] = 500 + sin (a_ / 57.29578) * amplituda_. как я понял из последних постов, 500 - это среднее значение ШИМ, означающее нулевое значение напряжения (нулевую амплитуду). вот, к этому среднему и прибавляем значение синуса, умноженного на требуемую амплитуду.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
А значения синуса раскидать по таблице, т.к. нечего на МК считать операции с плавающей точкой без FPU.
Цитата:
я считаю, должно быть так: arr_pwm_1 [a_] = 500 + sin (a_ / 57.29578) * amplituda_.
Может амплитуду еще на полпериода (500) умножить? Если будет угол, который сделает синус единицей, то получим при 100% амплитуде 500 + 1*100, что несколько недотягивает до тысячи, ну и при вычислении синуса = -1 получим выражение 500-1*100 = 400, вместо нуля. Амплитуду умножить на полупериод и поделить на сотню еще. Ну или использовать амплитуду 0...1.
Пользуясь случаем: Есть у кого под рукой названия хороших книг посвященных управлению асинхронным двигателем и векторному управлению АД, желательно с практической точки зрения.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 46
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения