Página 1 de 2

Dúvida em melhorar PWM

MensagemEnviado: 28 Mai 2014 14:18
por neto_e_khelen
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);
}

Re: Dúvida em melhorar PWM

MensagemEnviado: 28 Mai 2014 16:16
por ze2
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ç

Re: Dúvida em melhorar PWM

MensagemEnviado: 28 Mai 2014 18:27
por neto_e_khelen
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?

Re: Dúvida em melhorar PWM

MensagemEnviado: 28 Mai 2014 19:18
por cfreund
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.

Re: Dúvida em melhorar PWM

MensagemEnviado: 28 Mai 2014 19:44
por andre_luis
Mapeia a velocide do RPM em função do PWM, e depois essa tabela será a sua escala real.


+++

Re: Dúvida em melhorar PWM

MensagemEnviado: 28 Mai 2014 19:56
por cfreund
Se for trabalhar com tabela, a carga deverá ser constante.

Re: Dúvida em melhorar PWM

MensagemEnviado: 28 Mai 2014 20:02
por andre_luis
Tem toda razão...

Re: Dúvida em melhorar PWM

MensagemEnviado: 28 Mai 2014 20:16
por neto_e_khelen
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?

Re: Dúvida em melhorar PWM

MensagemEnviado: 28 Mai 2014 20:53
por cfreund
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.

Re: Dúvida em melhorar PWM

MensagemEnviado: 28 Mai 2014 21:44
por neto_e_khelen
Certo, mas afinal, alguem sabe no que interfere a frequencia do pwm?

Re: Dúvida em melhorar PWM

MensagemEnviado: 28 Mai 2014 23:27
por ELFS
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.

Re: Dúvida em melhorar PWM

MensagemEnviado: 29 Mai 2014 10:13
por ze2
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ç

Re: Dúvida em melhorar PWM

MensagemEnviado: 29 Mai 2014 11:00
por MOR_AL
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

Re: Dúvida em melhorar PWM

MensagemEnviado: 29 Mai 2014 19:24
por neto_e_khelen
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?

Re: Dúvida em melhorar PWM

MensagemEnviado: 29 Mai 2014 22:31
por MOR_AL
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