Вадим Н. 1 12 марта, 2022 Опубликовано 12 марта, 2022 · Жалоба Здравствуйте! Вопрос по эмуляции вынужденных колебаний. До сих пор читал этот форум наравне с другими источниками инф. по ПЛИС и т.п. Но вот назрел вопрос который показалось уместно задать здесь. Разрабатываю программу на Verilog (т.е. схему для ПЛИС) по управлению генератором переменного тока. Частота и ШИМ будут регулироваться обратной связью по току. Для тестирования нужна функция эмуляции вынужденных колебаний эл.тока. В окончательном варианте будет примерно такое на Verilog: module benchmark(); эмулятор #(.собств_частота(100 тактов)) inst1 ( .clk(clk), .pos // вынуждающее напряжение положительный полупериод 1 бит .neg // отрицательный полупериод 1 бит .ток // это собственно и есть сигнал обратной связи ); инвертор #(мин и макс частоты) uut ( сигналы управления ключами .обратная_связь(ток) ); endmodule Но для начала хотелось бы смоделировать ситуацию на хорошо знакомом мне языке программирования perl. Это поможет уяснить какие параметры нужны. И может пригодиться для генерации табличных функций на Verilog. И так, скрипт просто выводящий синусоиду в стандартный вывод: #!perl use Modern::Perl; my $PI = 3.1415926535; sin $PI/2 == 1.0 or die "assert pi"; my $lvl0 = 40; # середина строки шириной 80 символов my $ampl = 30; my $cur = 0; # начальный ток - 0 my $freq = 50; say 'x' x ($lvl0 + $ampl * sin($PI * 2 / $freq * $_)) for 1..100; как говорится, нет ни чего проще. Это у нас будут типа вынуждающие колебания ) Хотя это совершенно не наш случай. У нас вынуждающие колебания будут прямоугольной формы но это наверное потом. Собственно, мне нужна сама математика. Ну и физика для правильных названий параметров и пр. Для начала затухающие колебания рассмотрим. В принципе объяснение которое я могу понять - нашёл: https://pnu.edu.ru/media/filer_public/2013/04/03/lab59.pdf Но там формула для напряжения а не для тока, если я правильно понял. При затухающих колебаниях... Вот в орфографии perl: q(t) = q0 * e ** (-z * t) * cos(f * t + s0) где q(t) - заряд на конденсаторе в момент времени t q0 - --- в момент времени 0 z - коэффициент затухания = R/2L f - частота колебаний = (f0 ** 2 + z ** 2) ** 0.5 [т.е. корень квадратный] f0 - собственная частота контура = 1 / (L / C) ** 0.5 s0 - начальная фаза (как бы shift) Нужна формула для тока. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 12 марта, 2022 Опубликовано 12 марта, 2022 · Жалоба 2 часа назад, Вадим Н. сказал: нашёл: https://pnu.edu.ru/media/filer_public/2013/04/03/lab59.pdf Но там формула для напряжения а не для тока, если я правильно понял. Там q это заряд, а выражения для напряжения и тока двумя строчками выше формулы (1). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Вадим Н. 1 13 марта, 2022 Опубликовано 13 марта, 2022 · Жалоба 6 часов назад, SSerge сказал: Там q это заряд, а выражения для напряжения и тока двумя строчками выше формулы (1). Ну да, мне даже эту формулу вывели (см. скан) Так же всё оказывается есть в учебнике Электромагнетизм. Основные законы / И. Е. Иродов - 5-е изд. 2006. Глава Электрические колебания. кто бы мог подумать )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Вадим Н. 1 14 марта, 2022 Опубликовано 14 марта, 2022 · Жалоба в подтверждение концепции... #!perl use Modern::Perl; use constant { R => 0.1, L => 1.0, C => 4.0, PI => 3.1415926535, }; sin PI/2 == 1.0 or die "assert pi"; my $lvl0 = 40; # середина строки шириной 80 символов my $ampl_max = 300; # макс. амплитуда (макс. амплитудный заряд) my $phaz0 = PI / 2; # начальная фаза my $freq0 = 1/L/C; # собств. частота my $attn = R/2/L; # attenuation factor - коэф-т затухания my $freq = ($freq0**2 - $attn**2)**0.5; # частота затухающих колебаний for my $t (1..100) { my $i = $ampl_max * exp(1) ** (-$attn * $t); $i *= -$attn * cos($freq * $t - $phaz0) - $freq * sin($freq * $t + $phaz0); # !!!todo ^ на счёт знаков не уверен ^ say 'x' x ($lvl0 - $i); } ладно, будем считать что в самом поверхностном виде в тему въехал ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Вадим Н. 1 15 марта, 2022 Опубликовано 15 марта, 2022 (изменено) · Жалоба Думал, возникнут серьёзные проблемы именно с теорией. А она на удивление просто проверилась практикой. Закину ещё один concept proof вынужденных колебаний тут, как бы мы можем наблюдать появление резонанса на расчётной частоте Скрытый текст #!perl =pod Выводит в текстовом режиме график вынужденных колебаний (forced oscillations) =cut use Modern::Perl; use constant { R => 0.05, L => 10.0**-6, C => 10.0**-5,, PI => 3.14159265358979, CLK => 10**-6, # это у нас делитель для времени чтобы обеспечить небольшое число тактов на период }; sin PI/2 == 1.0 or die "assert pi"; my $freq0 = 1/(L*C)**0.5; # собственная частота say "freq res: $freq0"; my $lvl0 = 40; # середина строки шириной 80 символов my $ampl_max = 1.0; # макс. амплитуда вынуждающего тока? внешняя ЭДС? # несколько вариантов вынуждающей частоты for (my $freq = 96_000; $freq <= 600_000; $freq += 20000) { my $rr = $freq * L - 1 / C / $freq; say "\nfreq: $freq\n"; for my $t (1..100) { my $i = $ampl_max / (R**2 + $rr**2)**0.5; $i *= cos($freq * $t * CLK - atan2($rr, R)); say 'x' x ($lvl0 + $i); } } из командной строки лучше в файл а не на консоль выводить C:\tmp>perl oscfor.pl > l.txt Изменено 15 марта, 2022 пользователем Вадим Н. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться