Meu Simples Controle de posição com o PIC12F675

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Meu Simples Controle de posição com o PIC12F675

Mensagempor MOR_AL » 02 Mai 2009 19:06

Olá pessoal.

Já há algum tempo, achava que dava para fazer um controle de posição bem simples com um motor CC.

O controle não é nem proporcional, nem integral e nem derivativo.
NÃO É PID!!!

Usei o PIC12F675, com 8 pinos e ainda sobrou muita memória flash e registros. Aliás o programa em assembler possui apenas 132 bytes, ficando ainda 892 livres. Só usa 5 registros de propósito geral.
A resolução, garantida, é de 8 bits. Montei, testei e comprovei. Com aproximadamente 27 graus, de um dia para o outro, a tensão de referência ficou em 5,00V, sem alterar. Usei um TL431 como fonte de referência e um trimpot para o ajuste, já que a tensão de alimentação do PIC não possui nem ajuste, nem precisão com a temperatura, e ainda possui ruído causado pelas comutações do PIC. Esta tensão de referência varia teoricamente entre 4,99V e 5,01V, para uma faixa de temperatura de -25 a 85 graus Celcios. É para crer, pois eu não testei.
Como este PIC não possui PWM, fiz com modulação por posição do pulso mesmo (PPM). O movimento ficou suave, sem tremedeiras da modulação.
O controle é simples e se baseia na seguinte suposição "Se faltou, avance. Se sobrou retroceda!". Por este motivo, a estabilidade é alcançada após um overshoot, que no meu caso ficou bem difícil de se observar.
O PIC recebe 2 sinais e a referência. O sinal do valor analógico da posição desejada, o valor analógico da posição medida e a tensão de referência. O PIC exterioriza dois sinais de controle. O H (de horário) e o AH (de anti-horário). Estes dois sinais são enviados ao drive, que aciona o motor. Os dois sinais foram necessários para que seja evitada a condução de um dos ramos do circuito "H" do drive, antes do outro ramo cortar. Isso causaria a queima do drive. Com isso, mesmo que o PIC possuisse PWM, não poderia ser usado, pois o PWM estaria disponível em apenas um pino de saída.

Segue um vídeo que eu fiz para o YouTube.

http://www.youtube.com/watch?v=NhY-JRYiYM8

Meu próximo projeto é um controle analógico, com as mesmas características deste. Quero ver as diferenças entre eles. Para mim é um trabalho bem mais simples que com o PIC.
Depois vou tentar fazer um outro projeto com o PIC. Este já com o PID. Minha idéia é não fazer nada complicado. Tentar fazer todas as variáveis com apenas um byte e a operação matemática mais complicada seria a de subtração de 2 bytes. As multiplicações e divisões, caso hajam, serão implementadas com deslocamentos à esquerda e à direita, respectivamente.
É isso aí. Quando tiver mais coisas eu posto aqui.

Em tempo. Visitem meu recém-inaugurado site. Lá estou acrescentando alguma coisa interessante para os amantes da eletrônica.
Apesar de já ter divulgado em alguns sites de busca, o tempo que eles pedem é de 2 meses. Se você pagar é pro dia seguinte. Vou disponibilizar o site aqui no fórum.

Abraços.

MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor MOR_AL » 08 Mai 2009 21:53

Olá pessoal.
Terminei um tutorial sobre este assunto e já o incluí em meu site. Cliquem no ícone abaixo para acessá-lo. Além das explicações, incluí diagramas esquemáticos e fotos do circuito. Este contém jumpers, que permitem que, com apenas mudança no programa, seja possível outros tipos de sistemas, como usando modo PWM e PID.
Tratei-o como um modo simples de encarar o problema.
A operação matemática mais complexa é uma subtração de dois bytes.
Acrescentei o arquivo CPS.hex, caso alguém se interesse pela montagem. Na verdade o arquivo é CPS.txt. Meu hospedeiro não permite hospedar um arquivo.hex. Já abrí o arquivo com o ICPROG e não deu problemas.
Abraços.
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor guest2003 » 09 Mai 2009 09:57

MOR,

Parabens, muito legal as experiencias, e belo tutorial.

Fiquei com algumas duvidas e não consegui ver nem no tutotial nem no video... me conte uma coisa,

Que motor voce usou ? Ele tem redução ou da conta de mover p carrinho direto no eixo ? (tem como tirar uma foto dele?)

Como você fez com o potenciometro ? utilizou algum artificio diferente ? Pois parece que o deslocamento é grande... cerca de 20cm ... com pot comum seria complicado fazer isso...

Já pensou em fazer alguma coisa parecida utilizando encoder optico ?

Mais uma vez parabens ! (inclusive pela vontade de compartillhar)

[]'s
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

Mensagempor MOR_AL » 09 Mai 2009 11:51

Olá Guest2003. Obrigado por suas palavras.

Que motor voce usou ? Ele tem redução ou da conta de mover p carrinho direto no eixo ? (tem como tirar uma foto dele?)


É um motor de impressora HP, jato de tinta, que eu destru...hãã...tinha encostada por falta de cartucho com tinta. O motor é para aprox. 12V (estou usando 13,6V). O acoplamento é por meio de correia dentada (vide foto).

Imagem

Como você fez com o potenciometro ? utilizou algum artificio diferente ? Pois parece que o deslocamento é grande... cerca de 20cm ... com pot comum seria complicado fazer isso...


Imagem

O curso do carrinho dos cartuchos é de aprox. 30cm. Eu tinha um tubo de vidro com 0,5cm de diâmetro e fio niquel-cromo fino, com um diâmetro de aprox. 0,1mm e 216 Ohms/m. Fiz o potenciômetro com aprox. 2500 voltas. Enrolar o fio com as voltas lado a lado não foi fácil. Usei uma furadeira para girar o tubo, mas o danado do tubo não girava certinho. A toda hora tinha que parar e voltar algumas voltas, para retirar algumas espiras trepadas nas outras. Não usarei mais este método para fazer novos potenciômetros. Dá muito trabalho. Acho que este é um dos motivos que fazem o sensor com uma fita de plástico, com uma imensa quantidade de linhas transversais. O problema é que com este sensor, você tem que voltar ao primeiro tracinho para saber em qual tracinho o carrinho estava. Estou fazendo cerca de 2000 medidas por segundo. Com este método não daria para voltar a cada medida para contar os tracinhos. Pelo que pude observar é difícil converter os tracinhos em pulsos, sem perder a contagem. A impressora faz isso porque para cada linha, tem que ir ao início e fim do cursor. Ou então, se há poucas palavras na linha, a contagem é menor e mais lenta. Com o potenciômetro a medida é absoluta, não havendo necessidade de contar os tracinhos. Como o potenciômetro é formado por espiras, a tensão não varia linearmente e sim por saltos. Mas com 2500 espiras, a resolução fica ótima. Dão cerca de 5 volts divididos por 2500 = 2mV entre espiras. Já com o CAD de 8 bits, dão 5 volts divididos por 256 = 19,5mV, quase 10 vezes pior.

Já pensou em fazer alguma coisa parecida utilizando encoder optico ?


A própria impressora possui algo no gênero. Eu quis fazer algo simples. Mais direto. Com a leitura da tensão no potenciômetro, o programa fica bem mais simples. Eu fiz em assembler para reduzir ao máximo o número de instruções, pois dele depende o período mínimo dos pulsos PPM.

Guest2003. Grato novamente por suas palavras. Volto a lembrar, porém, que este não é um modo clássico de se fazer um sistema de controle. Ele funciona para sistemas com pouca inércia mecânica, pois fica simples pará-lo e mesmo voltar, imediatamente após o erro trocar de sinal. Para sistemas com mais inércia, fica perigoso variar tanta energia cinética em um tempo pequeno.
Agora que sei que está funcionando, vou tentar fazer um pêndulo invertido...Já há algum tempo me incomodando.
Abraços.
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor guest2003 » 09 Mai 2009 12:02

obrigado pela foto e pelas explicacoes...

Só pra complementar sobre a fita... ela nao precisa voltar para contar os tracinhos sempre nao...

Aqueles tracinhos funcionam como um encoder com detector de quadratura, na cabeça existem 2 sensores (ou mais) e com isso após a inicialização (buscar o zero) sempre ela sabe onde esta e não precisa mais voltar no zero... é a mesma ideia usada no mouse... só que o disco perfurado esta esticado ao longo da fita ;)

[]'s
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

Mensagempor RobL » 09 Mai 2009 12:40

Mor_Al
Em tempo. Visitem meu recém-inaugurado site


Onde está o endereço do seu site ? Não consegui encontrar.

Sobre o seu sensor de posição:
Deixou clara sua intenção de fazer seu controle de posição de forma analógica, além da construção viável artesanal.
Se não fosse a dificuldade de encontrar engrenagens adequada, um potenciômetro multivoltas poderia dar conta do recado, porém, a durabilidade seria baixa e a resolução não sei se lhe atenderia.

Mas daria para fazer de forma digital, com uma só regua, tipo impressora com um só led emissor/receptor . Usar um sinal do motor para indicar o sentido do movimento (somar/subtrair) em vez de usar quadratura com um sensor mais complexo.
Avaliando rapidamente, não imagino qual a maior resolução possível com uma construção artesanal e nem o material mais adequado para tal. Transparência em uma laser ?
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor guest2003 » 09 Mai 2009 12:53

Robl,

Não funcionaria não... precisaria ser quadratura sim, pois nem sempre o motor esta andando pra onde deveria :) (ou gostariamos)

No caso do overshoot você perderia a posicao... Tipo estaria mandando o motor voltar e ele ainda estaria indo pro lado contrario... (com isso introduziria erros na sua contagem)

Quanto ao endereço... na parte inferior dos posts, sempre existem alguns botoes que variam de usuario para usuario. (De acordo com o que vc preencheu no seu profile)

Tem PERFIL , EMAIL , PM , WWW <-- este é o que contem a homepage

[]'s
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

Mensagempor MOR_AL » 09 Mai 2009 12:53

Guest2003.
Correto, porém é necessário que não seja perdido nenhum tracinho, e pelo visto há cerca de 1500 tracinhos (5 tracinhos por mm * 300mm), o que iria de encontro à minha diretiva de fazer tudo com variáveis com apenas 8 bits.
No caso da impressora, é quase que natural o carrinho percorrer todo o percurso, facilitando a recontagem dos tracinhos. Outro fato é que a impressão consome tempo, facilitando ainda mais a contagem.
Segundo a foto na figura 8 do tutorial, a velocidade calculada do carrinho é de 75cm/s, o que é bem rápido.
Considero este assunto interessante, por isso, toda idéia ou comentário é bem-vindo. A idéia do encoder é muito boa.
Vou confessar agora.
Quando estava desmontando a impressora, sem querer destruí a fita de circuito impresso que ia conectada ao encoder. Aí pensei "Não tinha o diagrama do encoder mesmo. Ia dar muito trabalho para fazer o circuito :oops: ".

RobL

A minha montagem é artesanal. Andei procurando por um sensor linear, mas esbarrava com o preço. Observe que com o potenciômetro, que tem 2500 a 3000 espiras, daria para ter uma resolução de 11 bits. Não me preocupei em fazer algo mais elaborado, apesar de não saber do trabalho que daria para montar o potenciômetro.
Realmente há muitas idéias, todas válidas. Eu usei a apresentada. Poderia ter usado esta outra, mas não foi o caso. :D
Abraços.
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor guest2003 » 09 Mai 2009 13:09

Veja MOR,

É possivel fazer o contador de quadratuda externamente, caso não se sinta a vontade de faze-lo via software, pode utilizar um contador TTL up/down e poucas portas logicas para fazer a seleção da contagem...

Ai sempre temos nos pinos do contador (quantos bits vc quiser) a posição atual do carrinho.

Pode fazer apenas a logica de contagem e entrar no pino de contagem do timer do PIC e contar internamente... a logica te daria CLK e DIR ...

Neste caso que estamos falando a frequencia do clock maxima seria de 3750Hz (para 75cm/s) o que para um processador não é tão rapido assim.

[]'s
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

Mensagempor MOR_AL » 09 Mai 2009 13:25

Guest2003.
É uma opção a ser considerada.
No momento pretendo avançar no meu objetivo.

1 - Bolar um fluxograma para manter o pêndulo invertido.
2 - Bolar um fluxograma para prever a batida do carrinho nos dois extremos.
3 - Bolar um fluxograma para que o próprio sistema reestabeleça o equilíbrio do pêndulo invertido, caso o equilíbrio seja perdido.
4 - Bolar um fluxograma para que, após o equilíbrio do pêndulo, o carrinho vá para a posição central.

Como você pode ser, ainda tenho muito trabalho pela frente. Posteriormente gostaria de fazer um controle PID com variáveis com apenas 8 bits. Quem sabe dá certo?!
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor guest2003 » 09 Mai 2009 13:34

MOR,

Acho que já deve ter visto este video... mas se não viu vai gostar :)

http://www.youtube.com/watch?v=XQ_ThZHNe4c

Imagino que o poder de fogo de um PIC simples não vai dar conta de calcular as equações para o pendulo não.

[]'s
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

Mensagempor RobL » 09 Mai 2009 13:38

Guest2003
Você está correto se a aplicação exigir rigor.
É necessário saber se em determinada aplicação, a massa do carrinho responde aos overshoots, que implicassem na mudança de sentido do carrinho. Normalmente, essas oscilações não cruzam o eixo no outro sentido, ou pelo menos evitaríamos isso com amortecimento suficiente. Vai depender da relação massa /frequência.
Se for por inércia e o último sinal informado for "somar", mesmo após desligar, o sentido do carrinho continuará o mesmo, até parar e ainda assim, teremos contagem correta. Porém, sem dúvida, se a inversão for muito rápida e a massa considerável, aí pode complicar, pois para reduzir o erro ficaria muito trabalhoso, sem quadratura.
Mas se no processo, for viável um tempo morto, para informar que o carrinho parou e somente após inverter o movimento, essa forma simples poderá se aplicada.

Quanto ao site, a informação é bem grande no botão abaixo, aí é mesmo embotamento.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor guest2003 » 09 Mai 2009 13:45

Verdade Robl,

Voce poderia inclusive usar o proprio sensor para saber se o carrinho ja parou e se pode inverter sem perder nada.

Mas como vc disse, em aplicacoes de controle que exigem mais velocidade um "overshootzinho" é até bem vindo... como no caso de maquinas pick&place de componentes SMD, precisam de muita velocidade, ai corrigem a posicao pelo encoder na parada.

[]'s
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

Mensagempor MOR_AL » 09 Mai 2009 14:18

Guest2003.
Eu já tinha visto este vídeo (e outros). O autor conta com uma invejável disponibilidade de oficina mecânica (tornearia, frezas etc), além de recursos financeiros.
Meu projeto é tupiniquim. Alcançar o mesmo objetivo, com disponibilidade limitada. O curso do carrinho dele é quase de 1m, o que dá maior margem para a correção. Mas eu não desanimo. Vou tentar assim mesmo :D .

Agora!

Guest2003 e RobL.
Deixa eu colocar mais detalhes das minhas intenções. Talvez seja possível de se fazer (eu acredito que sim).

Realizado.

1 - A primeira condição foi satisfeita. Fazer um sistema de controle de posição simples funcionar, usando o PIC12F675, que tem só 8 pinos e nem PWM possui. Fosc = 4Mc/s. Isso com bastante rapidez. 2000 amostragens e correções por segundo e velocidade máxima do carrinho em 75cm/s
2 - Fazer um circuito que preveja a inclusão da segunda entrada analógica. A primeira é a variável linear do carrinho e a segunda é a variável angular do pêndulo.
3 - Manter a precisão do CAD, com uma fonte de referência estável.
4 - Fazer todo o programa de controle (até aqui) usando apenas 132 bytes de programa (ainda tenho 892 livres) e 4 registros de 8 bits de propósito geral.
5 - Caso venham a ser necessárias, já fiz as rotinas que calculam além do módulo e sinal do erro, o módulo e sinal da derivada do erro (já testada e funcionando). A integral é quase que imediata, pois é a soma de todos os erros anteriores.
Os coeficientes das parcelas PID é que seriam compostos por números reais, logo muita memória e muito tempo de compilação, além de recair em DSPIC. Minha opção é, caso realmente seja necessário o PID, usar coeficientes inteiros, entre 0 e 255 (apenas um byte) e operações matemáticas simples (adição subtração, divisão e multiplicação; estes dois últimos por fatores de 2).

Acredito que:

1 - Seja possível realizar o controle do pêndulo com o mesmo PIC12F675. Sem DSPIC e altas taxas de clock.
2 - Não seja necessário um controle PID.

Por realizar

Vide uma das postagens anteriores.

[]'s
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor Carmo Munhoz » 10 Mai 2009 11:58

Fiz uns cálculos para o caso do uso de encoder de mouse (não óptico) acoplado ao eixo do motor.

O encoder que eu tenho na mão (de um mouse vagabundo) tem 38ppr, ou seja, resolução de 9,4737 graus. [360/38]

Vou supôr que a sua engrenagem tem 15mm de diâmetro, onde uma volta completa deslocaria o carrinho em 47,1239mm [15*PI]

Consequentemente, este encoder forneceria uma resolução de 1,2401mm [47,1239/38] no deslocamento do carrinho ou 0,6200mm se fizer a leitura individual de cada canal do leitor IR (suponto que os canais tenham defesagem de 25%)

Se quiser, pode colocar mais um conjunto LED/Receptor neste mesmo disco, mas calibrado em meio pulso em relação ao primeiro, fornecendo resolução de 0,3100mm no deslocamento do carrinho, aproximadamente 1/3 de mm.

Claro que esses valores dependem do disco de mouse que usar e do diâmetro da engrenagem.

Teria que levar também em consideração que, no start, o carrinho deverá procurar pela posição de referência e a dificuldade de acoplamento desse(s) encoder(s) no motor.
Carmo Munhoz
Bit
 
Mensagens: 5
Registrado em: 13 Dez 2006 06:46

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x