EDUARDO OECKSLER
20/02/2024 09:25:49
Bom dia estou com um problema eu preciso que os 2 PWM inicialize junto. e desligue junto. tem algum metado de fazer isso?
estou controlando 2 motores.
A inicialização está fazendo junto e quando vou para desaceleração ele faz um motor 1 depois o outro.
o encoder seria o sensor que fica no motor... quando faço a progdesaceleracaodesce, ele faz 1 motor 1 e depois o outro. eu queria que fezes junto.
aqui está uma parte do codigo. se conseguir me ajudar agradeço.
if(rampamin < 40){
measure = (encoder1A - encoder2A);
measure2 = (encoder2A - encoder1A);
if(measure >= 50) desnivelado=1;
if(measure2 >= 50) desnivelado=1;
error_meas = ideal_value - measure;
error_meas2 = ideal_value2 - measure2;
proportional = error_meas * kp;
proportional2 = error_meas2 * kp2;
integral += (error_meas * ki) * 10E-3; //*variação do tempo
integral2 += (error_meas2 * ki2) * 10E-3;
derivative = ((lastMeasure - measure) * kd) / 10E-3; // /variação do tempo
derivative2 = ((lastMeasure2 - measure2) * kd2) / 10E-3;
lastMeasure = measure;
lastMeasure2 = measure2;
PID = proportional + integral + derivative;
PID2 = proportional2 + integral2 + derivative2;
PID = PID/4;
PID2 = PID2/4;
current_duty = rampamin + PID; //45
current_duty1 = rampamin + PID2;
if(current_duty <= rampamin) current_duty = rampamin;
if(current_duty1 <= rampamin) current_duty1 = rampamin;
if(current_duty >= 60) current_duty = 60; //255
if(current_duty1 >= 60) current_duty1 =60;
if (encoder1A <= 200) current_duty = 5;
if (encoder2A <= 200) current_duty1 = 5;
if((ComandosTec==20) && (encoder1A <= ( prog1altura + progdesaceleracaodesce))) current_duty = 5;
if((ComandosTec==20) && (encoder2A <= ( prog1altura + progdesaceleracaodesce))) current_duty1 = 5;
if((ComandosTec==21) && (encoder1A <= ( prog2altura + progdesaceleracaodesce))) current_duty = 5;
if((ComandosTec==21) && (encoder2A <= ( prog2altura + progdesaceleracaodesce))) current_duty1 = 5;
if((ComandosTec==22) && (encoder1A <= ( prog3altura + progdesaceleracaodesce))) current_duty = 5;
if((ComandosTec==22) && (encoder2A <= ( prog3altura + progdesaceleracaodesce))) current_duty1 = 5;
if((ComandosTec==23) && (encoder1A <= ( prog4altura + progdesaceleracaodesce))) current_duty = 5;
if((ComandosTec==23) && (encoder2A <= ( prog4altura + progdesaceleracaodesce))) current_duty1 = 5;
else{
measure = (encoder1A - encoder2A);
measure2 = (encoder2A - encoder1A);
if(measure >= 50) desnivelado=1;
if(measure2 >= 50) desnivelado=1;
error_meas = ideal_value - measure;
error_meas2 = ideal_value2 - measure2;
proportional = error_meas * kp;
proportional2 = error_meas2 * kp2;
integral += (error_meas * ki) * 10E-3; //*variação do tempo
integral2 += (error_meas2 * ki2) * 10E-3;
derivative = ((lastMeasure - measure) * kd) / 10E-3; // /variação do tempo
derivative2 = ((lastMeasure2 - measure2) * kd2) / 10E-3;
lastMeasure = measure;
lastMeasure2 = measure2;
PID = proportional + integral + derivative;
PID2 = proportional2 + integral2 + derivative2;
PID = PID/4;
PID2 = PID2/4;
current_duty = 40 + PID; //45
current_duty1 = 40 + PID2;
if(current_duty <= 40) current_duty = 40;
if(current_duty1 <= 40) current_duty1 = 40;
if(current_duty >= 250) current_duty = 250; //255
if(current_duty1 >= 250) current_duty1 = 250;
if (encoder1A <= 200) current_duty = 5;
if (encoder2A <= 200) current_duty1 = 5;
if((ComandosTec==20) && (encoder1A <= ( prog1altura + progdesaceleracaodesce))) current_duty = 5;
if((ComandosTec==20) && (encoder2A <= ( prog1altura + progdesaceleracaodesce))) current_duty1 = 5;
if((ComandosTec==21) && (encoder1A <= ( prog2altura + progdesaceleracaodesce))) current_duty = 5;
if((ComandosTec==21) && (encoder2A <= ( prog2altura + progdesaceleracaodesce))) current_duty1 = 5;
if((ComandosTec==22) && (encoder1A <= ( prog3altura + progdesaceleracaodesce))) current_duty = 5;
if((ComandosTec==22) && (encoder2A <= ( prog3altura + progdesaceleracaodesce))) current_duty1 = 5;
if((ComandosTec==23) && (encoder1A <= ( prog4altura + progdesaceleracaodesce))) current_duty = 5;
if((ComandosTec==23) && (encoder2A <= ( prog4altura + progdesaceleracaodesce))) current_duty1 = 5;
delay_ms(9);
}
rampamin=rampamin+0.5; //0.5
rampamin2=rampamin2+0.5;
if(rampamin>=45)rampamin=45;
if(rampamin2>=25)rampamin2=25;
FERNANDO SIMPLICIO DE SOUSA
29/02/2024 11:39:31
Bom dia estou com um problema eu preciso que os 2 PWM inicialize junto. e desligue junto. tem algum metado de fazer isso?
estou controlando 2 motores.
Exatamente ao mesmo tempo não é possível com esses modelos de microcontroladores PIC aplicados no curso. Neste caso você precisaria utilizar outro microcontrolador PIC que tivesse um timer associado a dois PWM.
Faça uma leitura do post abaixo: https://forum.microchip.com/s/topic/a5C3l000000M2QMEA0/t239378?comment=P-1871477