Fernando Sakabe / Mbed 2 deprecated Projeto_CCM

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h" //Inclui biblioteca mbed
00002 
00003 //Pinos do motor de passo
00004 DigitalOut EN_A (D10);
00005 DigitalOut IN1_A (D5);
00006 DigitalOut IN2_A (D4);
00007 DigitalOut EN_B (A4);
00008 DigitalOut IN1_B (A0);
00009 DigitalOut IN2_B (A1);
00010 
00011 //pinos motor DC
00012 PwmOut EN_A_DC (D11);
00013 DigitalOut IN1_A_DC (D12);
00014 DigitalOut IN2_A_DC (D13);
00015 
00016 Timeout desaciona_DC; //timeout que define quantidade tempo o motor DC vai rodar
00017 
00018 int motor; //escolhe qual motor vai ser acionado
00019 int enable_passo=0; // liga/desliga motor de passo
00020 int enable_DC=0; // liga/desliga motor DC
00021 int sentido_passo; //define sentido de rotação do motor de passo
00022 int sentido_DC; //define sentido de rotação do motor de passo
00023 float velocidade_passo; //define velocidade do motor de passo em RPM
00024 float velocidade_DC; //define velocidade do motor DC em RPM
00025 int numero_rotacoes_passo=0; //define quantas vezes o motor de passo vai rodar
00026 int numero_de_passos_passo_pratico=0; //define a quantidade de passos que o motor deu
00027 float tempo_rotacionando_DC=0; //Define por quanto tempo  o motor DC vai estar acionado
00028 float numero_de_passos_por_volta_passo=200; //A quantidade de passos por volta do motor de passo é 200
00029 float tempo_passo; //Calcula o wait a ser utilizado para cada fase
00030 float duty_cycle_DC=1; //define o duty cycle
00031 int ligado_DC; //aciona ou desaciona o motor DC no meio do suo
00032 
00033 void desliga() //Muda valor de ligado_DC
00034 {
00035     ligado_DC=!ligado_DC;
00036 }
00037 
00038 int main()
00039 
00040 {
00041     
00042     while(1) {
00043         
00044         //Perguntas para atribuir valor das variáveis 
00045         printf("Digite 0 para motor de passo ou 1 para DC \r\n");
00046         scanf("%d", &motor );
00047         if(motor==0) {
00048             printf("Digite 1 para acionar o motor de passo e 0 para desacionar\r\n");
00049             scanf("%d", &enable_passo);
00050             if(enable_passo==1){
00051                 printf("Digite 0 para sentido horario e 1 para sentido anti-horario\r\n");
00052                 scanf("%d", &sentido_passo);
00053                 printf("Digite a Velocidade em RPM do motor de passo (valor entre 0 e 60 RPM)\r\n");
00054                 scanf("%f", &velocidade_passo);
00055                 printf("Digite o número de rotações do motor de passo\r\n");
00056                 scanf("%d", &numero_rotacoes_passo);
00057             }
00058         } else if(motor==1) {
00059             printf("Digite 1 para acionar o motor DC e 0 para desacionar\r\n");
00060             scanf("%d", &enable_DC);
00061             if(enable_DC==1) {
00062                 printf("Digite 0 para sentido horario e 1 para sentido anti-horario\r\n");
00063                 scanf("%d", &sentido_DC);
00064                 printf("Digite a Velocidade em RPM do motor DC (valor entre 900 e 2000 RPM))\r\n");
00065                 scanf("%f", &velocidade_DC);
00066                 printf("Digite o tempo de rotação do motor DC em segundos\r\n");
00067                 scanf("%f", &tempo_rotacionando_DC);
00068             }
00069         }
00070         
00071         if(motor==0) {        //escolhe qual motor será ativado. No caso o de passo.
00072     
00073             tempo_passo=0.3/velocidade_passo; //Calcula o tempo do passo pela velocidade inserida pelo usuário
00074             numero_de_passos_passo_pratico=0; //Contador de passos
00075             while(numero_de_passos_passo_pratico < numero_de_passos_por_volta_passo*numero_rotacoes_passo) { //roda o motor até numero de rotações definidas
00076                 if(enable_passo) {
00077                     //Define se o motor rotacionará no sentido horario ou anti-horario
00078                     switch(sentido_passo) {
00079                         case 0:
00080 
00081                             //passo 0
00082 
00083                             EN_A = 1;
00084                             IN1_A = 1;
00085                             IN2_A = 0;
00086                             EN_B = 1;
00087                             IN1_B = 1;
00088                             IN2_B = 0;
00089                             wait(tempo_passo); //periodo definido anteriormente
00090 
00091                             //passo 1
00092 
00093                             EN_A = 1;
00094                             IN1_A = 0;
00095                             IN2_A = 1;
00096                             EN_B = 1;
00097                             IN1_B = 1;
00098                             IN2_B = 0;
00099                             wait(tempo_passo); //periodo definido anteriormente
00100 
00101                             //passo 2
00102 
00103                             EN_A = 1;
00104                             IN1_A = 0;
00105                             IN2_A = 1;
00106                             EN_B =1 ;
00107                             IN1_B = 0;
00108                             IN2_B = 1;
00109                             wait(tempo_passo); //periodo definido anteriormente
00110 
00111                             //passo 3
00112 
00113                             EN_A = 1;
00114                             IN1_A = 1;
00115                             IN2_A = 0;
00116                             EN_B = 1;
00117                             IN1_B = 0;
00118                             IN2_B = 1;
00119                             wait(tempo_passo); //periodo definido anteriormente
00120                             break;
00121 
00122                         case 1:
00123 
00124                             //passo 3
00125 
00126                             EN_A = 1;
00127                             IN1_A = 1;
00128                             IN2_A = 0;
00129                             EN_B = 1;
00130                             IN1_B = 0;
00131                             IN2_B = 1;
00132                             wait(tempo_passo); //periodo definido anteriormente
00133 
00134                             //passo 2
00135 
00136                             EN_A = 1;
00137                             IN1_A = 0;
00138                             IN2_A = 1;
00139                             EN_B = 1;
00140                             IN1_B = 0;
00141                             IN2_B = 1;
00142                             wait(tempo_passo); //periodo definido anteriormente
00143 
00144                             //passo 1
00145 
00146                             EN_A = 1;
00147                             IN1_A = 0;
00148                             IN2_A = 1;
00149                             EN_B = 1;
00150                             IN1_B = 1;
00151                             IN2_B = 0;
00152                             wait(tempo_passo); //periodo definido anteriormente
00153 
00154                             //passo 0
00155 
00156                             EN_A = 1;
00157                             IN1_A = 1;
00158                             IN2_A = 0;
00159                             EN_B = 1;
00160                             IN1_B = 1;
00161                             IN2_B = 0;
00162                             wait(tempo_passo); //periodo definido anteriormente
00163 
00164                             break;
00165                             
00166                     }
00167                     numero_de_passos_passo_pratico+=4;
00168                 } else {
00169                     //se botão enable desativado, desativa o EN_A e EN_B
00170                     EN_A=0;
00171                     EN_B=0;
00172                 }
00173             }
00174         } else if(motor==1) {         //escolhe qual motor será ativado. No caso o DC
00175 
00176             ligado_DC=1;
00177             desaciona_DC.attach(&desliga, tempo_rotacionando_DC); //aciona o Timeout pelo tempo definidopelo usuário. Este timout desligara o motor.
00178             
00179             //O duty cycle foi calculado de acordo com a linha de tendência do gráfico obtido variando a velocidade pelo PWM a partir de testes.
00180             duty_cycle_DC = 8*(0.00000000001)*(velocidade_DC*velocidade_DC*velocidade_DC) - 4*(0.0000001)*(velocidade_DC*velocidade_DC) + 0.0005*velocidade_DC - 0.0274;
00181             if(enable_DC) {
00182                 if(sentido_DC==0) { //define se o motor rotacionará pelo sentido horário ou anti-horario
00183                     IN1_A_DC=0;
00184                     IN2_A_DC=1;
00185 
00186                     while(ligado_DC) { 
00187                         EN_A_DC.write(duty_cycle_DC); //Aciona motor DC na velocidade e sentido definido peo tempo também definido pelo usuário
00188 
00189                     }
00190                 } else if(sentido_DC==1) {
00191                     IN1_A_DC=1;
00192                     IN2_A_DC=0;
00193                     while(ligado_DC) {
00194                         EN_A_DC.write(duty_cycle_DC);
00195                     }
00196                 }
00197             }
00198             IN1_A_DC=0; //desaciona o motor DC
00199             IN2_A_DC=0;
00200             EN_A_DC.write(0);
00201         }
00202     }
00203 }