LusoRobótica - Robótica em Português
Sistemas específicos => PIC => Tópico iniciado por: beirao em 25 de Fevereiro de 2011, 20:44
-
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
-
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.
-
Hum.. Pois, tal como tinha referido.
Obrigado.
-
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.
-
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
-
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.
-
É 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 ?
-
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 :)
-
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.