Bom estou realizando um projeto de controle de velocidade de um motor cc e para tal preciso dos valores de rpm do motor para encontrar a resposta degrau. Contudo quando faço as medições os valores de rpm estão dando entre 480 a 600 rpm, sendo que esse valor deveria está em torno de 270 rpm (velocidade do motor utilizado na planta). Então não consigo enxergar o que poderia está causando esse problema.

Exibições: 352

As respostas para este tópico estão encerradas.

Respostas a este tópico

Sugestões para correção: 

Fórmula corrigida

RPM = (pulsos / (millis() - tempo_passado))* (60 * 1000/ pulsos_por_volta) 

Conferindo: 

(60 * 1000/ pulsos_por_volta) = 3000

RPM = (pulsos / (millis() - tempo_passado)) * 3000 = (9 pulsos / 100 ms) * 3000 =  270 rpm 

Aumente o tempo de medição dos pulsos para 300 milisegundos: 

if (millis()- tempo_passado>= 300) 

Acho que é isso ai. 

Me corrijam se estiver errado....

Dessa forma ele não faz o calculo de rpm.

RPM = 0 para todo tempo;

Boa noite,

Você tentou mudar para isso?

if (millis()- tempo_passado>= 300) 

rpm = (pulsos / (millis() - tempo_passado)) * 3000

Boa noite LPM, (se não gosta que te chame pelas iniciais, avise),

olhando com mais detalhe seu sketch, verifiquei esta linha:

volatile byte pulsos;   

um byte vai de 0 a 15, ou seja se forem mais de 15 pulsos dentro do espaço de tempo, 

o valor retorna a zero e continua contando até 15.......

Se você alterou o tempo de contagem para 1000, não vai dar certo pois ainda assim vai estar contando até 15 somente.

Par testar seu código, fiz o seguinte

.

Liguei o PWM do pino 9 (490HZ) e injetei no pino 2.

Fazendo as contas com sua formula  3000/100  =  30 ,    490/10 (100 mseg)  = 49

                     30 * 49 = 1470 RPM

Usando o seu sketch, (corrigi a linha acima e mudei de lugar a carga do tempo-passado)  e deu o

resultado de 1470 RPM.

Isto significa que seu sketch está certo, mas talvez você tenha problemas de hardware, no sensor .

entrada_degrauV02.ino

RV mineirin

olá Larissa.

      Usando como base o código que vc postou aqui no LDG,  fiz a implementação da medição da RPM, usando uma técnica bastante precisa e confiável.

      A implementação tem diversos pontos que podem ser configurados, alguns dos quais mostrarei aqui mais à frente. O código  para download está no final do post.

      Mas antes, gostaria de falar sobre seu Hardware.  Pelo vídeo que vc postou, parece que vc está usando um Arduino UNO, e um módulo de controle de Motor  da  Adafruit  versão "V1" (ou um clone deste).

      Ainda sobre seu Hardware,  também parece que vc está usando uma plaquinha com Sensor Óptico  semelhante à mostrada em "frente e verso" na figura a seguir:

(clique na figura para "zoom")

      Caso vc esteja usando um módulo Sensor como o mostrado na figura anterior, poderia confirmar qual sinal da plaquinha ("DO" ou "AO") vc está conectando ao pino "2" do Arduino ?

      Pergunto isso porque o sinal "DO" tem transição digital um pouco melhor que o sinal "AO". Então o ideal seria usar o "DO" da plaquinha do Sensor. Mas isto não é imprescindível, uma vez que as entradas digitais do Arduino (UNO, Nano, etc) tem característica "Schmitt Trigger". Mesmo assim é sempre aconselhável tentar seguir as melhores práticas.

      Para testar o código, preparei uma Simulação no Proteus  usando o Arduino UNO. Nesta simulação, há diversos geradores de sinal, onde cada um gera uma frequência que seja 20x cada giro do eixo do Motor,  justamente como no seu Sistema. Então estes sinais são equivalentes às saídas de diversos Sensores Ópticos, o que permite verificar a qualidade da medição em várias faixas de RPM, indo de zero até 15 mil RPMs. O circuito usado na simulação pode ser visto na figura a seguir:

(clique na figura para "zoom")

      Observe que para obter zero RPM, usa-se a chave "SW2", a qual pode impedir que o sinal selecionado em "SW1" chegue ao pino "2" do Arduino.

      Obviamente que, no momento exato de uma mudança de posição das chaves, pode ocorrer um erro na medição da RPM, já que qualquer mudança nas chaves é assíncrona ao mecanismo de medição. Mas isso, se ocorrer, é apenas naquele momento da mudança.

      No final do post, há um link para um vídeo mostrando a simulação. Mas um print capturado da tela de simulação pode ser visto na figura a seguir:

(clique na figura para "zoom")

      A figura anterior mostra a RPM  no Terminal do Arduino, conforme fui mudando a posição da chave "SW1", indo de 100 RPM  até 15000 RPM.

      Agora falando sobre o código, ele está totalmente organizado e com comentários funcionais que explicam todos os processos. Então irei exibir apenas alguns pontos a respeito das configurações do funcionamento.

      A figura a seguir mostra a configuração do número de Pulsos por giro do Motor, que no caso é de 20 Pulsos por giro:

(clique na figura para "zoom")

      Vc pode também especificar um "timeout", para o caso do Sensor parar de gerar os Pulsos (seja por qual motivo for). Após este "timeout", o valor da RPM é zerada.  Assim este "timeout" irá determinar a mínima RPM que o Sistema é capaz de medir. A figura a  seguir mostra a definição deste "timeout":

(clique na figura para "zoom")

      A "printagem" da RPM no Terminal do Arduino, é feita em intervalos regulares, e isto pode ser especificado em segundos, conforme mostrado na figura a seguir:

(clique na figura para "zoom")

      Tanto em relação ao "timeout" da medição, quanto ao intervalo de "printagem", atente para as observações que estão nos comentários no código.

      O valor "printado", é da variável de nome "RPM_atual", a qual vc pode acessar em qualquer ponto do seu código (mas apenas lendo o valor da mesma !!!). Esta variável pode ser vista na figura a seguir:

(clique na figura para "zoom")

      Observar que a variável "RPM_atual" é do tipo "float", e portanto também indica valores fracionários de RPM. Caso vc precise apenas de valores inteiros, basta copiá-la para uma variável deste tipo (por exemplo "int"), com o que a parte fracionária será descartada. Mas também pode "copiá-la" arredondando o valor (pode fazer isto discretamente via código ou usar uma função matemática de arredondamento daquelas de algumas LIBs "padrões" da Linguagem C).

      O cálculo da RPM  é através de parâmetros medidos no Sistema, conforme pode-se ver na função que faz este cálculo, mostrada na figura a seguir:

(clique na figura para "zoom")

      A medição destes parâmetros é conduzida por uma Máquina de Estados  bastante simples, composta de apenas 3 estados (onde efetivamente apenas 2 estados fazem a medição, pois um deles é apenas usado uma única vez na inicialização do mecanismo de medição). A definição  dos estados  e a própria Máquina de Estados pode ser visto na figura a seguir:

(clique na figura para "zoom")

      Na figura anterior, as áreas marcadas nas cores amarela, verde, e laranja,  facilitam identificar os 3 estados implementados na Máquina.  Note a simplicidade do código.

      No "setup" do Arduino são inicializados os elementos e recursos necessários, enquanto que no "loop" do Arduino  é executada a Máquina de Estados  e o gerenciamento da "printagem" da RPM,  conforme pode ser visto na figura a seguir:

(clique na figura para "zoom")

      O download  do código  e  da simulação  está aqui:  "entrada_degrau_02.zip"

      E o vídeo da simulação  pode ser visto ou feito download  aqui:  "video simulação"

      Caso tenha alguma dúvida, não deixe de perguntar.

      Espero ter ajudado.

      abrçs,

      Elcids

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço