Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 1:a5accbc79c11, committed 2022-11-29
- Comitter:
- fernandosakabe
- Date:
- Tue Nov 29 16:20:11 2022 +0000
- Parent:
- 0:cc81b0dd1ded
- Commit message:
- Projeto CCM
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Mon Oct 31 02:41:59 2022 +0000
+++ b/main.cpp Tue Nov 29 16:20:11 2022 +0000
@@ -1,159 +1,203 @@
-#include "mbed.h" //Incluea biblioteca mbed
+#include "mbed.h" //Inclui biblioteca mbed
-//define quais pinos serão para acionar a IHM
-DigitalOut EN_A (D2);
+//Pinos do motor de passo
+DigitalOut EN_A (D10);
DigitalOut IN1_A (D5);
DigitalOut IN2_A (D4);
DigitalOut EN_B (A4);
DigitalOut IN1_B (A0);
DigitalOut IN2_B (A1);
+//pinos motor DC
+PwmOut EN_A_DC (D11);
+DigitalOut IN1_A_DC (D12);
+DigitalOut IN2_A_DC (D13);
-InterruptIn interr(D8); //Define o InterruptIn para identificar os sinais da onda quadrada
-DigitalIn enable (D12); //Botão que liga e desliga projeto
-InterruptIn push(PC_13); //Botão de usuário que muda a direção do motor
-float periodo_seg = 2.0; //Quantidade de tempo em que se define a frequência do motor
-float frequencia = 0; //Frequência do motor
-float Tempo; //Periodo da onda
-int contador=0; //Conta a quantidadde de pulsos no periodo_seg
-Ticker tempo_alto;//Aciona função de calcula_frequencia (calcula a frequencia)
-int horario = 0; //Determina o sentido de rotação do motor em horário ou anti-horário
+Timeout desaciona_DC; //timeout que define quantidade tempo o motor DC vai rodar
-void muda_direcao() //Função que faz com que o sentido mude de horario para anti-horario e vice e versa
+int motor; //escolhe qual motor vai ser acionado
+int enable_passo=0; // liga/desliga motor de passo
+int enable_DC=0; // liga/desliga motor DC
+int sentido_passo; //define sentido de rotação do motor de passo
+int sentido_DC; //define sentido de rotação do motor de passo
+float velocidade_passo; //define velocidade do motor de passo em RPM
+float velocidade_DC; //define velocidade do motor DC em RPM
+int numero_rotacoes_passo=0; //define quantas vezes o motor de passo vai rodar
+int numero_de_passos_passo_pratico=0; //define a quantidade de passos que o motor deu
+float tempo_rotacionando_DC=0; //Define por quanto tempo o motor DC vai estar acionado
+float numero_de_passos_por_volta_passo=200; //A quantidade de passos por volta do motor de passo é 200
+float tempo_passo; //Calcula o wait a ser utilizado para cada fase
+float duty_cycle_DC=1; //define o duty cycle
+int ligado_DC; //aciona ou desaciona o motor DC no meio do suo
+
+void desliga() //Muda valor de ligado_DC
{
- if(horario==1) {
- horario=0;
- } else {
- horario=1;
- }
-}
-void alto() //Função que conta quantas vezes o InterruptIn foi acionado.
-{
- contador++;
-}
-
-void calcula_frequencia() //Função que calcula a frequencia
-{
- frequencia=contador/periodo_seg;
- contador=0;
+ ligado_DC=!ligado_DC;
}
int main()
{
- push.rise(&muda_direcao); //ativa a funcao muda direção quando obotão de usuário é acionado
- interr.rise(&alto); //Ativa a função alto quando há um rise nas ondas
- tempo_alto.attach(&calcula_frequencia, periodo_seg); //Ativa a funcao calcula a cada passagem de periodo
-
- EN_A = 0; // Desliga Ponte-H (A)
- EN_B = 0; // Desliga Ponte-H (B)
- IN1_A = 0;
- IN2_A = 0; // Ponte-H (A) Motor 'travado'
- IN1_A = 0;
- IN1_B = 0; // Ponte-H (B) Motor 'travado’
-
+
while(1) {
- Tempo = 1/frequencia; //calcula periodo a partir da frequencia
- printf("TEMPO = %f FREQUENCIA = %f \n\r", Tempo, frequencia);
- //Se o botão enable estiver acionado, liga o sistema
- if(enable) {
- //Define se o motor rotacionará no sentido horario ou anit-horario
- switch(horario) {
- case 0:
-
- //passo 0
+
+ //Perguntas para atribuir valor das variáveis
+ printf("Digite 0 para motor de passo ou 1 para DC \r\n");
+ scanf("%d", &motor );
+ if(motor==0) {
+ printf("Digite 1 para acionar o motor de passo e 0 para desacionar\r\n");
+ scanf("%d", &enable_passo);
+ if(enable_passo==1){
+ printf("Digite 0 para sentido horario e 1 para sentido anti-horario\r\n");
+ scanf("%d", &sentido_passo);
+ printf("Digite a Velocidade em RPM do motor de passo (valor entre 0 e 60 RPM)\r\n");
+ scanf("%f", &velocidade_passo);
+ printf("Digite o número de rotações do motor de passo\r\n");
+ scanf("%d", &numero_rotacoes_passo);
+ }
+ } else if(motor==1) {
+ printf("Digite 1 para acionar o motor DC e 0 para desacionar\r\n");
+ scanf("%d", &enable_DC);
+ if(enable_DC==1) {
+ printf("Digite 0 para sentido horario e 1 para sentido anti-horario\r\n");
+ scanf("%d", &sentido_DC);
+ printf("Digite a Velocidade em RPM do motor DC (valor entre 900 e 2000 RPM))\r\n");
+ scanf("%f", &velocidade_DC);
+ printf("Digite o tempo de rotação do motor DC em segundos\r\n");
+ scanf("%f", &tempo_rotacionando_DC);
+ }
+ }
+
+ if(motor==0) { //escolhe qual motor será ativado. No caso o de passo.
+
+ tempo_passo=0.3/velocidade_passo; //Calcula o tempo do passo pela velocidade inserida pelo usuário
+ numero_de_passos_passo_pratico=0; //Contador de passos
+ while(numero_de_passos_passo_pratico < numero_de_passos_por_volta_passo*numero_rotacoes_passo) { //roda o motor até numero de rotações definidas
+ if(enable_passo) {
+ //Define se o motor rotacionará no sentido horario ou anti-horario
+ switch(sentido_passo) {
+ case 0:
- EN_A = 1;
- IN1_A = 1;
- IN2_A = 0;
- EN_B = 1;
- IN1_B = 1;
- IN2_B = 0;
- wait(Tempo); //periodo definido anteriormente
+ //passo 0
- //passo 1
+ EN_A = 1;
+ IN1_A = 1;
+ IN2_A = 0;
+ EN_B = 1;
+ IN1_B = 1;
+ IN2_B = 0;
+ wait(tempo_passo); //periodo definido anteriormente
+
+ //passo 1
- EN_A = 1;
- IN1_A = 0;
- IN2_A = 1;
- EN_B = 1;
- IN1_B = 1;
- IN2_B = 0;
- wait(Tempo); //periodo definido anteriormente
+ EN_A = 1;
+ IN1_A = 0;
+ IN2_A = 1;
+ EN_B = 1;
+ IN1_B = 1;
+ IN2_B = 0;
+ wait(tempo_passo); //periodo definido anteriormente
- //passo 2
+ //passo 2
- EN_A = 1;
- IN1_A = 0;
- IN2_A = 1;
- EN_B =1 ;
- IN1_B = 0;
- IN2_B = 1;
- wait(Tempo); //periodo definido anteriormente
+ EN_A = 1;
+ IN1_A = 0;
+ IN2_A = 1;
+ EN_B =1 ;
+ IN1_B = 0;
+ IN2_B = 1;
+ wait(tempo_passo); //periodo definido anteriormente
- //passo 3
+ //passo 3
- EN_A = 1;
- IN1_A = 1;
- IN2_A = 0;
- EN_B = 1;
- IN1_B = 0;
- IN2_B = 1;
- wait(Tempo); //periodo definido anteriormente
+ EN_A = 1;
+ IN1_A = 1;
+ IN2_A = 0;
+ EN_B = 1;
+ IN1_B = 0;
+ IN2_B = 1;
+ wait(tempo_passo); //periodo definido anteriormente
+ break;
- break;
+ case 1:
+
+ //passo 3
- case 1:
+ EN_A = 1;
+ IN1_A = 1;
+ IN2_A = 0;
+ EN_B = 1;
+ IN1_B = 0;
+ IN2_B = 1;
+ wait(tempo_passo); //periodo definido anteriormente
- //passo 3
+ //passo 2
+
+ EN_A = 1;
+ IN1_A = 0;
+ IN2_A = 1;
+ EN_B = 1;
+ IN1_B = 0;
+ IN2_B = 1;
+ wait(tempo_passo); //periodo definido anteriormente
- EN_A = 1;
- IN1_A = 1;
- IN2_A = 0;
- EN_B = 1;
- IN1_B = 0;
- IN2_B = 1;
- wait(Tempo); //periodo definido anteriormente
+ //passo 1
- //passo 2
+ EN_A = 1;
+ IN1_A = 0;
+ IN2_A = 1;
+ EN_B = 1;
+ IN1_B = 1;
+ IN2_B = 0;
+ wait(tempo_passo); //periodo definido anteriormente
+
+ //passo 0
- EN_A = 1;
- IN1_A = 0;
- IN2_A = 1;
- EN_B = 1;
- IN1_B = 0;
- IN2_B = 1;
- wait(Tempo); //periodo definido anteriormente
+ EN_A = 1;
+ IN1_A = 1;
+ IN2_A = 0;
+ EN_B = 1;
+ IN1_B = 1;
+ IN2_B = 0;
+ wait(tempo_passo); //periodo definido anteriormente
- //passo 1
-
- EN_A = 1;
- IN1_A = 0;
- IN2_A = 1;
- EN_B = 1;
- IN1_B = 1;
- IN2_B = 0;
- wait(Tempo); //periodo definido anteriormente
+ break;
+
+ }
+ numero_de_passos_passo_pratico+=4;
+ } else {
+ //se botão enable desativado, desativa o EN_A e EN_B
+ EN_A=0;
+ EN_B=0;
+ }
+ }
+ } else if(motor==1) { //escolhe qual motor será ativado. No caso o DC
- //passo 0
+ ligado_DC=1;
+ desaciona_DC.attach(&desliga, tempo_rotacionando_DC); //aciona o Timeout pelo tempo definidopelo usuário. Este timout desligara o motor.
+
+ //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.
+ 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;
+ if(enable_DC) {
+ if(sentido_DC==0) { //define se o motor rotacionará pelo sentido horário ou anti-horario
+ IN1_A_DC=0;
+ IN2_A_DC=1;
- EN_A = 1;
- IN1_A = 1;
- IN2_A = 0;
- EN_B = 1;
- IN1_B = 1;
- IN2_B = 0;
- wait(Tempo); //periodo definido anteriormente
+ while(ligado_DC) {
+ EN_A_DC.write(duty_cycle_DC); //Aciona motor DC na velocidade e sentido definido peo tempo também definido pelo usuário
- break;
-
+ }
+ } else if(sentido_DC==1) {
+ IN1_A_DC=1;
+ IN2_A_DC=0;
+ while(ligado_DC) {
+ EN_A_DC.write(duty_cycle_DC);
+ }
+ }
}
-
- } else {
- //se botão enable desativado, desativa o EN_A e EN_B
- EN_A=0;
- EN_B=0;
-
+ IN1_A_DC=0; //desaciona o motor DC
+ IN2_A_DC=0;
+ EN_A_DC.write(0);
}
}
}