Você está na página 1de 37

Pontifícia Universidade Católica de Goiás

Escola de Engenharia

Sistemas de Controle 2
Projeto de sistema de controle digital PID com Arduino

Prof. Dr. Marcos Lajovic Carneiro

Referência: Ivan Seidel


https://www.youtube.com/watch?v=txftR4TqKYA
Projeto de sistema de controle digital PID com Arduino
Índice

1. Uso da porta PWM do Arduino


2. Estudo do código do controle PID digital no Arduino
3. Código completo
4. Trabalho prático de PID
Saída PWM do Arduino – Exemplo de uso:
Ajustando o Brilho de um LED por PWM

No Arduino existem alguns pinos digitais escrito PWM.

Eles são capazes de enviar um sinal PWM que é uma técnica usada para digitalizar sinais
analógicos.

Nestes pinos, o Arduino envia uma


onda quadrada alternando o pino
em ON/OFF rapidamente. A
sequência destes ON/OFFs podem
simular a variação de tensão entre
0 a 5v.

Na placa ARDUINO UNO pode se


utilizar os pinos 3,5,6,9,10 e 11
para esta função.

3
Saída PWM do Arduino – Exemplo de uso:
Ajustando o Brilho de um LED por PWM

Isto é feito trocando-se a quantidade de tempo que a saída fica em 1 (on) ou em 0 (off). A
duração deste tempo é conhecida como pulse width (largura de pulso).

Por exemplo, caso você envie o valor 0 pela saída digital PWM Pin 11 usando analogWrite(),
o período em ON será zero, ou terá 0% de duty cycle (ciclo de trabalho). Se enviar o valor 64
(25% do valor máximo 255) o pino ficará em ON por 25 porcento do tempo e 75 porcento
em OFF, logo duty cicle de 25%. O valor 191 terá o teu duty cicle de 75% e o valor 255 de
100%.

4
Saída PWM do Arduino – Exemplo de uso:
Ajustando o Brilho de um LED por PWM

A função analogWrite deve ser utilizada da seguinte forma:

Sintaxe:
analogWrite(pino, valor);

Onde o parâmetro pino corresponde ao pino que será gerado o sinal PWM e valor
corresponde ao duty cycle, ou seja, o valor que permanecerá em nível alto o sinal.

O valor deve ser de 0 a 255 onde 0 a saída permanece sempre em nível zero e 225 a saída
permanece sempre em nível alto.
Saída PWM do Arduino – Exemplo de uso:
Ajustando o Brilho de um LED por PWM – Exemplo:

Intensidade do LED
Programando o PID
Dados do sistema de controle PID e do programa

Definindo o problema:

Sistema de controle de temperatura

Atuador (controle PWM)


Pino 3, aquecedor/resfriador.
valor 0  resfriando (MAX)
valor 50  desligar
valor 100  aquecer (MAX)

Sensor (Leitura analógica)


Sensor analógico de Temperatura:

porta analógica A1
0 – 1023
0:0
1023: 100

8
Inicio do programa

9
Configurando o Setup
- Define sensor na porta
analógica A1
- Pino de controle PWM: pino 3
- Configura saída serial
- Define o pino do sensor como
entrada e o pino de controle
como saída.

10
Configurando o loop() Bloco de código executado continuamente.

Primeira ação  Ler temperatura

Analog read Leitura “crua” do valor do conversor analógico digital

Função map Regra de 3 para converter degraus do A/D (de 0 a


1023) para a faixa de 0 a 100 (percentual).
Configurando o loop()

Primeira ação  Ler temperatura


Simplificando o código para uma linha só:
Configurando o loop()

Definindo a temperatura desejada  Set Point


Configurando o loop()
Define atuador como desligado inicialmente
Definindo o controle PWM

Envia para pino


de controle o
valor do PWM
desejado
Configurando o loop()
Início da implementação do controle PID digital

Definindo valor do Erro Erro:


Valor desejado – valor real
Configurando o loop()
Início da implementação do controle PID digital

Definindo controladores Proporcional, Integral e Derivativo

Constantes de erro (kP, kI e


kD) para aumentar a
importância da
proporcional, da integral e
da derivada.

Definindo de início apenas kP=1


Definindo controlador Proporcional

Exemplo:

SetPoint = 20
Temperatura = 25
Erro = -5

P = error * kP

kP é um multiplicativo do valor do erro.


“Aumenta a importância do erro”
Definindo controlador Integral

Exemplo

Simplificando: Considere um erro pequeno


Error=0.001

Soma erros ao longo do tempo na


variável I. Quanto mais tempo errado
maior sua força para corrigir o erro.
Definindo controlador Derivativo

É preciso salvar a temperatura passada a


cada amostragem:

Multiplicador da diferença
entra a temperatura anterior
e a atual
Definindo controlador P I D

Se PID = 0  Então sistema OK


 Temperatura final é
igual a desejada
 Erro = 0
Definindo controlador P I D

O zero do nosso sistema representa 50.

50  Sistema desligado (não aquece e


nem resfria)
Programa pronto
Ajuste dos controladores Integral e Derivativo no tempo
O sistema funciona baseado na repetição do bloco de código loop().

O operador de integral irá somar o erro a cada vez que for executado. Se a execução do
programa for muito rápida, o seu valor irá crescer excessivamente com relação ao
tempo real.

Este operador precisa ficar dependente do tempo em segundos.

Exemplo:
Se ele for executado 200 vezes por segundo, deve ser dividido por 200.
Se for executado 1 vez por segundo, divide por 1 (que é como está).

É preciso calcular o tempo de execução.

Retorna número de milissegundos desde que o Arduino


Comando millis()
começou a executar o programa atual.

Esse número sofre overflow e volta para zero depois de


aproximadamente 50 dias.
Ajuste dos controladores Integral e Derivativo no tempo
Calculando o tempo de execução
lastProcess
Variável para armazenar o tempo de execução do
último processo

deltaTime
Variável para calcular o tempo
de execução do processo atual

lastProcess recebe novamente


tempo atual.

Controlador Integral
dependente do tempo em segundos

Controlador Derivativo dependente


do tempo em segundos
Ajuste dos controladores Integral e Derivativo no tempo

Detalhe importante

Dividir por 1000.0 (“mil ponto zero”) para considerar que a variável é float (real)
Bloco de código loop() finalizado com os ajustes:
Programa completo com os ajustes:
Programa pronto

O que falta é configurar corretamente as constantes kP, kI e kD.

Levantando a função de
Ajustando as constantes
transferência do sistema
Teoria do capítulo 9
Teoria do capítulo 2

 Ou, tentativa e erro...


 Configurando sistema por tentativa e erro

Testar kP = 1  Se estiver devagar Testar kP = 10

Ir ajustando kP

 Ir amostrando valor da variável controlada. Observar se o sistema estabiliza antes de


alcançar a temperatura ideal e fica com um pequeno erro que nunca desaparece.

 Ajustar kI

 Verificar se o sistema apresenta ultrapassagem percentual, se ele oscila muito.

 Ajustar kD
Utilizando o poder do controle digital

- Deixando o código reutilizável


- Controle de múltiplas malhas com PID

Classes do C++
Utilizando o poder do controle digital
- Deixando o código reutilizável
- Controle de múltiplas malhas com PID

Substituindo no cógido:

Temperature  Sample Temperatura se torna uma amostra


genérica para qualquer tipo de leitura

Criando código com objeto PID...


Programa completo – Parte 1
// (Really Simple) PID Class by Ivan Seidel
// GitHub.com/ivanseidel
// Use as you want. Leave credits

class PID{
public:

double error;
double sample;
double lastSample;
double kP, kI, kD;
double P, I, D;
double pid;

double setPoint;
long lastProcess;

PID(double _kP, double _kI, double _kD){


kP = _kP;
kI = _kI;
kD = _kD;
}
Programa completo – Parte 2
void addNewSample(double _sample){
sample = _sample;
}

void setSetPoint(double _setPoint){


setPoint = _setPoint;
}

double process(){
// Implementação P ID
error = setPoint - sample;
float deltaTime = (millis() - lastProcess) / 1000.0;
lastProcess = millis();

//P
P = error * kP;

//I
I = I + (error * kI) * deltaTime;

//D
D = (lastSample - sample) * kD / deltaTime;
lastSample = sample;

// Soma tudo
pid = P + I + D;

return pid;
}
};
Programa completo – Parte 3
#define pSENSOR A1
#define pCONTROLE 3

PID meuPid(1.0, 0, 0);

void setup() {
Serial.begin(9600);

pinMode(pSENSOR, INPUT);
pinMode(pCONTROLE, OUTPUT);
}

int controlePwm = 50;

void loop() {

// Lê temperatura
double temperature = map(analogRead(pSENSOR), 0, 1023, 0, 100);

// Manda pro objeto PID!


meuPid.addNewSample(temperature);

// Converte para controle


controlePwm = (meuPid.process() + 50);

// Saída do controle
analogWrite(pCONTROLE, controlePwm);

}
Vantagens do novo programa

Possibilidade do controle de diversas malhas ao mesmo tempo:

Exemplo:

Controle temperatura 1
Controle temperatura 2
Controle temperatura 3

Controle de umidade
Controle de pressão

Controle da posição do motor 1


Controle da posição do motor 2
Controle da posição do motor 3
Trabalho de implementação do PID
Parte prática (primeiro)
• Criar um sistema físico com controle PID
• Utilizar um Arduino (ou outro microcontrolador) para coletar uma variável e
controlar esta variável através do PID.
• Calibrar o sistema
• Apresentar sistema funcionando em sala de aula

Parte teórica (segundo) – Depois que o sistema estiver funcionando

Princípio básico da ciência  Reprodutibilidade

• Trabalho escrito deve conter o máximo de detalhes a respeito da implementação


do sistema (código, diagramas elétricos, mecânicos, explicações, fotos).

Conhecimento que não se propaga é conhecimento inútil.

Entregar trabalho escrito e apresentar a prática.


36
Mãos a obra!

Você também pode gostar