Dúvida em melhorar PWM

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Dúvida em melhorar PWM

Mensagempor neto_e_khelen » 28 Mai 2014 14:18

Boa tarde pessoal! Certo, vou direto ao assunto. Meu problema é o seguinte: Preciso controlar um motor por pwm para variar a velocidade dele de 10% em 10%, 0 ele fica desligado e em 100% em rotação máxima. Fiz um código tirando como base alguns exemplos que encontrei na net, porém quando eu coloca o duty em 10% por exemplo o motor só vibrava e não rodava, só com duty acima dos 40% que ele começava a girar. Ai li que eu preciso usar o duty da metade do valor pra cima para o motor funcionar desde o início. Ok, fiz isso e realmente funcionou, agora ele gira mesmo com 10% de duty, porém agora ele não altera muito a velocidade com duty em 10% ou 90% por exemplo, ou seja, a velocidade não varia muito. Como posso resolver isso? Segue trechos do código de como configurei no pic:

Código: Selecionar todos
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES RESERVED                 //Used to set the reserved FUSE bits
 
#use delay(clock=10000000)


unsigned int8 zero = 0b1000000;
unsigned int8 um = 0b1001111;
unsigned int8 dois = 0b0100100;
unsigned int8 tres = 0b0110000;
unsigned int8 quatro = 0b0011001;
unsigned int8 cinco = 0b0010010;
unsigned int8 seis = 0b0000010;
unsigned int8 sete = 0b1111000;
unsigned int8 oito = 0b0000000;
unsigned int8 nove = 0b0010000;
int8 motor1 = 0;
int8 motor2 = 0;
long duty = 0;
int1 sel_motor = 0;  //Variável de seleção do motor-0 para motor01 e 1 para motor02
int1 var_motores = 0;
int1 motores_rodando = 0;


#define buzzer          PIN_D7  // Buzzer
#define bt_motor01      PIN_E0  //botões de selecionar o motor
#define bt_motor02      PIN_E1  //botões de selecionar o motor
#define diminui         PIN_C4  //botões de alterar o duty
#define aumenta         PIN_C5  //botões de alterar o duty
#define led_motor01e02  PIN_C6  // Led do motor 01
#define led_debug       PIN_C7  // Led do motor 02
#define led_motores     PIN_B7  // Led dos motores
#define bt_motores      PIN_C0  // Led da chave geral dos motores.
#define motores         PIN_C3 // Saida geral dos motores.
#define motor01         PIN_C4 // Saida do Motor 01.
#define motor02         PIN_C5 // Saida do Motor 02.


testa_duty();
testa_botoes();
toca_buzzer();

void main (void)
 {
   setup_adc_ports(NO_ANALOGS);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_2(T2_DIV_BY_16, 155, 1);
   setup_ccp1(CCP_PWM);
   setup_ccp2(CCP_PWM);
   set_pwm1_duty(0);
   set_pwm2_duty(0);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   
   output_high(led_debug);
   delay_ms(50);
   output_low(led_debug);
   delay_ms(100);
   output_high(led_debug);
   delay_ms(50);
   output_low(led_debug);
   delay_ms(100);
   output_high(led_debug);
     
   duty=431;


   while (1)
   {   
      testa_duty();
      testa_botoes();
      if((duty!=279)&&(motores_rodando==1))
      {
         if(sel_motor==0)
            {
            set_pwm1_duty(duty);
            set_pwm2_duty(0);
            output_low(led_motor01e02);
            }
            else
            {
            set_pwm1_duty(0);
            set_pwm2_duty(duty);
            output_high(led_motor01e02);
         }
      }
      if(motores_rodando==0)
         {
         set_pwm1_duty(0);
         set_pwm2_duty(0);
         }
       
       if(sel_motor==0)
         {
         output_low(led_motor01e02);
         }
       else
         {
         output_high(led_motor01e02);
         } 
   }


}


testa_botoes()
{
   if((!input(aumenta))&&(duty<659))  //Teste se foi pressionado o botão de aumentar duty.
   {
      delay_ms(10);
      if(input(aumenta))  //Debouce
      {
         duty=duty+38;
         toca_buzzer();
      }
   }
   if((!input(diminui)&&(duty>279)))  //Testa se foi pressionado o botão de diminuir duty.
   {
      delay_ms(10);
      if(input(diminui))  //Debouce
      {
         duty=duty-38;
         toca_buzzer();
      }
   }
   if(!input(bt_motores))  //Teste se foi pressionado o botão da chave geral dos motores.
   {
      delay_ms(10);
      if(input(bt_motores))  //Debouce
      {
         if(var_motores==0)
            {
            var_motores=1;
            toca_buzzer();
            }
         else
            {
            var_motores=0;
            toca_buzzer();
            }
      }
   }
   if(var_motores==0)
      {
         motores_rodando=0;
         output_low(led_motores);
      }
   else
      {
         output_high(led_motores);
         motores_rodando=1;
      }


 //Testa botões de seleção dos motores.
 if(!input(bt_motor01))  //Teste se foi pressionado o botão do motor 01.
   {
      delay_ms(50);
      if(input(bt_motor01))  //Debouce
      {
         sel_motor=0;  // 0 para motor 1.
         toca_buzzer();
      }
   }
   if(!input(bt_motor02))  //Teste se foi pressionado o botão do motor 02.
   {
      delay_ms(50);
      if(input(bt_motor02))  //Debouce
      {
         sel_motor=1;  // 1 para motor 2.
         toca_buzzer();
      }
   }
   
   
}


testa_duty()
{
   if(duty==279)
   {
      set_pwm1_duty(0);
      set_pwm2_duty(0);
      output_a(zero);
      output_b(zero);
      output_d(zero);
   }
   else if(duty==317)
   {
      output_a(zero);
      output_b(um);
      output_d(zero);
   }
   else if(duty==355)
   {
      output_a(zero);
      output_b(dois);
      output_d(zero);
   }
   else if(duty==393)
   {
      output_a(zero);
      output_b(tres);
      output_d(zero);
   }
   else if(duty==431)
   {
      output_a(zero);
      output_b(quatro);
      output_d(zero);
   }
   else if(duty==469)
   {
      output_a(zero);
      output_b(cinco);
      output_d(zero);
   }
   else if(duty==507)
   {
      output_a(zero);
      output_b(seis);
      output_d(zero);
   }
   else if(duty==545)
   {
      output_a(zero);
      output_b(sete);
      output_d(zero);
   }
   else if(duty==583)
   {
      output_a(zero);
      output_b(oito);
      output_d(zero);
   }
   else if(duty==621)
   {
      output_a(zero);
      output_b(nove);
      output_d(zero);
   }
   else if(duty==659)
   {
      output_a(um);
      output_b(zero);
      output_d(zero);
   }
}


toca_buzzer()
{
   output_high(buzzer);
   delay_ms(50);
   output_low(buzzer);
}
neto_e_khelen
Bit
 
Mensagens: 33
Registrado em: 22 Jul 2009 19:01

Re: Dúvida em melhorar PWM

Mensagempor ze2 » 28 Mai 2014 16:16

linearidade mecânica e elétrica realmente uma não pode contar com a outra. vou te dar uma visão prática intuitiva da coisa...
sugiro que vá aumentando controlada e pausadamente seu pwm e avalie visualmente ou com tacômetro e vá montando sua tabela personalizada... (bom acho que eu entenderia isso...)
se vc tiver como obter a realimentação da rotação, melhor ainda. seu mc tentaria mantê-la mesmo com variação da carga mecânica
abç
Editado pela última vez por ze2 em 29 Mai 2014 09:42, em um total de 1 vez.
ze2
Byte
 
Mensagens: 193
Registrado em: 09 Fev 2009 13:37

Re: Dúvida em melhorar PWM

Mensagempor neto_e_khelen » 28 Mai 2014 18:27

Ok, entendi...O problema é que não estou conseguindo que um motor de 1000 rpm por exemplo rode a 100 rpm com pwm, ou seja, sem perder torque. Não sei se é a frequencia do pwm que estou usando ou se é a resolução que está baixa... O que acha?
neto_e_khelen
Bit
 
Mensagens: 33
Registrado em: 22 Jul 2009 19:01

Re: Dúvida em melhorar PWM

Mensagempor cfreund » 28 Mai 2014 19:18

Experimente diminuir a frequência para começar a rodar com um duty cycle de 10%. E é o que o ze disse, um feedback vai te ajudar bastante e, é relativamente fácil de implementar.
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Dúvida em melhorar PWM

Mensagempor andre_luis » 28 Mai 2014 19:44

Mapeia a velocide do RPM em função do PWM, e depois essa tabela será a sua escala real.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Dúvida em melhorar PWM

Mensagempor cfreund » 28 Mai 2014 19:56

Se for trabalhar com tabela, a carga deverá ser constante.
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Dúvida em melhorar PWM

Mensagempor andre_luis » 28 Mai 2014 20:02

Tem toda razão...
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Dúvida em melhorar PWM

Mensagempor neto_e_khelen » 28 Mai 2014 20:16

Entendi. Vou fazer esses testes com o motor sem carga pra começar então. Mas tenho uma dúvida aqui a muito tempo, o que influencia no motor a frequência do pwm?? Qual a diferença de se usar uma frequência alta pra uma baixa?
neto_e_khelen
Bit
 
Mensagens: 33
Registrado em: 22 Jul 2009 19:01

Re: Dúvida em melhorar PWM

Mensagempor cfreund » 28 Mai 2014 20:53

No seu caso que deve ser motor DC, o controle da velocidade por PWM, entrega mais torque em rotações intermediárias comparando com o controle de velocidade por tensão.

Basicamente é o seguinte: Se diminuir a tensão, diminuirá a corrente.

Existem até circuitos de controle por corrente. Aplica-se uma tensão de 5x a nominal, sempre monitorando a corrente para não ultrapassar o permitido. Assim, conseguimos maior torque e velocidade.
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Dúvida em melhorar PWM

Mensagempor neto_e_khelen » 28 Mai 2014 21:44

Certo, mas afinal, alguem sabe no que interfere a frequencia do pwm?
neto_e_khelen
Bit
 
Mensagens: 33
Registrado em: 22 Jul 2009 19:01

Re: Dúvida em melhorar PWM

Mensagempor ELFS » 28 Mai 2014 23:27

neto_e_khelen escreveu:Certo, mas afinal, alguem sabe no que interfere a frequencia do pwm?


Como diria um velho conhecido no forum, dando um pitaco um motor é uma carga indutiva logo a indutancia do motor interfere na frequencia do pwm, então para conseguir aliar uma frequencia elevada com a corrente pretendida tem que elevar a tensão. Se a frequencia for muito elevada em função da indutancia só teremos corrente ou um aumento da mesma após 50% de duty ou seja o tempo de carga é maior que o de descarga e vai ficar uma corrente residual pro proximo ciclo.
Em um motor desconhecido se medir a indutancia do circuito e usando tensão x tempo traçar uma curva da corrente no indutor usando um Excel da vida vai ver qual o tempo para atingir a corrente pretendida (nominal) dai e só calcular a frequencia, pra inicio da uma boa noção. Motores geralmente tem uma indutancia elevada e para se obter a corrente necessária temos que reduzir a frequencia ou elevar a tensão, o melhor é elevar a tensão.
ELFS
Byte
 
Mensagens: 371
Registrado em: 16 Ago 2007 14:10
Localização: Brasil- Pr- Curitiba

Re: Dúvida em melhorar PWM

Mensagempor ze2 » 29 Mai 2014 10:13

há alguns anos montei um minigerador 110vdc tocado a água. é relíquia. de 1956. acendia algumas lampadas, tv e tal. só hobie mesmo. só alegria. aí me autodesafiei a tocar o motor do tanquinho motor ac da minha muié. ela também tinha que ficar feliz uai. com a excepcional ajuda dos amigos deste forum, um driver igbt sucata, um mc com 2 pwm, tive sucesso total. o fato que interessa foi o seguinte: a potencia era relativamente alta, devo ter escolhido uma frequencia impropria o que provocou um apitinho no motor. mas o fato de ver o motor ac rodando com "dc" e de graça me deixou tão excitado que quase tive orgasmos multiplos sequenciais consecutivos permanentemente temporários... e nem dei bola pro apito. No seu caso, desconheço se isso pode ocorrer. provavelmente não. (o apito, ... o multiplo não quero saber).
pensar que os cara daqui ajudaram a fazer minha muié feliz não pega muito bem.
abç
ze2
Byte
 
Mensagens: 193
Registrado em: 09 Fev 2009 13:37

Re: Dúvida em melhorar PWM

Mensagempor MOR_AL » 29 Mai 2014 11:00

Bom! Vamos lá!
A potência entregue ao motor é P = V x I.
Se o seu PWM envia 10% de tensão, a corrente também será de 10% (aprox.). Logo com 10% de PWM, a potência entregue ao motor será de P10% = 10% de V x 10% de I = 0,01Ptotal.
Você estará entregando 1% da potência.
É por isso (e mais outra coisa) que o seu motor tenta girar mas com 1% ele não consegue.
Agora a "outra coisa".
O motor, para iniciar a girar, precisa de um torque adicional, para sobrepujar o atrito estático, que é maior que o atrito dinâmico, quando ele já está girando.
Incluindo tudo isso, você vê que o motor não é nada linear.
Se você incluir o torque então, aí a coisa fica feia. Porquê? Porque com a carga variável, o torque precisa ser também variável para poder fazer o motor girar com a velocidade desejada.
Você vai concluir que a função potência não é proporcional ao valor do PWM.
Para conseguir manter a velocidade desejada, frente a essas todas variações e não linearidades, é necessário incluir-se um circuito que monitore a rotação do motor e a compare com a desejada. Isso vai dar um erro entre elas.
O pulo do gato é fazer esse erro ser muito pequeno, a ponto de ser insignificante na prática. Aí a velocidade monitorada vai acompanhar a velocidade desejada, qualquer que seja ela, mesmo que ela varie. Este é o princípio da realimentação negativa. O controle PID, ou P, ou PI, ou ...

A frequência do PWM é semelhante a um "cobertor de pobre". Se cobrir totalmente a cabeça, os pés ficam descobertos e vice-versa.

Imagine a frequência do PWM bem baixa. O motor vai vibrar e até apitar. A variação da corrente no motor vai fazer seus componentes vibrarem na frequência do PWM, produzindo som.

Agora. Na medida que a frequência for aumentando, o som e a vibração vão diminuindo, mas começam a aumentar as perdas, devido ao fato do núcleo poder não ser projetado para possuir baixas perdas, com acionamento com frequências mais altas.
Concluindo.
Dependendo da aplicação, vai ser necessário incluir um controle.
Em tempo:
Em alguns casos, como o circuito equivalente mais simples do motor é um indutor com um resistor, será interessante considerar o controle PWM pela corrente e não pela tensão. É como se fosse uma fonte chaveada ajustável do tipo step-down.
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

Re: Dúvida em melhorar PWM

Mensagempor neto_e_khelen » 29 Mai 2014 19:24

Cara muito boa todas as explicações! Coisa de gênios, serio mesmo! Agora que surgiram mais dúvidas ainda! rsrsrs....

1ª - Se eu colocar na saída de meu pwm 10% eu vou ter 10% da tensão que estou chaveando? Ou seja, se eu estiver chaveando uma tensão de 10V e colocar 10% do duty cicle vou medir com um voltímetro 1V ?? Resumindo, dá pra medir o duty com um voltímetro?

2ª - É possível fazer esse controle por corrente utilizando o módulo de pwm do pic?
neto_e_khelen
Bit
 
Mensagens: 33
Registrado em: 22 Jul 2009 19:01

Re: Dúvida em melhorar PWM

Mensagempor MOR_AL » 29 Mai 2014 22:31

neto_e_khelen escreveu:Cara muito boa todas as explicações! Coisa de gênios, serio mesmo! Agora que surgiram mais dúvidas ainda! rsrsrs....

1ª - Se eu colocar na saída de meu pwm 10% eu vou ter 10% da tensão que estou chaveando? Ou seja, se eu estiver chaveando uma tensão de 10V e colocar 10% do duty cicle vou medir com um voltímetro 1V ?? Resumindo, dá pra medir o duty com um voltímetro?
Se colocar um filtro passa baixas frequências, sim.
Se a frequência do PWM for de FPWM, coloca um resistor de 1K e um capacitor de:
C = 5.000 / FPWM (em micro faradays)

2ª - É possível fazer esse controle por corrente utilizando o módulo de pwm do pic?

Sim. Você tem que monitorar a corrente no motor.
A menos que você entenda de fontes chaveadas do tipo step down, eu não recomendo.

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

Próximo

Voltar para PIC

Quem está online

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

cron

x