Fórum

Servo driver CCS co...
 
Notifications
Clear all

Servo driver CCS com 12f675, versão sem PID

18 Posts
2 Users
0 Likes
5,776 Leituras
(@vinci)
Eminent Member
Joined: 8 anos ago
Posts: 22
Topic starter  

Olá, estou trabalhando nesta versão que funciona, mas preciso adicionar dimensão de tempo, de 1 a 2 ms, curva normal de servo, neste exemplo só ha tempo mínimo de 1000, pode dar-me um exemplo? Também aproveito para perguntar como seria possível faze uma rotina de inicialização, executável somente uma vez, a cada vez que o pic é ligado, esta rotina seria: Ligar uma porta por 1,5s, desligar e ligar outra por 1,5s, desligar, ligar o ADC e acionar a mesma porta lendo o programa para comparar o valor de pulso com o potenciômetro, o que faria meu servo que usa um sensor hall com imas contrapostos rotatórios achar o centro, o que faço funciona mas por não ser um pot, se for desligado na posição errada, não acha o centro, este servo visa pequeno tamanho e pouco peso, coisa de 0,7 a 1 grama, muito melhor e leve  que acionador magnético.

Agradeço pela sua página e seu tempo.

Vince


   
Quote
(@clarios)
Reputable Member Admin
Joined: 12 anos ago
Posts: 357
 

Desculpe, mas estou um pouco confuso com o seu comentário. Quando você diz que "está trabalhando nesta versão que funciona..." a qual se refere? Poderia por gentileza, passar a data do artigo ou a REF?

Na rotina 'main' logo na inicialização, antes do loop  for(;;) ou while(1) você pode adicionar  rotinas que serão executadas uma única vez ao ligar ou no reset.

Realmente, o fato de não usar potenciômetro obriga  a ter alguma forma de referênciar após o reset, como por ex. um interruptor que seja acionado quando o servo gira  naquela direção e zera algum tipo de contador de posição.


   
ReplyQuote
(@vinci)
Eminent Member
Joined: 8 anos ago
Posts: 22
Topic starter  

Olá, é a versão " Driver para servo atuador" de 28/11/2015, segue o arquivo c em CCS de sua autoria.

Entendido quanto as rotinas, mas o que mais preciso é  tempo definido de 1 a 2 ms, pois o servo tem que ter um curso definido, poderia dar um exemplo em cima do seu código "c"

Grato

Vinci


   
ReplyQuote
(@clarios)
Reputable Member Admin
Joined: 12 anos ago
Posts: 357
 

Eu não entendi bem a questão do 'tempo definido de 1 a 2 ms'. Este valor é recebido de fora para o servo. O programa apenas lê este período e rege tentando equilibrar com movimento no eixo que está ligado ao potênciometro. Ao equilibrar para de acionar.


   
ReplyQuote
(@vinci)
Eminent Member
Joined: 8 anos ago
Posts: 22
Topic starter  

Olá, grato por responder. Sim este é o feedback para equilibrar a tensão. O que estou dizendo é que, além do período mínimo definido no programa, preciso ter alcance definido de 1 a 2 ms, na sequinte razão:

se o valor de servo_entrada ( em ms ) for <= a 1ms ( Valor recebido  do Transmissor em PWM /TEMPO)

então valor = a 1ms

se valor de servo_entrada  for >= 2ms

então valor = a 2ms

No seu programa a função é executada pelo r_sinal, que define o meio e curso do servo, então me parece que é necessário definir duas variáveis, uma variável para o p_mín com máximo é mínimo e a variável acima para 1 a 2 ms como limites a receber do transmissor. Uma coisa que fiz também em seu programa até agora foi tirar a divisão por 2 da linha:

r_sinal=r_sinal>>1; //divide por 2 - assim, sem dividir por 2, o servo fica com alcance normal e equilibrado.

Se feito assim, como indico no inicio do comentário, limito o alcance que o transmissor possa ter para 1 a 2 ms, a maioria do Tx comerciais não são equilibrados quanto a isto, mesmo que no menu de setup do rádio seja regulado para 1 a 2 ms os valores externos são maiores, já medi com osciloscópio várias vezes em vários rádios.

Entendo a lógica do programa mas falta-me experiência para fazer o programa funcionar. 


   
ReplyQuote
(@vinci)
Eminent Member
Joined: 8 anos ago
Posts: 22
Topic starter  

Olá

Não sei porque foi quatro vezes a mesma resposta!

Vinci


   
ReplyQuote
(@clarios)
Reputable Member Admin
Joined: 12 anos ago
Posts: 357
 

Olá, grato por responder. Sim este é o feedback para equilibrar a tensão. O que estou dizendo é que, além do período mínimo definido no programa, preciso ter alcance definido de 1 a 2 ms, na sequinte razão:

se o valor de servo_entrada ( em ms ) for <= a 1ms ( Valor recebido  do Transmissor em PWM /TEMPO)

então valor = a 1ms

se valor de servo_entrada  for >= 2ms

então valor = a 2ms

No seu programa a função é executada pelo r_sinal, que define o meio e curso do servo, então me parece que é necessário definir duas variáveis, uma variável para o p_mín com máximo é mínimo e a variável acima para 1 a 2 ms como limites a receber do transmissor. Uma coisa que fiz também em seu programa até agora foi tirar a divisão por 2 da linha:

r_sinal=r_sinal>>1; //divide por 2 - assim, sem dividir por 2, o servo fica com alcance normal e equilibrado.

Se feito assim, como indico no inicio do comentário, limito o alcance que o transmissor possa ter para 1 a 2 ms, a maioria do Tx comerciais não são equilibrados quanto a isto, mesmo que no menu de setup do rádio seja regulado para 1 a 2 ms os valores externos são maiores, já medi com osciloscópio várias vezes em vários rádios.

Entendo a lógica do programa mas falta-me experiência para fazer o programa funcionar. 

resp.------------------------------------------------------------------------------------------------------------------------------

Desculpe a minha ignorância ou dificuldade de entender o que você quer. De radiomodelismo sou uma negação. Tx,s equilibrado???

Por estar longe de suas montagens eu não consigo visualizar o que você tem em mãos .  Poderia fazer um rascunho do seu sistema para eu poder começar a pensar de forma correta nas suas intenções de controle?

Está usando motor cc para acionar os movimentos do servo? Está usando ainda o potenciômetro para a recopia ou somente o sensor hall giratório. Quanto a este sensor hall giratório eu não estou familiarizado com ele? Olhando algumas informações na internet parece que ele fornece 50% de tensão no meio e 0 ou 100 % nos extremos. Qual os valores de saída: 0 a 5volts sendo 2,5 volts no centro?

Você quer usar o valor deste sensor para comparar direto com o valor recebido de 1 a 2 ms, lido pelo timer e salvo na variável r_sinal?

Se for isto tem que se pensar em uma formula matemática para converte o valor do sensor em proporção ao do sinal 1 a 2 ms recebido (r_sinal).

 

 

 

     

 


   
ReplyQuote
(@clarios)
Reputable Member Admin
Joined: 12 anos ago
Posts: 357
 

Desculpe a minha ignorância ou dificuldade de entender o que você quer. Por estar longe de suas montagens eu não consigo visualizar o que você tem em mãos . Poderia fazer um rascunho do seu sistema para eu poder começar a pensar de forma correta nas suas intenções de controle?

Está usando motor cc para acionar os movimentos do servo? Está usando ainda o potenciômetro para a recopia ou somente o sensor hall giratório. Quanto a este sensor hall giratório eu não estou familiarizado com ele? Olhando algumas informações na internet parece que ele fornece 50% de tensão no meio e 0 ou 100 % nos extremos. Qual os valores de saída: 0 a 5volts sendo 2,5 volts no centro?

Você quer usar o valor deste sensor para comparar direto com o valor recebido de 1 a 2 ms, lido pelo timer e salvo na variável r_sinal?

Se for isto tem que se pensar em uma formula matemática para converter o valor do sensor em proporção ao do sinal 1 a 2 ms recebido (r_sinal).

Encontrar um valor que multiplica pelo valor do sensor hall seja proporcional a leitura do tempo 1 -2 mseg feita pelo timer 1 e colocado na variável r_sinal.

O microcontrolador trabalha a 4mhz dando 1 useg por instrução.
Então um sinal na entrada de 1ms teremos a contagem de 1000 no timer 1. E se for 2ms teremos a contagem de 2000.

Assim temos:

sinalPwmMax=2000

sinalPwmMin=1000

Se o sensor hall trabalhar com 0 a 5 volts e usando 10 bits no ADC teremos:

hallmax=1023       

hallmin=0

 

x = (2000 - 1000)/(1023-0)

x= 0,9775

Criamos uma variavel para a comparação com r_sinal que conterá o valor do sensor hall ajustado matemáticamente.

hall_sinal= (hall_lido(adc) * 0,9775) + sinalPwmMin

Basta comparar r_sinal com hall_sinal para saber se deverá ligar as saídas para um lado ou para outro, e se forem iguais, ficar parado.

Mas se não for nada disso que você tem em mente, tente dar mais detalhes para entender melhor o que temos na nossa frente.

 


   
ReplyQuote
(@vinci)
Eminent Member
Joined: 8 anos ago
Posts: 22
Topic starter  

Olá, Perdão por não ter sido mais claro à respeito. (  segue a foto do servo de um colega, não é o mesmo que o meu mas o conceito é o mesmo ) Ha duas maneiras nas quais farei estes servos, na forma da foto e na forma tradicional, mas em ambas as formas, em se tratando de nano servos, tem que haver restrição de movimentação, por isto o dimensionamento de curso de 1 a 2ms independentemente do quanto o TX possa fornecer. No servo com imas rotativos o que fiz foi colocar em nivel  zero a resposta do comparador à movimentação, limitando apenas a que ele desligue o motor quando atingir tal voltagem, como o direcionamento é feito a partir da parada do motor, tanto faz onde o Hall achou o valor mas a resolução e local de parada dos servos é precisa, por isto a rotina de inicialização,  já que, ao desligar, o servo pode parar em uma posição diferente da do centro, nesta rotina liga-se o TX e o  programa faz o resto, vai para esquerda, desliga, vai para a direita,  desliga, liga novamente para a esquerda e roda o programa achando a posição referente à voltagem ( preciso bolar uma rotina para quando o tx estiver desligado para não queimar o motor ). Neste servo com Imas rotatórios a velocidade de saída do eixo que giram os imãs não é alta, e o servo se acha, embora o pulso fique subindo e descendo de 0 a 5 V quando passa pelo valor correspondente ao feedback desliga o motor e por estar com a rotina em nível zero, nestas linhas :

if(r_sinal >(r_pot+off_zone)){//compara se maior do que o potenciômetro
out_a=1; out_b=0; " (ambas setadas agora para zero )
}
if(r_sinal <r_pot){ //compara se menor do que o potenciômetro
out_a=0; out_b=1; ( setadas para zero )

Valendo apenas a: 

if((r_sinal <=(r_pot+off_zone))&&(r_sinal >=r_pot)){//compara se está na zona desligada
out_a=0; out_b=0;

Penso que talvez seja melhor migrar para o Pic 12f635, trabalha em 8mhz e tem uma resolução melhor, mas no momento estou com o 12f675.


   
ReplyQuote
(@vinci)
Eminent Member
Joined: 8 anos ago
Posts: 22
Topic starter  

Olá, Perdão tive que parar a mensagem  para resolver um problema,. Sua abordagem é muito interessante e adoraria fazer testes com um ela, principalmente para servos de montagem convencionais creio que vai funcionar muito bem, e sem os inconvenientes dos pots, volume, peso e desgaste.

Para este Frankstein que estou fazendo ( em termos de tamanho e peso, +- 0,8g ) para os Caras como Eu que também voam indoor será bom, além de divertido, tenho que fazer um buffer para ter aonde guardar os últimos dados lidos do pulso de entrada e comparar com os dados novos e assim aplicar as variáveis de liga/desliga portas, com a diferença de que, por não haver pot. e nem compensação da posição pelo pot, apenas a ação direta do sensor que quando passar na voltagem de feedback vai desligar o motor. Então ficaria:

Ler o sinal - guardar no buffer - comparar o sinal -  rotina de ligar e desligar portas -  volta a ler e atualizar buffer,

Acha viável?

Grato pelo interesse que tem demonstrado

Vinci


   
ReplyQuote
(@clarios)
Reputable Member Admin
Joined: 12 anos ago
Posts: 357
 

Não sei se é a mesma coisa. Mas se você ligar o tx e no rx salvar em um registrador ou mesmo na eeprom o valor recebido pelo timer como sendo a posição '0' (suponho que seja 1,5 ms de período) para fins de comparação. Depois, em uso, se  o rx receber acima deste valor (supondo) ligaria o motor. Se receber abaixo deste valor desligaria o motor. Ou estou falando besteira?


   
ReplyQuote
(@vinci)
Eminent Member
Joined: 8 anos ago
Posts: 22
Topic starter  

Olá, me parece que usar registrador é melhor que eeprom. Poderia fazer alguns exemploss de suas ideias de ambas as suguestões que fez, do sensor de efeitor hall por contagem e este de colocar o valor no registrador em algumas linha, Eu vou tentar me  virar com o resto, como Eu disse antes não passo muito tempo programando então a tendencia é demorar muito para fazer algo.

Grato

Vinci


   
ReplyQuote
(@clarios)
Reputable Member Admin
Joined: 12 anos ago
Posts: 357
 

Preciso me familiarizar primeiro com o programa asm que você enviou.Tenho que entender como funciona atualmente em detalhes. Depois poderei pensar se dá para fazer a aplicação prática da idéia.


   
ReplyQuote
(@vinci)
Eminent Member
Joined: 8 anos ago
Posts: 22
Topic starter  

Olá,  Está falando sobre o ASM do ESC Brushed, não ha pressa nenhuma sobre este, quando puder e tiver tempo, mas suas ideias sobre o controle de servo seriam muito bem vindas, se possível  faça algumas linhas dos parâmetros para salvar nos registradores para leitura e gravação nos registros da atualização dos valores de tempo lidos, Eu parte a partir daí.

 

Vinci


   
ReplyQuote
(@clarios)
Reputable Member Admin
Joined: 12 anos ago
Posts: 357
 

DEsculpe, mas  eu ainda estou confuso em como poder ajudar. Por exemplo: Existe servos usados para produzir movimento angular (braço que gira para esquerda e direita mas não passa de um ângulo de 90 º, ou seja um servo de movimento angular). Existe servos que controlam a velocidade de motores (como o ESC que me enviou).

O ponto é: Qual é o tipo que estamos tratando? Uma vez que você citou o uso de um sensor hall de imãs contrapostos e enviou o arquivo do ESC para controle de velocidade (pwm)?

Se for o de movimento angular, eu precisava saber quais são todos os componentes e como é o processo que usa para o ajuste inicial. Como está ligado este sensor hall? No pic? No motor? Em um rele?

O próprio sensor hall de imãs contrapostos não poderia ser usado no lugar do potenciômetro de recópia?  Se o centro dele for 2,5 volts seria equivalente a metade do movimento do potenciômetro. A entrada analógica leria da mesma forma que o potenciômetro. Ou este sensor hall produz 0 a 5 volts para um lado e 0 a 5 volts para outro? Teria o modelo? O datasheet dele para saber o "modus operandus"? Você usa junto o potenciômetro e o sensor hall?

Eu estou totalmente confuso no entendimento por que preciso conhecer o esquema todo e como opera cada componente,  para  depois poder pensar no programa. "Uma imagem vale mais que 1000 palavras". Este ditado é correto em programação. Primeiro criamos o circuito com seus componentes e depois pensamos em como fazer o programa. Poderia fazer um  esquema  eletrônico para  eu entender o que você tem em mãos?

 


   
ReplyQuote
Page 1 / 2
Back To Top