Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/37: Рейтинг темы: голосов - 37, средняя оценка - 4.73
5 / 5 / 2
Регистрация: 07.01.2013
Сообщений: 102
1

MCS-51. ПИД-регулятор

29.11.2013, 16:58. Показов 6726. Ответов 5
Метки нет (Все метки)

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

Вот что получилось:
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
32
33
34
35
36
37
38
39
40
41
42
#include "stdafx.h"
#include "math.h"
 
using namespace std;
 
void main()
{
    double P, I, D, PID;
    double Error, time;
    double X_real, X_need;
    double Kp, Ki, Kd;
    double KpP, KiI, KdD;
    double Pt, PE;
 
    X_need = 10;
    X_real = 0;
    Error = 0;
    time = 1;
    I = 0;
    Kp = 1;
    Ki = 0.3;
    Kd = 0.1;
 
    while (X_real != X_need)
    {
        P = (X_need - X_real);
 
        Pt = P * time;
        PE = P - Error;
 
        I = (I + Pt);
        D = (PE / time);
 
        Error = X_need - X_real;
 
        KpP = Kp * P;
        KiI = Ki * I;
        KdD = Kd * D;
 
        PID = KpP + KiI + KdD;
    }
}
А дальше началось веселье: стал переносить алгоритм на ASMу 8051. Стал объявлять переменные и EdSim51SH начал ругаться на строки с десятичными дробями. Я правильно понимаю, что нужно каким-то извращенным способом отдельно задавать целую и дробную части?

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
X_need EQU 10;
X_real EQU 0;
Error EQU 0;
time EQU 0;
I EQU 0;
Kp EQU 1;
Ki EQU 0.3;
Kd EQU 0.1;
KpP EQU 0;
KiI EQU 0;
KdD EQU 0;
Pt EQU 0;
PD EQU 0;
Буду благодарен за любую помощь - с выбором понятного учебника, тонкостями АСМы MCS-51, ну или может у кого-нибудь завалялось решение этой/аналогичной задачи
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.11.2013, 16:58
Ответы с готовыми решениями:

ПИД-регулятор (ПИ-регулятор) сервомотора
Всем привет. Спалил контролер сервы MG996r и решил сделать его на МК Ардуино. Вопрос не...

ПИД регулятор на практике
Добрый день. Есть вопрос как регулировать расход воздуха относительно частоты насоса. Расход можно...

ПИД-регулятор на ассемблере
Помогите сделать ПИД-регулятор на ассемблере выводящий сигнал в ШИМ. Библиотека для STM ниже

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

5
5 / 5 / 2
Регистрация: 07.01.2013
Сообщений: 102
30.11.2013, 20:58  [ТС] 2
Козаченко В.Ф. Практическое руководство по применению 16-ти разрядных микроконтроллеров Intel MCS-196/296 во встроенных системах управления

При расчете на текущем интервале квантования, то есть в процессе одного скана
программы ПИД-регулятора должны выполняться следующие действия:

1. Опрос очередного значения входной переменной с записью текущей выборки в таблицу
выборок.
2. Последовательное умножение трех последних выборок на
соответствующие коэффициенты с накоплением результата в
аккумуляторе для всех i от 0 до 2.
3. Циклический сдвиг всех выборок на одну позицию в памяти данных с удалением самой
“старой” выборки из таблицы.
4. Выдача рассчитанного значения управляющего воздействия в порт.

Дискретные модели наиболее распространенных цифровых регуляторов
u(k) = u(k − 1) + k e(k) − k e(k − 1) + k e(k − 2)

Добавлено через 2 часа 40 минут
Запустил свой код на C в MCU 8051 IDE - работает. Сейчас попробовал этот же код скомпилировать и дизассемблировать под IAR Embedded Workbench for 8051 - код какой-то ущербный получается. Теперь нет надежды посмотреть как оно делалось

Придётся вернуться к попытке написать самому.
0
5 / 5 / 2
Регистрация: 07.01.2013
Сообщений: 102
04.12.2013, 19:03  [ТС] 3
Немного поправил алгоритм:


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
#include <reg51.h>
 
void main()
{
        int P, I, D, PID, Kp=10, Ki=30, Kd=1;
        int Error, Integr=0, It, Error_old=0, EEo, time=1, X_need=6, X_real, EEot;
 
    while (1 != 0)
    {
 
        Error = X_need - X_real;
 
                Integr = Integr + Error;
 
                P = Kp * Error;
                It = Integr * time;
                I = Ki * It;
                EEo = Error - Error_old;
                EEot = EEo / time;
                D = Kd * EEot;
 
                PID = P + I + D;
 
                Error_old = Error;
    }
}
1
5 / 5 / 2
Регистрация: 07.01.2013
Сообщений: 102
28.12.2013, 21:45  [ТС] 4
В общем, вот как сделал:
Assembler
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
mov r0,#7; xneed
mov r1,#5; xreal
mov r2,#10;Kp
mov r3,#2; Ki
mov r4,#6;Kd
mov r5,#0;Error_old
mov r6,#1;time
mov r7,#0;I
m:
;Error=xneed-xreal
mov a,r0
subb a,r1
mov 10h,a; 10h=error
;et=error-time
mov a,10h
mov b,r6
mul ab
mov 11h,a; 11h=Et
;eeo=error-error_old
mov a,10h
subb a,r5
mov 12h,a; 12h=eeo
mov 13h,10h;p=error
mov a,r7
add a,11h
mov 14h,a;I=I+et in 14h
;D=eeo/time
mov a,12h
mov b,r6
div ab
mov 15h,a
;Kpp=Kp*p
mov a,r2
mov b,13h
mul ab
mov 16h,a
;Kii
mov a,r3
mov b,14h
mul ab
mov 17h,a
;Kdd
mov a,r4
mov b,15h
mul ab
mov 18h,a
;PID
mov a,16h;
add a,17h;PI
add a,18h; PID
mov 19h,a; 19h=PID
mov r5,10h;error_old=error
mov r7,14h;new integr (новое значение интегратора снова кидаем в r7)
jmp m
end
Получил своё "отлично"
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
29.12.2013, 07:29 5
Цитата Сообщение от Daemon2017 Посмотреть сообщение
Стал объявлять переменные и EdSim51SH начал ругаться на строки с десятичными дробями.
Ясен пень. Процессор MCS-51 ВСЕ !!! считает в целых числах.
0
1022 / 157 / 10
Регистрация: 16.01.2013
Сообщений: 544
29.12.2013, 11:57 6
Дискретные модели наиболее распространенных цифровых регуляторов
u(k) = u(k − 1) + k e(k) − k e(k − 1) + k e(k − 2)
только я бы уточнил
u(n) = k(0)*u(n − 1) + k(1)*e(n) + k(2)*e(n − 1) + k(3)*e(n − 2)....
Причем k(0) обязательно меньше либо равно единице. Иначе система идёт в разнос.
Остальные k(n) Со знаком.
0
29.12.2013, 11:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.12.2013, 11:57
Помогаю со студенческими работами здесь

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

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

DSP library STM32f1xx ПИД-регулятор
Добрый день! Кто-нибудь работал с библиотекой DSP? http://www.chipfind.ru/files/news94.pdf В ней...

Станок ЧПУ X-Y-Z Axis ПИД-регулятор
Здравствуйте, форумчане Прошу, пожалуйста, помочь найти или скинуть структурную схему для ЧПУ с...

ПИД-регулятор на C#
Добрый день! Необходимо написать ПИД-регулятор на ASMе под 8051, но для отработки алгоритма решил...

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

ПИД-регулятор
Посвящается всем желающим. pid control - простейшая программа для моделирования процессов...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru