Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int IN1 = 10;
- int velocidadeA = 9;
- float velocidade = 0;
- #define kp 10
- #define ki 0.01
- #define kd 2
- #define sp 50
- float acao_anterior = 0;
- float integral_error = 0;
- float erro_anterior = 0;
- void setup(){
- pinMode(IN1,OUTPUT);
- pinMode(velocidadeA,OUTPUT);
- pinMode(2, INPUT_PULLUP); // internal pullup input pin 2
- pinMode(3, INPUT_PULLUP); // internalเป็น pullup input pin 3
- attachInterrupt(1, ai0, RISING);
- attachInterrupt(1, ai1, RISING);
- Serial.begin(9600);
- }
- void loop(){
- float pv = rotac();
- pv = map(pv, 0, 78, 0.0, 100.0);
- Serial.print(" variavel:");
- Serial.println(int(pv));
- float erro = sp - pv;
- integral_error += erro * 0.1;
- float D = (erro - erro_anterior)/0.1;
- float pi = (kp*erro) + (integral_erro*ki*kp) + (D*kd);
- if (pi > 100){
- pi = 100;
- }
- if (pi < 0){
- pi = 0;
- }
- Serial.print(" PID:");
- Serial.print(int(pi));
- float velocity = map(pi, 0.0, 100.0, 0 ,255.0);
- digitalWrite(IN1,HIGH);
- analogWrite(velocidadeA, velocity);
- erro_anterior = erro;
- }
- float rotac(){ //Funcao calcula e retorna a velocidade do motor em RPM
- int anterior = 0; //nº de pulsos anterior
- int atual; //nº de pulsos atual
- float diferenca = 0; //diferenca entre o pulso atual e anterior
- unsigned long int tempoInic = 0; //Variavel auxiliar
- atual = counter;
- while (temp != counter){ //Enquanto o motor não estiver parado, executa o loop:
- tempoInic = millis(); //guarda o tempo inicial de rotacao do motor
- if (tempoInic > tempo-2 && tempoInic < tempo+2){ //Condição criada para calcular quantos pulsos foram gerados em X(ms). Neste caso, x = 500 ms;
- anterior = atual;
- atual = counter;
- diferenca = atual - anterior; //diferenca entre a quantidade de pulsos atual e anterior, para calcular a variação de rotacao em 500 ms.
- tempo += 500; //Incrementa 500 ms a cada loop
- float rotacao = diferenca/600*120;
- //calcula a rotacao. A cada loop(500ms), calculamos a rotacao(rpm) fazendo a relacao entre o nº de pulsos atual e o nº de pulsos
- //para uma volta, sendo assim, multiplicamos por 120 para descobrir quantas voltas por minutos o motor irá fazer.
- return rotacao;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement