Ir ao conteúdo
  • Cadastre-se
INFOHOUSENAVEGA

Controlar posição de motor cc com pic

Recommended Posts

Boa tarde a todos!!!

Estou com dificuldades de controlar a posição de um motor cc com pic.

meu projeto se resume em um potenciômetro que informa qual a posição que o motor deve estar. No motor também a um potenciômetro para informar sua posição.

O problema é que quando mando o motor para x posição ele obviamente passa da mesma ai fica passado e voltando.

Conto com a ajuda de vocês.

Estou usando o microcontrolador 16f877a e uso o compilador ccs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso acontece por causa da inércia do motor. Quando você manda ele para a posição X, ele chega até a mesma com muita velocidade e acaba passando dela.

O mesmo ocorre quando você tenta corrigir a posição, já que ele passou de onde deveria.

Acredito que a forma mais eficiente seria um controle PID. O problema que é complicado de fazer. Pelo menos nunca consegui realizar um.

O que eu tentaria no seu caso, seria colocar um PWM nesse motor para quando ele estiver chegando próximo à posição correta, a velocidade seria reduzida para que possa ser mais fácil ele parar no lugar certo.

Aguarde mais opiniões de colegas mais experientes no assunto.

Falou

Compartilhar este post


Link para o post
Compartilhar em outros sites
Isso acontece por causa da inércia do motor. Quando você manda ele para a posição X, ele chega até a mesma com muita velocidade e acaba passando dela.

O mesmo ocorre quando você tenta corrigir a posição, já que ele passou de onde deveria.

Acredito que a forma mais eficiente seria um controle PID. O problema que é complicado de fazer. Pelo menos nunca consegui realizar um.

O que eu tentaria no seu caso, seria colocar um PWM nesse motor para quando ele estiver chegando próximo à posição correta, a velocidade seria reduzida para que possa ser mais fácil ele parar no lugar certo.

Aguarde mais opiniões de colegas mais experientes no assunto.

Falou

Então estive pesquisando sobre o controle PID e não consegui nada que me ajuda-se.

quanto ao PWM eu fiz porém da maneira que fiz ele demora muito para encerrar o processo totalmente.

Para melhor entenderem!!!!

if (pos_motor < (baseValue) { //onde pos_motor é a posição do motor

set_pwm2_duty(baseValue-pos_motor); // baseValue é a posição do potenciometro

set_pwm1_duty(0);}

else if

(pos_motor > (baseValue) {

set_pwm1_duty(baseValue-pos_motor);

set_pwm2_duty(0); }

else

set_pwm2_duty(0);

set_pwm1_duty(0);

Obirgado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O pwm está indo de 0 a 1024 ou de 0 a 255?

E o AD? De 0 a 1024 ou de 0 a 255?

Do jeito que você fez:

set_pwm2_duty(baseValue-pos_motor)

Imagino que ele comece com velocidade alta e vá diminuindo certo? Como indiquei de teste. O problema que quando ele vai chegando perto do destino final, a velocidade cai muito, chegando a 0. Certo?

Tente não diminuir tanto. Veja que motores funcionam melhor com um duty cicle maior que 25~30%. Menos que isso as vezes nem giram.

Tente algo como

set_pwm2_duty(baseValue - pos_motor + Z)

Sendo Z um número arbitrário. Tente valores diferentes.

baseVlue é um valor fixo, destino do motor.

pos_motor é onde ele se encontra.

Com a movimentação do motor, pos_motor aumenta chegado próximo de baseValue. Mas não queremos que essa diferença seja muito pequena para não demorar o processo.

Outra coisa. Seria interessante colocar uma janela ao invés de um baseVlue. Dificilmente conseguirá chegar exatamente nele.

Falou

Compartilhar este post


Link para o post
Compartilhar em outros sites
O pwm está indo de 0 a 1024 ou de 0 a 255?

E o AD? De 0 a 1024 ou de 0 a 255?

Do jeito que você fez:

set_pwm2_duty(baseValue-pos_motor)

Imagino que ele comece com velocidade alta e vá diminuindo certo? Como indiquei de teste. O problema que quando ele vai chegando perto do destino final, a velocidade cai muito, chegando a 0. Certo?

Tente não diminuir tanto. Veja que motores funcionam melhor com um duty cicle maior que 25~30%. Menos que isso as vezes nem giram.

Tente algo como

set_pwm2_duty(baseValue - pos_motor + Z)

Sendo Z um número arbitrário. Tente valores diferentes.

Falou

MatheusLPS muito obrigado pela atenção que voce esta tendo.

o PWM e o AD esta indo de 0~255

vou tentar desse jeito para ver.

posto o resultado assim que pronto.

valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Editei o post anterior poucos segundos antes de você postar. Verifique novas informações.

Falou

Compartilhar este post


Link para o post
Compartilhar em outros sites
O pwm está indo de 0 a 1024 ou de 0 a 255?

E o AD? De 0 a 1024 ou de 0 a 255?

Do jeito que você fez:

set_pwm2_duty(baseValue-pos_motor)

Imagino que ele comece com velocidade alta e vá diminuindo certo? Como indiquei de teste. O problema que quando ele vai chegando perto do destino final, a velocidade cai muito, chegando a 0. Certo?

Tente não diminuir tanto. Veja que motores funcionam melhor com um duty cicle maior que 25~30%. Menos que isso as vezes nem giram.

Tente algo como

set_pwm2_duty(baseValue - pos_motor + Z)

Sendo Z um número arbitrário. Tente valores diferentes.

baseVlue é um valor fixo, destino do motor.

pos_motor é onde ele se encontra.

Com a movimentação do motor, pos_motor aumenta chegado próximo de baseValue. Mas não queremos que essa diferença seja muito pequena para não demorar o processo.

Outra coisa. Seria interessante colocar uma janela ao invés de um baseVlue. Dificilmente conseguirá chegar exatamente nele.

Falou

Desculpe minha ignorância, mais o que voce quer dizer com " Outra coisa. Seria interessante colocar uma janela ao invés de um baseVlue. Dificilmente conseguirá chegar exatamente nele."

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja, imagine que você quer o motor vá para a posição 150.

Será difícil você conseguir isso exatamente nessa posição.

Dessa forma, tente algo como (imaginando a baseVlue = 150):

if ((pos_motor < (baseValue - 10) || (pos_motor > (baseValue +10))

Sendo || é o operador OR ou OU, Assim:

Se posição do motor for menor que 150 - 10 OU maior que 150 + 10

Entenda como: se o motor estiver entre 140 e 160, está próximo de onde você quer.

Não precisa ser 10, pode ser qualquer valor. Tente valores pequenos como 1 ou 2 até encontrar um que seja satisfatório.

off-topic: Vou passear com o cachorro. Depois eu volto.

Falou

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×