Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/32: Рейтинг темы: голосов - 32, средняя оценка - 4.63
Daemon2017
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 102
1

ПИД-регулятор на C#

28.11.2013, 15:09. Просмотров 6459. Ответов 5
Метки нет (Все метки)

Добрый день!
Необходимо написать ПИД-регулятор на ASMе под 8051, но для отработки алгоритма решил сделать сначала на C#.
Буду очень благодарен, если укажете на ошибки в коде, если они есть, а также, ищу способы отслеживать изменения текущего значения икса(X_real).

Программа, вроде бы, работает - выводит растущее значение выходного сигнала регулятора, но ведь его нужно-бы как-то остановить в тот момент, когда икс реальный сравняется с иксом желаемым(X_need).

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        private void timer1_Tick(object sender, EventArgs e)
        {
                X_need = Double.Parse(textBox1.Text);
                K = Double.Parse(textBox2.Text);
                time = Double.Parse(textBox3.Text);
 
                Kp = Ki = Kd = K;
 
                P = (X_need - X_real);
                I = (I + (X_need - X_real) * time);
                D = (((X_need - X_real) - Error) / time);
 
                Error = X_need - X_real;
 
                PID = (Kp * P) + (Ki * I) + (Kd * D);
 
                label1.Text = PID.ToString();
                label2.Text = X_real.ToString();
        }
Добавлено через 33 минуты
Добавил формулу обратной связи X_real = 10 * Math.Sin((1-PID) / 40);
Теперь, вроде бы, всё именно так, как надо
Но сомнения всё ещё есть.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
        private void timer1_Tick(object sender, EventArgs e)
        {
                X_need = Double.Parse(textBox1.Text);
                time = Double.Parse(textBox3.Text);
 
                if (X_real <= X_need)
                {
                    Kp = 1;
                    Ki = 0.3;
                    Kd = 0.1;
 
                    lol++;
 
                    P = (X_need - X_real);
                    I = (I + (X_need - X_real) * time);
                    D = (((X_need - X_real) - Error) / time);
 
                    Error = X_need - X_real;
 
                    PID = (Kp * P) + (Ki * I) + (Kd * D);
 
                    X_real = 10 * Math.Sin((1-PID) / 40);
 
                    label1.Text = PID.ToString();
                    label2.Text = X_real.ToString();
                }
                else
                {
                    timer1.Stop();
                }
        }
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2013, 15:09
Ответы с готовыми решениями:

ПИД-регулятор
Пытаюсь сделать ПИД регулятор для управления тепло нагревателем. Есть входной параметр ввиде...

ПИД-регулятор
Само задание: В Simulink построить передаточную функцию в соответствии с вариантом и настроить...

Нечеткий ПИД-регулятор
Здравствуйте, форумчане. Пытаюсь реализовать фаззи-ПИД-контроллер под FuzzyLogicToolbox ....

Пид-регулятор!Подскажите
Здравствуйте. В С++ нужно реализовать программу для переходного процесса ПИД-регулятора,...

MCS-51. ПИД-регулятор
Добрый день! Необходимо сделать ПИД-регулятор на ассемблере 8051. Начал с отработки алгоритма -...

5
tezaurismosis
Администратор
Эксперт .NET
8669 / 3957 / 733
Регистрация: 17.04.2012
Сообщений: 8,717
Записей в блоге: 14
28.11.2013, 18:55 2
Цитата Сообщение от Daemon2017 Посмотреть сообщение
Но сомнения всё ещё есть
Чтобы сомнения отпали, испытайте метод с разными значениями, в т.ч. крайними или неверными (отрицательными, например, или другими значениями, которые не должны попасть в метод). Это повысит устойчивость вашего метода к разным напастям в виде будущего пользователя
0
taras atavin
4199 / 1776 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
28.11.2013, 18:56 3
Это ктож так делает то? Контроллер .NET не разжуёт, на асме пиши.
0
tezaurismosis
Администратор
Эксперт .NET
8669 / 3957 / 733
Регистрация: 17.04.2012
Сообщений: 8,717
Записей в блоге: 14
28.11.2013, 19:03 4
taras atavin,
Цитата Сообщение от Daemon2017 Посмотреть сообщение
для отработки алгоритма решил сделать сначала на C#.
чтобы переписать уже отлаженный код на Asm
0
taras atavin
4199 / 1776 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
28.11.2013, 19:08 5
На асм нельзя просто переписать с языка, не компилируемого в натив, надо писать заново.
0
Daemon2017
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 102
28.11.2013, 22:10  [ТС] 6
Цитата Сообщение от taras atavin Посмотреть сообщение
На асм нельзя просто переписать с языка, не компилируемого в натив, надо писать заново.
Именно этим сейчас занимаюсь. Предвижу полсотни строк кода, как минимум...
0
28.11.2013, 22:10
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2013, 22:10

Правильно ли собран ПИД-регулятор
Доброго времени суток, собирал схему в Simulink и возникла потребность в собранную схему поставить...

помогите реализовать ПИД регулятор
задача реализовать ПИД регулятор с настройкой по modbus RTU, modbus RTU худо бедно написал, две...

ПИД-регулятор на импульсной микросхеме.
Всем привет! Хочу сделать термостабилизацию схемы с помощью элемента Пельтье (ничего нового в этом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru