• Welcome to LusoRobótica - Robótica em Português.
 

Frequências "baixas" de PWM num PIC

Started by beirao, 25 de February de 2011, 20:44

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

beirao

Boas pessoal,

Preciso de gerar um sinal PWM com uma frequência de 50Hz (se fosse mais baixa até era melhor) num PIC. neste momento tou a usar um PIC18F2520 (é o mais pequeno que tenho cá) mas depois devo mudar para um 18f2221. A questão é: a frequencia de PWM mais baixa que consigo é de 244 Hz (+/-). Como posso resolver isto?

Só fazendo o sinal "à unha", através de interrupções? Ou existe outra solução?

Thanks!

P.S. - Neste momento tou com um oscilador de 4MHz. E mesmo que use o uC a 1 MHz, só consigo ter sinal de 61Hz
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Sérgio_Sena

Interrupções. É um sinal tão lento, que quaisquer duzia de linhas de código resolvem a situação.

Por exemplo ::



void interrupcao (void)
{
   IFS0bits.T2IF = 0;      //limpa a flag de interrupcao de TMR2 = 0;

   contador--;
   if   (!contador)   //se contador de temporizador chegou ao fim, indica-o
   {
         contador = valor_contador;      //recarrega contador
         LATBbits.LATB6 ^= 1;   //DEBUG, faz oscilacao no pino RB6
   }




E falta a configuração do TMR e das Interrupções, mas isso já tu sabes fazer.
Não se é em C que procuras, tb tenho em ASM, mas a filosofia é a mesma, basta converter.
Cumprimentos,
Sérgio Sena

Electronic Gear for Musicians

Instagram

beirao

Hum.. Pois, tal como tinha referido.

Obrigado.
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

senso

um avr a correr a 16Mhz ate gera pwm a menos de 5hz. nao te estas a esquecer de nenhum prescaller, ou entao usa um timer de 16bits.
Avr fanboy

beirao

Quote from: senso on 25 de February de 2011, 23:28
um avr a correr a 16Mhz ate gera pwm a menos de 5hz. nao te estas a esquecer de nenhum prescaller, ou entao usa um timer de 16bits.

O PIC que tou a usar faz o PWM por intermédio do TMR2 (8bits). Tem um prescaler e um registo PR2.. não dá mesmo para frequencias mais baixas que 200 e pouco. O TMR2 tmbm tem um postscaler mas o PWM não o usa
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Sérgio_Sena

Tens alguma limitação de projecto que te impeça de usar interrupções, ou é mesmo só escolha pessoal?

Com Fosc que tu tens, a latência de entrada nas interrupções e a execução dessas linhas tão rápido, que nem se nota no PWM final.

Experimenta. Eu uso bastante este tipo de temporizadores "concorrentes". Com flags indicadoras para a máquina de estados.
Cumprimentos,
Sérgio Sena

Electronic Gear for Musicians

Instagram

beirao

É mesmo por uma questão de escolha pessoal... mas sim, para a frequência que é, não há qualquer problema.

Mas por exemplo, num robot onde o PIC está mais sobrecarregado com outros módulos em utilização, leitura de vários sensores, mais sinais, etc, achas que é melhor utilizar módulos PWM externos com comunicação, por exemplo, I2C ?
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Sérgio_Sena

Depende. O tempo que demoras no tratamento do I2C, é provavelmente maior do que o de tratar o PWM com interrupções.
Mesmo com o chip externo a trabalhar sem apoio.

Tem em conta vários aspectos ::

# Fosc

# tempo a ler sensores digitais

# tempo a ler sensores analógicos


Podes fazer com que todos os periféricos externos ao PIC, e que usem um periférico interno para comunicar, trabalhem por interrupções ::

# sensores digitais e ADC/DAC por SPI/I2C

# USART

# ...

Todos podem trabalhar por interrupções na transmissão/recepção. Basta que faças bem o teu código.

Por exemplo, tendo uma string para enviar USART, é má politica ter o CPU pendurado a enviar a informação char-a-char... muito tempo. Mesmo a 115k, demoras ~1ms a enviar 20 bytes.
Ora... se tiveres uma Fosc 2Mhz, tens um Fcy de 500ns... 2000 ciclos de relógio perdidos :)

Ora diz lá se nesse tempo todo, não te sobra para ir tratar do PWM, que também é por interrupções ?

E podes correr as máquinas de estados do programa e fazer funções de rotina/manutenção, enqt esperas :)
Cumprimentos,
Sérgio Sena

Electronic Gear for Musicians

Instagram

senso

Reposta á tua PM, pois diz que me bloqueaste as pm's beirão:
Tens condensadores de decoupling?
Parece que o PIC está a levar com o ruido dos motores nas linhas de alimentação e a fazer reset ou a trocar a stack toda e ficar num estado desconhecido para o programa que ele está a correr.

Vê se não tens a tua caixa de pm's cheia, e vai ás opções e procura por alguma coisa que bloqueie receber pm's.
Avr fanboy