Upload
others
View
31
Download
1
Embed Size (px)
Citation preview
Sistemas de Controle 2Projeto de sistema de controle digital PID com Arduino
Pontifícia Universidade Católica de Goiás
Escola de Engenharia
Prof. Dr. Marcos Lajovic Carneiro
Referência: Ivan Seidelhttps://www.youtube.com/watch?v=txftR4TqKYA
Projeto de sistema de controle digital PID com Arduino
Índice
1. Uso da porta PWM do Arduino2. Estudo do código do controle PID digital no Arduino3. Código completo4. Trabalho prático de PID
3
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 sinaisanalógicos.
Nestes pinos, o Arduino envia umaonda quadrada alternando o pinoem ON/OFF rapidamente. Asequência destes ON/OFFs podemsimular a variação de tensão entre0 a 5v.
Na placa ARDUINO UNO pode se utilizar os pinos 3,5,6,9,10 e 11 para esta função.
4
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). Aduraçã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 porcentoem OFF, logo duty cicle de 25%. O valor 191 terá o teu duty cicle de 75% e o valor 255 de100%.
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
8
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 desligarvalor 100 aquecer (MAX)
Sensor (Leitura analógica)Sensor analógico de Temperatura:
porta analógica A10 – 10230 : 01023: 100
9
Inicio do programa
10
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.
Configurando o loop() Bloco de código executado continuamente.
Primeira ação Ler temperatura
Leitura “crua” do valor do conversor analógico digital
Regra de 3 para converter degraus do A/D (de 0 a 1023) para a faixa de 0 a 100 (percentual).
Função map
Analog read
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()
Definindo o controle PWM
Define atuador como desligado inicialmente
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 daproporcional, da integral e da derivada.
Definindo de início apenas kP=1
Definindo controlador Proporcional
Exemplo:
SetPoint = 20Temperatura = 25Erro = -5
P = error * kP
kP é um multiplicativo do valor do erro.“Aumenta a importância do erro”
Definindo controlador Integral
Exemplo
Considere um erro pequenoError=0.001
Soma erros ao longo do tempo na
variável I. Quanto mais tempo errado
maior sua força para corrigir o erro.
Simplificando:
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.
Comando millis()Retorna número de milissegundos desde que o Arduino começou a executar o programa atual.
Esse número sofre overflow e volta para zero depois de aproximadamente 50 dias.
Calculando o tempo de execução
Variável para armazenar o tempo de execução do último processo
Variável para calcular o tempo de execução do processo atual
lastProcess recebe novamente tempo atual.
deltaTime
lastProcess
Controlador Derivativo dependente do tempo em segundos
Controlador Integraldependente 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)
Ajuste dos controladores Integral e Derivativo no tempo
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.
Ajustando as constantesTeoria do capítulo 9
Levantando a função de transferência do sistemaTeoria 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
- Deixando o código reutilizável - Controle de múltiplas malhas com PID
Utilizando o poder do controle digital
Classes do C++
- Deixando o código reutilizável - Controle de múltiplas malhas com PID
Utilizando o poder do controle digital
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;
}
void addNewSample(double _sample){sample = _sample;
}
void setSetPoint(double _setPoint){setPoint = _setPoint;
}
double process(){// Implementação P IDerror = setPoint - sample;float deltaTime = (millis() - lastProcess) / 1000.0;lastProcess = millis();
//PP = error * kP;
//II = I + (error * kI) * deltaTime;
//DD = (lastSample - sample) * kD / deltaTime;lastSample = sample;
// Soma tudopid = P + I + D;
return pid;}
};
Programa completo – Parte 2
#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ê temperaturadouble temperature = map(analogRead(pSENSOR), 0, 1023, 0, 100);
// Manda pro objeto PID!meuPid.addNewSample(temperature);
// Converte para controlecontrolePwm = (meuPid.process() + 50);
// Saída do controleanalogWrite(pCONTROLE, controlePwm);
}
Programa completo – Parte 3
Vantagens do novo programa
Possibilidade do controle de diversas malhas ao mesmo tempo:
Exemplo:
Controle temperatura 1Controle temperatura 2Controle temperatura 3
Controle de umidadeControle de pressão
Controle da posição do motor 1Controle da posição do motor 2Controle 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!