Разрабатываю частотник для АД, подскажите пожалуйста.

Блоки питания, преобразователи напряжения, UPS'ы - это здесь :)
Ответить
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Пн май 28, 2018 11:19:03

Сообщение Oleg.normalniy »

asvhmao было-бы очень интересно особенно цифровую часть если вас ето не затруднит
Реклама
Друг Кота
Сообщения: 3027
Зарегистрирован: Чт июн 26, 2014 00:04:37

Сообщение DC-AC »

Ответ по вопросу о формуле расчёта синуса
Олег Олегович писал(а):формулу расчёта табличных значений шим.
Табличные значения рассчитываются под конкретный алгоритм программы.
Общая только функция 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 градуса шагает.
А множить на период таймера - это что амплитуда?
Реклама
Потрогал лапой паяльник
Сообщения: 347
Зарегистрирован: Вт авг 20, 2019 19:00:41

Сообщение Олег Олегович »

DC-AC, Да это амплитуда . То есть получается обе формулы правильные. У вас забиты готовые таблицы или вы находу амплитуду меняете в зависимости от частоты?
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Сообщения: 347
Зарегистрирован: Вт авг 20, 2019 19:00:41

Сообщение Олег Олегович »

DC-AC, На сколько помню у вас 360 точек то есть при изменении частоты нужно заходит в цикл и переписывать 360 значений массива . И что pic успевает это делать ???Или вы берете массив один и тот же и просто множите его уменьшая или увеличивая значения ?
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 179
Зарегистрирован: Ср окт 07, 2015 13:13:40
Откуда: МО, г. Воскресенск

Сообщение Sanchogus »

Зачем считать все, если нужно вычислить только следующее значение?
Контактная информация:
Реклама
Потрогал лапой паяльник
Сообщения: 347
Зарегистрирован: Вт авг 20, 2019 19:00:41

Сообщение Олег Олегович »

Sanchogus, Если частота выростить на 1 герц то нужен полностью пересчитанный массив то есть на 360 градусов синусоиды нужно пересчитать все значения. Вы имеете в виду считать каждый градус ?
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 179
Зарегистрирован: Ср окт 07, 2015 13:13:40
Откуда: МО, г. Воскресенск

Сообщение Sanchogus »

Считать только следующий угол, исходя из текущего задания. Как по мне проще держать массив для 100% амплитуды и плясать от него.

Смотрим какая должна быть частота и в зависимости от U(f) = const пересчитываем амплитуду и суем ее в новый угол.
Контактная информация:
Друг Кота
Сообщения: 3027
Зарегистрирован: Чт июн 26, 2014 00:04:37

Сообщение DC-AC »

Зачем всё пересчитывать, просто множатся исходные значения, напряжение не зависит от выходной частоты (в смысле построения программы, можно задать любое на любой частоте просто изменив задание)
Потрогал лапой паяльник
Сообщения: 347
Зарегистрирован: Вт авг 20, 2019 19:00:41

Сообщение Олег Олегович »

DC-AC, Пробовал умножить. Получается вот что: к примеру берём значение из таблицы 500 при периоде таймера 1000, тогда верхний и нижний ключи открыты одинаково (мёртвое время не считаем ), так вот если мы просто множим значение 500 к примеру на 0.2 то получается что амплитуда на выходе падает НО за счет закрытия верхнего ключа, тоесть верхний ключ открыт меньше, а нижний так как он комплементарный больше в следствии чего нижний ключ кипит, а верхний холодный . Я перечитывал таблицу на ходу - для уменьшения амплитуды увеличивал время нулевых векторов . Что скажете, может есть какой-то еще вариант ?
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 179
Зарегистрирован: Ср окт 07, 2015 13:13:40
Откуда: МО, г. Воскресенск

Сообщение Sanchogus »

Ну так логично, что надо приводить значение к нужному виду.
У меня таблица в виде от 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;
Беру половину периода таймера в данный момент (он у меня плавает в процессе работы) 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;
	
	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

Сообщение Олег Олегович »

У вас период таймера не константа?
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 179
Зарегистрирован: Ср окт 07, 2015 13:13:40
Откуда: МО, г. Воскресенск

Сообщение Sanchogus »

Нет. Я периодом таймера задаю выходную частоту. При этом держу частоту ШИМ в диапазоне 3-6 кГц.
На низких частотах повторяю один и тот же цикл несколько раз.
При ускорении начинаю выкидывать углы. До 50 Гц шаг 3 градуса, после 6 и выше.

Рассматривал вариант с DDS генератором, но чет до конца не вкурил, как при низкой частоте тактирования обеспечить стабильную выходную частоту без дрожания фронтов.
Контактная информация:
Потрогал лапой паяльник
Сообщения: 347
Зарегистрирован: Вт авг 20, 2019 19:00:41

Сообщение Олег Олегович »

Sanchogus, А какой мк используете ? Я пока f103 но заказал f303 хочу на неё перейти .

Добавлено after 1 minute 58 seconds:
Сегодня дополню формулу чтоб была и амплитуда .Выложу.
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 179
Зарегистрирован: Ср окт 07, 2015 13:13:40
Откуда: МО, г. Воскресенск

Сообщение Sanchogus »

F103c8t6, но рисую вариант stm32g070kb. Удобный корпус для пайки 32 пина, 2 ноги питания, норм цена, 2.5 Мсемпла ацп и куча таймеров.
В качестве силы был 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_ можно менять время работы нулевых векторов соответственно и амплитуду на выходе .
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 179
Зарегистрирован: Ср окт 07, 2015 13:13:40
Откуда: МО, г. Воскресенск

Сообщение Sanchogus »

Для проверки построить в экселе график для всех углов с ячейкой под задание амплитуды.
Если при нулевой амплитуде будет линия по уровню 50%, а при 100% синус на полный размах от нуля до макс заполнения в вершинах, то норм.
Контактная информация:
Потрогал лапой паяльник
Сообщения: 347
Зарегистрирован: Вт авг 20, 2019 19:00:41

Сообщение Олег Олегович »

Sanchogus, Смотрел значения в массиве так и есть .
Модератор
Аватара пользователя
Сообщения: 19055
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

Олег Олегович писал(а):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 - это среднее значение ШИМ, означающее нулевое значение напряжения (нулевую амплитуду).
вот, к этому среднему и прибавляем значение синуса, умноженного на требуемую амплитуду.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 179
Зарегистрирован: Ср окт 07, 2015 13:13:40
Откуда: МО, г. Воскресенск

Сообщение Sanchogus »

А значения синуса раскидать по таблице, т.к. нечего на МК считать операции с плавающей точкой без FPU. :)
я считаю, должно быть так:
arr_pwm_1 [a_] = 500 + sin (a_ / 57.29578) * amplituda_.
Может амплитуду еще на полпериода (500) умножить?
Если будет угол, который сделает синус единицей, то получим при 100% амплитуде 500 + 1*100, что несколько недотягивает до тысячи, ну и при вычислении синуса = -1 получим выражение 500-1*100 = 400, вместо нуля.
Амплитуду умножить на полупериод и поделить на сотню еще. Ну или использовать амплитуду 0...1.


Пользуясь случаем: Есть у кого под рукой названия хороших книг посвященных управлению асинхронным двигателем и векторному управлению АД, желательно с практической точки зрения. :idea:
Контактная информация:
Ответить

Вернуться в «Питание»