Разрабатываю частотник для АД, подскажите пожалуйста.
- Сообщения: 183
- Зарегистрирован: Пн май 28, 2018 11:19:03
asvhmao было-бы очень интересно особенно цифровую часть если вас ето не затруднит
- Реклама
- Сообщения: 3027
- Зарегистрирован: Чт июн 26, 2014 00:04:37
Ответ по вопросу о формуле расчёта синуса
Общая только функция y=sin(ωt)+Kп*sin(3ωt), Kп - коэффициент предмодуляции третьей гармоникой (0,15-0,20), выбирать исходя их конкретного формирователя ШИМ, как ограничение устроено, исходя из конкретного алгоритма. Подходит и для описания сектора под SVPWM.
На 10квт в звезде пойдёт модуль BSM50, да и 75 само собой.
ωt - образуют угол в радианах, ω - 2пf - угловая частота, t - время. Это стандартная формула. У Вас
А множить на период таймера - это что амплитуда?
Табличные значения рассчитываются под конкретный алгоритм программы.Олег Олегович писал(а):формулу расчёта табличных значений шим.
Общая только функция y=sin(ωt)+Kп*sin(3ωt), Kп - коэффициент предмодуляции третьей гармоникой (0,15-0,20), выбирать исходя их конкретного формирователя ШИМ, как ограничение устроено, исходя из конкретного алгоритма. Подходит и для описания сектора под SVPWM.
На 10квт в звезде пойдёт модуль BSM50, да и 75 само собой.
ωt - образуют угол в радианах, ω - 2пf - угловая частота, t - время. Это стандартная формула. У Вас
, то-же самое 2п*с/180 - это шаг синусоиды, по 2 градуса шагает.Олег Олегович писал(а):y=sin ((2×3.14 × c )/180 )+1 × (a) где С это точка синусоиды то есть от 0 до 180 . А это период таймера
А множить на период таймера - это что амплитуда?
Обновления, документация, схемы и прошивки Восьмикрута - yandex
Обновления, документация, схемы и прошивки Восьмикрута - google
Видео ролики YouTube RuTube Дзен
Обновления, документация, схемы и прошивки Восьмикрута - google
Видео ролики YouTube RuTube Дзен
- Сообщения: 347
- Зарегистрирован: Вт авг 20, 2019 19:00:41
DC-AC, Да это амплитуда . То есть получается обе формулы правильные. У вас забиты готовые таблицы или вы находу амплитуду меняете в зависимости от частоты?
- Сообщения: 3027
- Зарегистрирован: Чт июн 26, 2014 00:04:37
В HD Восьмикруте множится на ходу, но исходная U/f в таблице
Обновления, документация, схемы и прошивки Восьмикрута - yandex
Обновления, документация, схемы и прошивки Восьмикрута - google
Видео ролики YouTube RuTube Дзен
Обновления, документация, схемы и прошивки Восьмикрута - google
Видео ролики YouTube RuTube Дзен
- Сообщения: 347
- Зарегистрирован: Вт авг 20, 2019 19:00:41
DC-AC, На сколько помню у вас 360 точек то есть при изменении частоты нужно заходит в цикл и переписывать 360 значений массива . И что pic успевает это делать ???Или вы берете массив один и тот же и просто множите его уменьшая или увеличивая значения ?
- Реклама
Зачем считать все, если нужно вычислить только следующее значение?
- Сообщения: 347
- Зарегистрирован: Вт авг 20, 2019 19:00:41
Sanchogus, Если частота выростить на 1 герц то нужен полностью пересчитанный массив то есть на 360 градусов синусоиды нужно пересчитать все значения. Вы имеете в виду считать каждый градус ?
Считать только следующий угол, исходя из текущего задания. Как по мне проще держать массив для 100% амплитуды и плясать от него.
Смотрим какая должна быть частота и в зависимости от U(f) = const пересчитываем амплитуду и суем ее в новый угол.
Смотрим какая должна быть частота и в зависимости от U(f) = const пересчитываем амплитуду и суем ее в новый угол.
- Сообщения: 3027
- Зарегистрирован: Чт июн 26, 2014 00:04:37
Зачем всё пересчитывать, просто множатся исходные значения, напряжение не зависит от выходной частоты (в смысле построения программы, можно задать любое на любой частоте просто изменив задание)
Обновления, документация, схемы и прошивки Восьмикрута - yandex
Обновления, документация, схемы и прошивки Восьмикрута - google
Видео ролики YouTube RuTube Дзен
Обновления, документация, схемы и прошивки Восьмикрута - google
Видео ролики YouTube RuTube Дзен
- Сообщения: 347
- Зарегистрирован: Вт авг 20, 2019 19:00:41
DC-AC, Пробовал умножить. Получается вот что: к примеру берём значение из таблицы 500 при периоде таймера 1000, тогда верхний и нижний ключи открыты одинаково (мёртвое время не считаем ), так вот если мы просто множим значение 500 к примеру на 0.2 то получается что амплитуда на выходе падает НО за счет закрытия верхнего ключа, тоесть верхний ключ открыт меньше, а нижний так как он комплементарный больше в следствии чего нижний ключ кипит, а верхний холодный . Я перечитывал таблицу на ходу - для уменьшения амплитуды увеличивал время нулевых векторов . Что скажете, может есть какой-то еще вариант ?
Ну так логично, что надо приводить значение к нужному виду.
У меня таблица в виде от 0 до 1000 для четверти периода
После чего идет расчет амплитуды
Беру половину периода таймера в данный момент (он у меня плавает в процессе работы) sg_inverter.tim_arr_half и прибавляю к нему еще кусок из половины периода*текущий угол*амплитуда (0-100) и делю на хитропопое число (100 от амплитуды*1000от макс табличного ШИМ).
В итоге получаю при нулевой амплитуде ровно половину периода (т.е. меандр), который по мере увеличения амплитуды становиться синусом.
Для остальных четвертей свои расчеты, но аналогично.
У меня таблица в виде от 0 до 1000 для четверти периода
Спойлер
Код: Выделить всё
uint16_t sinTableArray[90] = { //четверть таблицы модифицированного синуса, растянутая с 500...1000 до 0...1000
0 , 28, 58 , 88, 118, 148, 178, 208, 238, 268, //0-9
298, 328, 358, 388, 416, 446, 476, 504, 532, 562, //10-19
590, 618, 646, 674, 702, 730, 756, 784, 810, 838, //20-29
864, 872, 880, 888, 896, 904, 912, 918, 924, 932, //30-39
938, 944, 948, 954, 958, 964, 968, 972, 976, 980, //40-49
982, 986, 988, 990, 992, 994, 996, 996, 996, 998, //50-59
998, 998, 996, 996, 996, 994, 992, 990, 988, 986, //60-69
982, 980, 976, 972, 968, 964, 958, 954, 948, 944, //70-79
938, 932, 924, 918, 912, 904, 896, 888, 880, 872 //80-89
};Код: Выделить всё
if (angle < 90) // 0-89
{
buffer = sg_inverter.tim_arr_half + (sg_inverter.tim_arr_half * sinTableArray[angle] * sg_inverter.amplitude) / 100000;
return buffer;В итоге получаю при нулевой амплитуде ровно половину периода (т.е. меандр), который по мере увеличения амплитуды становиться синусом.
Для остальных четвертей свои расчеты, но аналогично.
Спойлер
Код: Выделить всё
//по заданному углу и амплитуде возвращает коэф. заполнения ШИМ
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;
if (angle < 90) // 0-89
{
buffer = sg_inverter.tim_arr_half + (sg_inverter.tim_arr_half * sinTableArray[angle] * sg_inverter.amplitude) / 100000;
return buffer;
}
else
if(angle < 180) // 90-179
{
buffer = sg_inverter.tim_arr_half + (sg_inverter.tim_arr_half * sinTableArray[179 - angle] * sg_inverter.amplitude) / 100000;
return buffer;
}
else
if(angle < 270) // 180-269
{
buffer = sg_inverter.tim_arr_half - (sg_inverter.tim_arr_half * (sinTableArray[angle - 180]) * sg_inverter.amplitude) / 100000;
return buffer;
}
else // 270-359
{
buffer = sg_inverter.tim_arr_half - (sg_inverter.tim_arr_half * (sinTableArray[359 - angle]) * sg_inverter.amplitude) / 100000;
return buffer;
}
};
- Сообщения: 347
- Зарегистрирован: Вт авг 20, 2019 19:00:41
Нет. Я периодом таймера задаю выходную частоту. При этом держу частоту ШИМ в диапазоне 3-6 кГц.
На низких частотах повторяю один и тот же цикл несколько раз.
При ускорении начинаю выкидывать углы. До 50 Гц шаг 3 градуса, после 6 и выше.
Рассматривал вариант с DDS генератором, но чет до конца не вкурил, как при низкой частоте тактирования обеспечить стабильную выходную частоту без дрожания фронтов.
На низких частотах повторяю один и тот же цикл несколько раз.
При ускорении начинаю выкидывать углы. До 50 Гц шаг 3 градуса, после 6 и выше.
Рассматривал вариант с DDS генератором, но чет до конца не вкурил, как при низкой частоте тактирования обеспечить стабильную выходную частоту без дрожания фронтов.
- Сообщения: 347
- Зарегистрирован: Вт авг 20, 2019 19:00:41
Sanchogus, А какой мк используете ? Я пока f103 но заказал f303 хочу на неё перейти .
Добавлено after 1 minute 58 seconds:
Сегодня дополню формулу чтоб была и амплитуда .Выложу.
Добавлено after 1 minute 58 seconds:
Сегодня дополню формулу чтоб была и амплитуда .Выложу.
F103c8t6, но рисую вариант stm32g070kb. Удобный корпус для пайки 32 пина, 2 ноги питания, норм цена, 2.5 Мсемпла ацп и куча таймеров.
В качестве силы был stgips20k60 (точнее он и сейчас есть), сейчас смотрю под ikcm20l60, ибо дешевле (500-600 р за модуль). Целевая мощность 1.5-2.2 кВт в зависимости от модуля.
В качестве силы был stgips20k60 (точнее он и сейчас есть), сейчас смотрю под ikcm20l60, ибо дешевле (500-600 р за модуль). Целевая мощность 1.5-2.2 кВт в зависимости от модуля.
- Сообщения: 347
- Зарегистрирован: Вт авг 20, 2019 19:00:41
arr_pwm_1 [a_] =(( sin ((2 * 3.14) * a_ / 180) +1 )* amplituda_ + (500 - amplituda_)); Такая получилась формула .Изменяя amplituda_ можно менять время работы нулевых векторов соответственно и амплитуду на выходе .
Для проверки построить в экселе график для всех углов с ячейкой под задание амплитуды.
Если при нулевой амплитуде будет линия по уровню 50%, а при 100% синус на полный размах от нуля до макс заполнения в вершинах, то норм.
Если при нулевой амплитуде будет линия по уровню 50%, а при 100% синус на полный размах от нуля до макс заполнения в вершинах, то норм.
- Сообщения: 347
- Зарегистрирован: Вт авг 20, 2019 19:00:41
Sanchogus, Смотрел значения в массиве так и есть .
ошибочка тут закралась.Олег Олегович писал(а):arr_pwm_1 [a_] =(( sin ((2 * 3.14) * a_ / 180) +1 )* amplituda_ + (500 - amplituda_))
чтобы перевести градусы в радианы, либо не должно быть двойки, либо делить на 360.
а поскольку все равно используется плавающая точка (число 3,14), то проще угол делить сразу на величину 1 радиана в градусах.
в итоге, вместо такого нагромождения приходим к выражению:
sin (a_ / 57.29578)
и к слову, 3,14 - очень грубое приближения числа Пи для подобных расчетов.
а также вся формула ошибочна.
нет необходимости прибавлять 1 к значению синуса.
я считаю, должно быть так:
arr_pwm_1 [a_] = 500 + sin (a_ / 57.29578) * amplituda_.
как я понял из последних постов, 500 - это среднее значение ШИМ, означающее нулевое значение напряжения (нулевую амплитуду).
вот, к этому среднему и прибавляем значение синуса, умноженного на требуемую амплитуду.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
А значения синуса раскидать по таблице, т.к. нечего на МК считать операции с плавающей точкой без FPU. 
Если будет угол, который сделает синус единицей, то получим при 100% амплитуде 500 + 1*100, что несколько недотягивает до тысячи, ну и при вычислении синуса = -1 получим выражение 500-1*100 = 400, вместо нуля.
Амплитуду умножить на полупериод и поделить на сотню еще. Ну или использовать амплитуду 0...1.
Пользуясь случаем: Есть у кого под рукой названия хороших книг посвященных управлению асинхронным двигателем и векторному управлению АД, желательно с практической точки зрения.
Может амплитуду еще на полпериода (500) умножить?я считаю, должно быть так:
arr_pwm_1 [a_] = 500 + sin (a_ / 57.29578) * amplituda_.
Если будет угол, который сделает синус единицей, то получим при 100% амплитуде 500 + 1*100, что несколько недотягивает до тысячи, ну и при вычислении синуса = -1 получим выражение 500-1*100 = 400, вместо нуля.
Амплитуду умножить на полупериод и поделить на сотню еще. Ну или использовать амплитуду 0...1.
Пользуясь случаем: Есть у кого под рукой названия хороших книг посвященных управлению асинхронным двигателем и векторному управлению АД, желательно с практической точки зрения.


