Você está na página 1de 19

Projeto de controle de pêndulo

Grupo 1: Everlan, Gabryel Raposo, Gustavo, Lidimara, Lucca,


Ruben, Pedro Ravel, Natan Gomes

1
Código do arduino - MA

int outPin = 9;
int inPin = A2;
float DC = 34.0; // em %
float h = 1.0; // Passo de cálculo do duty cycle
float DCmax = 40.0; // em %
float DCmin = 35.0; // em %
float t_DC = 5.0; // tempo para cada ducty cycle (em s)
int temp = 1; // Variável temporária
float npt = 500.0; // Número de pontos
float Vin;

void setup(){
pinMode(outPin, OUTPUT);
pinMode(inPin, INPUT);
Serial.begin(9600);
}

2
Código do arduino - MA

void loop(){
float T = (t_DC/npt) * 1000;

if ( (DC <= DCmax) && (temp == 1) ){


DC = DC + h;

for (int i = 0; i < npt; i++){


analogWrite(outPin, DC*255.0/100.0);
Vin = analogRead(inPin);

// Mostrando no serial: DC,Vin


// Para poder criar um arquivo csv

Serial.print(DC);
Serial.print(",");
Serial.println(Vin); // Último com println para pular linha

delay(T); // ms
}

3
Código do arduino - MA

if (DC == DCmax){ temp = 0; }


}else{
if ( (DC > DCmin) && (temp == 0) ){
DC = DC - h;

for (int i = 0; i < npt; i++){


analogWrite(outPin, DC*255.0/100.0);
Vin = analogRead(inPin);

// Mostrando no serial: DC,Vin


// Para poder criar um arquivo csv

Serial.print(DC);
Serial.print(",");
Serial.println(Vin); // Último com println para pular linha

delay(T); // ms
}
}else{
analogWrite(outPin, 0.0); // Para o motor
}
}
} 4
Código python

from serial import Serial

porta = 'COM7' # Indicar qual porta o arduino está usando


baud = 9600
arquivo ='arquivo.txt' # Nome do arquivo

ser = Serial(porta, baud)


ser.flushInput()

amostras = 5500
text = ''

for i in range(amostras):
data = str( ser.readline().decode('utf-8') )
text = text + data
print(i)

with open(arquivo, 'w') as f:


f.write(text)
5
Diagrama de blocos

Set point Driver


Arduino Processo y(t)
Saída

Sensor

6
Conversão dos dados

u(t) G(s) y(t)


Duty cycle Tensão no sensor
Função transferência

7
Função de malha aberta

Compatibilidade do dados do DC máximo com FT FT de malha aberta


de Malha aberta: 79,79%

● Domínio s:

● Domínio z
com
Ts = 0,01s:

Stepinfo: domínio s/z


[RiseTime:] 1.8300 / 1.8200
[TransientTime:] 3.2585 / 3.2300
[SettlingTime:] 3.2585 / 3.2585
[SettlingMin:] 0.1212 / 0.1206
[SettlingMax:] 0.1339 / 0.1338
[Overshoot:] 0 / 0
[Undershoot:] 0 / 0
[Peak:] 0.1339 / 0.1338
[PeakTime:] 6.0989 / 5.5900

8
Controlador PI - 1
A partir da função de transferência de malha aberta Gp(s), foram estabelecidos os parâmetros para
projetar o controlador PI.

0.1608 ; Ts = 3.2573, Tr = 1.8293


Gp(s) = ---------
s + 1.201
Determinando um Tempo de assentamento igual a 1s e o sobrevalor do sistema menor que 10%, foi
escolhido um fator de amortecimento igual a 0.9. Com isso, para um Ts = 1s e com um fator de 0.9, o Wn
deve ser de 4.45 rad/s.
Sendo um controlador PI igual a K*(s+z)/s, a equação em malha fechada, com a presença do
controlador é:
K(s+z)*0.1608
T(s) =---------------------------------------------- ;
s^2 + s(1.201 + K*0.1608) + K*z*0.1608

Em que, (1.201 + K*0.1608 = 2*0.9*4.45) e (K*z*0.1608 = 4.45^2) .


Com essas equações, K = 42.34 e z = 2.90. Substituindo eles em T(s), teremos a FT da malha fechada
com o controlador PI:
6.8 s + 19.8
T(s) =
-------------------
s^2 + 8.01 s + 19.8
Essa FT demonstrou um tempo de assentamento de 1.11s e um tempo de subida de 0.22s,
com um sobrevalor de 8.6%, obedecendo as especificações escolhidas no começo. 9
Controlador PI - 2

PID Tuner

10
Controlador PI - 2

PID Tuner

11
Código arduino - MF
#define PIN_INPUT A2
#define PIN_OUTPUT 9

float ajuste = 0.019;

float setPoint;

float currentAngle;
float atuador;

//// PI ////

float max_duty = 50;


float kp = 20;
float ki = 15;

float erro;
float DC1;
float DC2 = 0;
float DC;

float Ts = 0.01; // Período de amostragem (s)

float t = 0;
12
Código arduino - MF
void setup() {

Serial.begin(9600);
pinMode(PIN_INPUT,INPUT);
pinMode(PIN_OUTPUT,OUTPUT);

void loop() {

if (t <= 10){
setPoint = 30;
}else{
if (t > 10 && t <= 15){
setPoint = 40;
}else{
if (t > 15 && t <= 20){
setPoint = 50;
}
}
}
13
Código arduino - MF

currentAngle = analogRead(PIN_INPUT)*(5.0/1023.0)/ajuste;
erro = (setPoint - currentAngle)*ajuste;

// Controlador PI

DC1 = kp*erro;
DC2 = DC2 + erro*Ts*ki;
DC = DC1 + DC2;

if (DC > max_duty){ DC = max_duty; } // Aplicação do saturador

Serial.print(DC);
Serial.print(", ");
Serial.print(currentAngle);
Serial.print(", ");
Serial.print(erro);
Serial.print(", ");
Serial.println(setPoint);

14
Código arduino - MF

atuador = DC*2.55; // Sinal enviado ao atuador

if (currentAngle < 60){


analogWrite(PIN_OUTPUT, atuador);
}else{
DC2 = 20;
}

delay(Ts*1000);

t = t + Ts;
}

15
Resultados - 1

16
Resultados - 1

17
Resultados - 2

18
Resultados - 3

19

Você também pode gostar