Autor Tópico: Contar passos com PWM.  (Lida 9623 vezes)

Description:

0 Membros e 1 Visitante estão vendo este tópico.

bruno.gf

  • Visitante
Contar passos com PWM.
« Online: 26 de Janeiro de 2010, 11:24 »
Fala pessoal !!

Bom, acompanho a um tempo o forum, mas este é meu primeiro post de fato.
Utilizo o PIC16f628A, MPLAB, CCS.

Tenho uma dúvida e nao sei se minha lógica esta correta:

Quando eu seto a porta do pic para PWM, escolho duty cycle e etc, esta porta fica pulsando, ou seja, variando de 0 à 1 certo?
Se eu criar uma variável ( digamos que seja "x" ), e toda vez que a porta se encontrar no estado alto ( com valor de 1 ), eu encrementar "x" em uma unidade, e escrever em um lcd ( por exemplo ), eu estaria contando os passos certo???

É possível fazer isso?

Se sim, qual o comando (na linguagem C) que eu utilizo para detectar a porta quando está com valor de 1???

Valeu desde já pessoal,
Abraços.

Offline Tverm

  • Hobby
  • ****
  • Posts: 452
  • Sexo: Masculino
  • Portugal
Re: Contar passos com PWM.
« Resposta #1 Online: 26 de Janeiro de 2010, 19:21 »
Boa noite.
Penso que você esta misturando duas coisas distintas.
O Gerador de PWM do pic serve para você por uma saída a oscilar de 0-1 com uma frequência e salvo erro amplitude que pode ser variável no tempo, ou seja que você pode variar em qualquer momento no seu programa.

Agora segundo o que eu percebi e me corrija se estiver errado, você quer é detectar um flanco ascendente num pino configurado como entrada no pic e não como saída caso do Pwm.
Para isso você deve configurar esse pino como entrada e de alguma forma detectar um flanco ascendente, por exemplo atravez de uma interrupção.

Espero ter ajudado com a minha pouca experiência.
Caso tenha dito alguma asneira peço que um colega mais experiente em PWM do que eu que rectifique alguma besteira que tenha escrito.

bruno.gf

  • Visitante
Re: Contar passos com PWM.
« Resposta #2 Online: 26 de Janeiro de 2010, 19:29 »
Primeiramente obrigado pela resposta Tverm.

Na verdade, o que eu realmente gostaria de saber é se tem alguma forma de eu contar os passos do meu motor, quando este é acionado no modo pwm.

Quando eu não utilizo PWM, eu conto os passos facilmente, por ex:

output_high ( PIN_B0 );
delay_ms ( 200 );
output_low(PIN_B0);
i++;

printf ("%u", i); // onde "i" será o número de passos.

dessa forma fica facil contar os passos, mas a minha dúvida é se tem como eu contar os passos acionando o motor no modo PWM.

A forma mais lógica que eu vejo é do modo que eu descrevi no comeco do tópico, mas nao sei se esta correto e no momento nao tenho como testar.

Help !!

Abraços


Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: Contar passos com PWM.
« Resposta #3 Online: 26 de Janeiro de 2010, 20:18 »
É impressão minha ou está havendo um confusão entre motor de CC e motor de passo?

Não é usual contar pulsos de um gerador de sinal do tipo PWM (pulse width modulation). É bom esclarecer que a largura dos pulsos permite controlar a velocidade de um motor, geralmente de corrente contínua (CC), que está girando continuamente. Ou seja, não há como saber a posição do motor apenas contando os pulsos do sinal PWM enviado ao motor.
« Última modificação: 26 de Janeiro de 2010, 20:21 por minilathe »

bruno.gf

  • Visitante
Re: Contar passos com PWM.
« Resposta #4 Online: 26 de Janeiro de 2010, 20:24 »
Minilathe obrigado pela resposta,

Veja bem, nao estou querendo contar "pulsos" e sim "passos" !!!

Abraços

Offline Tverm

  • Hobby
  • ****
  • Posts: 452
  • Sexo: Masculino
  • Portugal
Re: Contar passos com PWM.
« Resposta #5 Online: 26 de Janeiro de 2010, 20:40 »
Amigos sera que alguma destas flags pode proporcionar esse efeito?

////////////////////////////////////////////////////////////////// CCP
// CCP Functions: SETUP_CCPx, SET_PWMx_DUTY
// CCP Variables: CCP_x, CCP_x_LOW, CCP_x_HIGH
// Constants used for SETUP_CCPx() are:
#define CCP_OFF                         0
#define CCP_CAPTURE_FE                  4
#define CCP_CAPTURE_RE                  5
#define CCP_CAPTURE_DIV_4               6
#define CCP_CAPTURE_DIV_16              7
#define CCP_COMPARE_SET_ON_ MATCH        8
#define CCP_COMPARE_CLR_ON_ MATCH        9
#define CCP_COMPARE_INT                 0xA
#define CCP_COMPARE_RESET_T IMER         0xB
#define CCP_PWM                         0xC
#define CCP_PWM_PLUS_1                  0x1c
#define CCP_PWM_PLUS_2                  0x2c
#define CCP_PWM_PLUS_3                  0x3c
#word   CCP_1    =                      getenv("SFR:CCPR1L")
#byte   CCP_1_LOW=                      getenv("SFR:CCPR1L")
#byte   CCP_1_HIGH=                     getenv("SFR:CCPR1H")
// The following should be used with the ECCP unit only (or these in)
#define CCP_PWM_H_H                     0x0c
#define CCP_PWM_H_L                     0x0d
#define CCP_PWM_L_H                     0x0e
#define CCP_PWM_L_L                     0x0f

#define CCP_PWM_FULL_BRIDGE             0x40
#define CCP_PWM_FULL_BRIDGE _REV         0xC0
#define CCP_PWM_HALF_BRIDGE             0x80

#define CCP_SHUTDOWN_ON_COM P1           0x100000
#define CCP_SHUTDOWN_ON_COM P2           0x200000
#define CCP_SHUTDOWN_ON_COM P            0x300000
#define CCP_SHUTDOWN_ON_INT 0            0x400000
#define CCP_SHUTDOWN_ON_COM P1_INT0      0x500000
#define CCP_SHUTDOWN_ON_COM P2_INT0      0x600000
#define CCP_SHUTDOWN_ON_COM P_INT0       0x700000

#define CCP_SHUTDOWN_AC_L               0x000000
#define CCP_SHUTDOWN_AC_H               0x040000
#define CCP_SHUTDOWN_AC_F               0x080000

#define CCP_SHUTDOWN_BD_L               0x000000
#define CCP_SHUTDOWN_BD_H               0x010000
#define CCP_SHUTDOWN_BD_F               0x020000

#define CCP_SHUTDOWN_RESTAR T            0x80000000

#define CCP_PULSE_STEERING_ A            0x01000000
#define CCP_PULSE_STEERING_ B            0x02000000
#define CCP_PULSE_STEERING_ C            0x04000000
#define CCP_PULSE_STEERING_ D            0x08000000
#define CCP_PULSE_STEERING_ SYNC         0x10000000

Offline C N C N o w !

  • CNCMASTER
  • ******
  • Posts: 6300
  • Sexo: Masculino
Re: Contar passos com PWM.
« Resposta #6 Online: 26 de Janeiro de 2010, 21:19 »
V... nao estou querendo contar "pulsos" e sim "passos" !!!

E qual é a diferença ?!

Bruno, eu tô com a forte impressão de que vc não tem claro alguns conceitos ...

O padrão de mercado é a interface passo/direção (step-dir), se vc conta os pulsos de passos na entrada do driver, estará contando passos ...

Há apenas outros dois tipos de interface, CW/CCW e phase drive e em qualquer dos casos o mesmo conceito se aplica, embora com algumas adaptações ...

Para que vc precisa contar passos ? Explique melhor sua aplicação e talvez a gente possa dar algum palpite mais específico ...

bruno.gf

  • Visitante
Re: Contar passos com PWM.
« Resposta #7 Online: 26 de Janeiro de 2010, 21:41 »
Obrigao pela resposta CNC NOW,

O que eu gostaria de fazer é imprimir em um lcd os passos do motor.

Sem utilizar o pwm eu consigo fazer isso (vide exemplo do primeiro post ), só que agora gostaria de fazer a mesma coisa, só que com utilização de PWM.

Consigo fazer o motor girar normalmente utilizando pwm, mas nao entendo como poderia obter numero de passos desse modo.

A minha idéia seria  habilitar a interrupção do TMR2, para incrementar a variável na rotina de interrupção.

Nao sei se me fiz entender.

A finalidade é meramente didática pois sou estudante de engenharia mecanica e estou dedicando minha férias à isso.

Muito obrigado pela ajuda,

Abraços


Offline C N C N o w !

  • CNCMASTER
  • ******
  • Posts: 6300
  • Sexo: Masculino
Re: Contar passos com PWM.
« Resposta #8 Online: 26 de Janeiro de 2010, 23:38 »
Sem utilizar o pwm eu consigo fazer isso (vide exemplo do primeiro post ), só que agora gostaria de fazer a mesma coisa, só que com utilização de PWM.

Bruno, receio que ainda não esteja suficientemente claro  :P

Inicialmente imaginei que vc teria um motor acionado por um driver comandado por alguma coisa, um PC, um microcontrolador, um circuito dedicado ... é isto ou não ? Onde entra o PWM na história ?

Será que vc tá falando de um motor diretamente acionado por um microcontrolador e gostaria de alterar o programa para não apenas fazer o motor girar, mas tb poder controlar a posição, contando os passos ? Se for este o caso, acho que é mais fácil vc mandar o prog pra analisarmos ... a rigor o PWM nada tem a ver com isto e se não operar em malha fechada sua utilidade é discutível e mereceria mesmo discussão mais aprofundada ...

bruno.gf

  • Visitante
Re: Contar passos com PWM.
« Resposta #9 Online: 27 de Janeiro de 2010, 00:02 »
CNC NOW na verdade eu que nao expliquei direito os componentes que utilizo, me desculpe.

Vamos la, estou utilizando um PIC16F628A, MPLAB e CCS de compilador.

Meu PIC gera um PWM, que é conectado à um 4017 que por sua vez é conectado ao meu motor de passo.

Nesse mesmo pic tenho um lcd 16x2 que eu envio as informações desejadas.

Tenho aqui o codigo (sem pwm) em que eu faço a contagem dos passos. Se for de utilidade eu posto aqui.

Obrigado denovo.

Abraços

Offline C N C N o w !

  • CNCMASTER
  • ******
  • Posts: 6300
  • Sexo: Masculino
Re: Contar passos com PWM.
« Resposta #10 Online: 27 de Janeiro de 2010, 08:43 »
Meu PIC gera um PWM, que é conectado à um 4017 que por sua vez é conectado ao meu motor de passo.

Bruno, o 4017 é um contador decádico, posso imaginar o acionamento do motor com ele, mas não imagino como o PWM entra nisso ...

Vc tem um esqueminha do circuito ?

Pq vc quer o PWM, tá querendo implementar um chopper ?

Citar
Tenho aqui o codigo (sem pwm) em que eu faço a contagem dos passos. Se for de utilidade eu posto aqui.

Sim, seria interessante dar uma espiada no código ... vc escreveu o prog ou achou em algum lugar ? Se for este o caso, mande o link ...


bruno.gf

  • Visitante
Re: Contar passos com PWM.
« Resposta #11 Online: 01 de Fevereiro de 2010, 01:21 »
Fala CNC Now, desculpe a demora, mas passei uma "temporada" no hospital devido alguns probleminhas, mas to de volta.

Bom, vamos lá.

Eu utilizo a entrada de clock do 4017 conectada à saida do meu pic que é setada como pwm. Conecto o pino de reset ( do 4017 ), na porta 3, pois assim as saidas oscilam de 0 a 3 permanentemente, estas saidas sao conectadas ao meu driver que por sua vez é conectado ao meu motor de passo, fazendo este girar.
Eu poderia utilizar ( alias ja estou mudando ) para um lm297 que é mais eficaz para meu propósito.

Quanto à contagem de passos, eu pesquisei bastante e cheguei em algumas conclusões ( que de fato deram resultados ). Para que eu conseguisse encrementar minha variável em uma unidade à cada vez que o motor desse "um passo" eu utilizei funções de interrupção ( interrupt ) com um postscaler de valor um ( 1 ), pois assim a cada pulso do pwm ocorre uma interrupção no timer2 em que eu incremento minha variavel. Essas dicas foram dadas pelo pessoal do forum do CCS.

Seguindo algumas instruções eu montei meu código e voilá, deu certo.

Isso me fez querer aprender o mundo das "ISR" e polling routines. Estou com um pouco de dificuldades de encontrar algum material explicando como utilizar as funções de interrupção. Agradeceria se você pudesse me dar uma luz.

Qualquer coisa dê uma olhada no tópico que eu criei no CCS Forum:
http://www.ccsinfo.com/forum/viewtopic.php?t=41403

Abaixo segue o código de qual eu falei:

Código: [Selecionar]
[code]#include <16F628A.H>
#fuses XT, NOWDT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#include <tutorial.c> // Inclui minha biblioteca do LCD
#use rs232(baud=9600, xmit=PIN_A6, rcv=PIN_A7, ERRORS)


//======================================
void main()
{
int16 count;

// Seta CCP1 para PWM com 244 Hz e 50% duty cycle.
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_1, 255, 1);
set_pwm1_duty(128);


inicializa_lcd();  // Inicializa o lcd

count = 0;

// Escreve no lcd os passos
while(TRUE)
  {
   if(interrupt_active(INT_TIMER2))
     {
      clear_interrupt(INT_TIMER2);     
      count++;
  envia_byte_lcd(0x0,80);
  printf(escreve_lcd,("Steps: %Lu", count)); // Escreve os passos no lcd

}

  }

}
[/code]


Obrigado pela ajuda CNC Now

Abraços.

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: Contar passos com PWM.
« Resposta #12 Online: 01 de Fevereiro de 2010, 01:59 »
Bruno,

Algumas dicas...

Já fiz programas com vários PICs, inclusive para controlar motores de passo. Existem várias maneiras de "fazer as coisas", e como diz o ditado, de "esfolar um gato".

Se o objetivo é mover um motor de passo e contar a quantidade de passos, ou o seu deslocamento, usar uma interrupção é complicar desnecessariamente. Mas, retiro o que eu disse se o seu objetivo for aprender a usá-la...

Seria bem mais simples ir incrementando / decrementando um contador no PIC e, na sequência, acionar o motor de passo num sentido ou no outro.

E se o motor não precisar ser acionado numa velocidade elevada, nem precisaria do CI L-297. Voce poderia gerar a sequência de fases para acionar o motor no próprio PIC. Fica bem mais simples e até aprende-se um pouquinho mais como controlar um motor de passo.

Mas, são apenas sugestões para tentar facilitar as coisas....

bruno.gf

  • Visitante
Re: Contar passos com PWM.
« Resposta #13 Online: 01 de Fevereiro de 2010, 14:32 »
Obrigado pela resposta minilathe,

Na verdade eu ja utilizo um programa que conta os passos do jeito que voce falou, sem o L-297 ( ativando as bobinas sequencialmente ), mas minha intenção é fazer isso utilizando PWM como modo de acionamento.

Pesquisando eu descobri as funções de interrupção, mas nao são tão simples quanto eu pensei e assim várias dúvidas surgiram, por exemplo:

1- Qual a diferença entre os comandos disable_interrupt() e clear_interrupt();
2- Porque no código do meu post anterior eu nao tive que declarar nada antes de escrever uma interrupção sendo que eu vejo muitas pessoas declarando "#define int_timer2";
3 - Quando eu uso os comando de enable_interrupt();

São dúvidas que não se encontram respostas objetivas, já procurei aqui, no clube do hardware e no CCS forum e não encontrei muita coisa.

Abaixo segue o código que eu utilizo para rodar meu motor de passo(sem pwm) e girar 10 voltas no sentido horario e 10 no anti horario, notem que eu nao utilizo as funções clássicas de output_high() e output_low() e sim um vetor que é lido sequêncialmente ( essa idéa foi tirada do livro do Renato Silva sobre microcontroladores ). Fica ae o código para quem interessar:

Código: [Selecionar]
#include <16F628A.h>

#use fast_io(a)
#use fast_io(b)
#use delay(clock=4000000,RESTART_WDT)

int32 i;
int32 tempo;

int passo[] = { 0b10000000,
0b01000000,
0b00100000,
0b00010000 };
int posicao;

void PulsaMotor( int direcao) {
if( direcao == 0 ) posicao ++ ;
if( direcao == 1 ) posicao -- ;
if( tempo>=1500 ) tempo=tempo-5;
if( i==0 ) tempo=4000;
output_b( passo[ posicao & 0x03 ]);
delay_ms( tempo );
}
void main(void) {
set_tris_b( 0x00 ); //define a direção do portB
while( TRUE ){

for(i = 0; i < 960; i++) {
PulsaMotor( 0 );
};

for(i = 0; i < 960; i++) {
PulsaMotor( 1 );
};
};
}


Se alguém puder me dar uma mão nestas funções de interrupt eu agradeceria,

Abraços.

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: Contar passos com PWM.
« Resposta #14 Online: 01 de Fevereiro de 2010, 16:14 »
Bruno,

Na verdade eu ja utilizo um programa que conta os passos do jeito que voce falou, sem o L-297 ( ativando as bobinas sequencialmente ), mas minha intenção é fazer isso utilizando PWM como modo de acionamento.

Pesquisando eu descobri as funções de interrupção, mas nao são tão simples quanto eu pensei e assim várias dúvidas surgiram, por exemplo:

1- Qual a diferença entre os comandos disable_interrupt() e clear_interrupt();
2- Porque no código do meu post anterior eu nao tive que declarar nada antes de escrever uma interrupção sendo que eu vejo muitas pessoas declarando "#define int_timer2";
3 - Quando eu uso os comando de enable_interrupt();

Quando se estuda microcontroladores, o que deve ser BEM conhecido são os registradores e a arquitetura. A arquitetura de um microcontrolador envolve os registradores, as facilidades de USART, EEPROM, contadores, conversores A/D, saídas PWM, portas USB e I2C, as memórias, as instruções, etc, etc.

Quando se estuda a arquitetura, os comandos e as funções (por exemplo, as interrupções) são referenciadas à arquitetura e aos registradores.

Ao usar um compilador C, as coisas facilitam por um lado, mas o usuário fica meio distante desses registradores e aí podem surgir algumas dúvidas que não estão relacionadas ao microcontrolador. Mas sim de como o compilador "simplica" algumas coisas que um assembly faz acessando diretamente a arquitetura do microcontrolador.
 
Existem funções de seu compilador C que eu não saberia dizer para que servem ou o que exatamente fazem, sendo necessário ler o manual do mesmo. Se sua pergunta fosse relacionada à arquietura, seria +fácil para eu responder.

Eu conheço e uso assembly, C e outras linguagens. E o que eu lhe sugiro é conhecer o microcontrolador que voce pretende usar. Se por um lado, a linguagem C economiza seu tempo, voce deve saber muito bem o que o compilador está fazendo, principalmente se sua aplicação não vai acender e apagar LEDs apenas. Para não ter surpresas ou perplexidades... :)

Recentemente, tive muito trabalho com um programa em C que precisava copiar e mover dados entre memórias RAM extendida, registradores e memória de programa (Flash) num PIC18F2550. Pode paracer simples, a principio, mas são necessários comandos em C diferentes. O simulador e o compilador C18 da Microchip ajudaram muito.

Mesmo sem conhecer o CCS, posso arriscar alguns palpites:

disable_interrupt serve para inibir interrupções subsequentes, geralmente é usado quando uma interrupção está sendo atendida. Na arquitetura PIC, há apenas um endereço do vetor de interrupção, porém, várias coisas podem dispará-la, por exemplo: estouro num contador, chegada de caractere na USART, ... ao ocorrer um evento, o bit de um registrador é setado para indicar o que causou a interrupção. clear_interrupt provavelmente estará relacionado ao reset desses bits ou ao bit de registro de interrupção, preparando o sistema para uma nova interrupção. Ou seja, tem que ler o manual e entender o que o compilador está fazendo.

Com relação a declaração de função, uma característica da linguagem C é que TODAS as variáveis e funções devem ser declaradas. Incluindo as funções de tratamento de interrupção. O define é uma coisa diferente de declaração. Não sei se foi exatamente esta a pergunta...

A interrupção deve ser habilitada, usando enable_interrupt(), após um microcontrolador ter sido inicializado ou então ao final de uma rotina de tratamento de interrupção.
 
« Última modificação: 01 de Fevereiro de 2010, 16:17 por minilathe »

 

/** * */