Fórum

arrow_back

PWM

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

Este site usa cookies para melhorar sua experiência. Política de Privacidade