como controlar o duty cycle do PWM
3 participantes
Página 1 de 1
como controlar o duty cycle do PWM
Bom dia senhores. Estou iniciando em programação de Pic's. Estou tentando criar um programa para controlar um inversor de frequencia para motor monofásico. Estou usando a função de PWM para controlar as 'chaves' de potência. Eu preciso de uma função que controle o Duty cycle do Pwm de 0 a 100% e retorne a 0 (não necessariamente de 1 em 1) para gerar um semi ciclo da onda e a mesma função será usada em outra porta Pwm para controlar o outro semi ciclo. Alguém pode me ajudar com esse controle? Eu sei como alterar o Duty cycle, mas não sei como irei controlar essa variação de forma cadenciada.
edson- Mensagens : 6
Data de inscrição : 06/08/2010
Re: como controlar o duty cycle do PWM
Bom dia Edson,
Bem vindo ao fórum. Como você não falou nada vou presumir que você está programando no PIC18F4550 usando o KIT PICMinas em C com o compilador C18 da microchip. Caso não seja isso me avise que eu mudo a resposta depois se necessário.
Não tenho certeza se realmente entendi o seu problema...
Pelo que eu entendi o mais complicado voce ja sabe que é configurar e utilizar o PWM. Agora o que você precisa é fazer um algoritimo que comece o Duty cycle do PWM em 0 e vá incrementando de tempos em tempos o Duty cycle até chegar a 100% e quando isso acontecer ele vá decrementando o Duty cycle de tempos em tempos até chegar novamente em 0. É isso?
Primeiramente temos que definir como tratar este "de tempo em tempos". Existem duas maneiras de fazer isso. Uma é com o uso da função delay da biblioteca <delays.h> do C18. Delays te da uma precisão de tempo boa, é mais simples de usar, mas trava sua CPU enquanto conta tempo fazendo espera ocupada. Uma maneira melhor de resolver isso é usar o periférico TIMER do PIC e interrupção. Você configura o tempo de estouro do TIMER e a cada estouro ou a cada x estouros você chama uma função para mudar o Duty cycle.
O PWM possui a função SetDCPWM1() que recebe um inteiro sem sinal onde os 10 bits menos significativos são usados. Logo ela pode ter 2^10 =1024 niveis.
O próximo ponto é pensar como fazer uma função que controla o Duty cycle. Claro que existem várias maneiras de implementar isso, a que eu pensei agora...
Espero ter ajudado,
Bruno S. Avelar
Bem vindo ao fórum. Como você não falou nada vou presumir que você está programando no PIC18F4550 usando o KIT PICMinas em C com o compilador C18 da microchip. Caso não seja isso me avise que eu mudo a resposta depois se necessário.
Não tenho certeza se realmente entendi o seu problema...
Pelo que eu entendi o mais complicado voce ja sabe que é configurar e utilizar o PWM. Agora o que você precisa é fazer um algoritimo que comece o Duty cycle do PWM em 0 e vá incrementando de tempos em tempos o Duty cycle até chegar a 100% e quando isso acontecer ele vá decrementando o Duty cycle de tempos em tempos até chegar novamente em 0. É isso?
Primeiramente temos que definir como tratar este "de tempo em tempos". Existem duas maneiras de fazer isso. Uma é com o uso da função delay da biblioteca <delays.h> do C18. Delays te da uma precisão de tempo boa, é mais simples de usar, mas trava sua CPU enquanto conta tempo fazendo espera ocupada. Uma maneira melhor de resolver isso é usar o periférico TIMER do PIC e interrupção. Você configura o tempo de estouro do TIMER e a cada estouro ou a cada x estouros você chama uma função para mudar o Duty cycle.
O PWM possui a função SetDCPWM1() que recebe um inteiro sem sinal onde os 10 bits menos significativos são usados. Logo ela pode ter 2^10 =1024 niveis.
O próximo ponto é pensar como fazer uma função que controla o Duty cycle. Claro que existem várias maneiras de implementar isso, a que eu pensei agora...
- Código:
int duty = 0; // Variavel global onde armazena o valor atual do Duty cycle.
char isUping = 1; // Variavel que se 1 o duty está crescendo se 0 ele está decrescendo
..
#include <pwm.h>;
..
.. // main, função de tratamento de exceção , etc.
..
void DutyManager()
{
if(isUping == 1) // Duty crescendo
{
if(duty < 1024)
{
duty ++;
}
else
{
duty = 1024;
isUping = 0;
}
}
else
{
if(duty > 0)
{
duty --;
}
else
{
duty = 0;
isUping = 1;
}
}
SetDCPWM1(duty);
}
Espero ter ajudado,
Bruno S. Avelar
como controlar o duty cycle do PWM
Bom dia Bruno. Vou utilizar o 18F4550 do kit. Vou tentar explicar melhor.
Estamos montando um Inversor de frequencia monofásico para um projeto da faculdade (Anhanguera), a idéia é variar a frequencia de 0Hz até uns 90Hz em um motor AC de 1Kv.
O firmware que pretendo fazer vai ler um valor analógico em uma porta (potenciômetro) e vai fazer os cálculos para se obter a frequencia do PWM para que em 1/2 período da onda senoidal (se 60Hz= 1/60/2) o próprio firmware vai gerar uma variação do Duty Cycle de 0 ao máximo e volta a 0 (por exemplo 10 pulsos, do pulso 1 ao 5 sobe e do pulso 6 ao 10 volta a zero), e quando retornar a zero, será gerado em outra porta PWM o mesmo trem de pulsos para gerar o semiciclo negativo da onda senoidal. Bom acho que consegui me explicar. Agradeço se puder me ajudar.
Estamos montando um Inversor de frequencia monofásico para um projeto da faculdade (Anhanguera), a idéia é variar a frequencia de 0Hz até uns 90Hz em um motor AC de 1Kv.
O firmware que pretendo fazer vai ler um valor analógico em uma porta (potenciômetro) e vai fazer os cálculos para se obter a frequencia do PWM para que em 1/2 período da onda senoidal (se 60Hz= 1/60/2) o próprio firmware vai gerar uma variação do Duty Cycle de 0 ao máximo e volta a 0 (por exemplo 10 pulsos, do pulso 1 ao 5 sobe e do pulso 6 ao 10 volta a zero), e quando retornar a zero, será gerado em outra porta PWM o mesmo trem de pulsos para gerar o semiciclo negativo da onda senoidal. Bom acho que consegui me explicar. Agradeço se puder me ajudar.
edson- Mensagens : 6
Data de inscrição : 06/08/2010
como controlar o duty cycle do PWM
Bom dia Bruno.
Gostaria da sua ajuda. Consegui desenvolver uma codigo que funciona da seguinte maneira:
> criei um vetor de 10 posições
> cada posição do vetor vai guardar uma porcentagem do período do PWM (duty cycle de 0% -> 100%->0%)
> a cada passagem do TMR2 por zero eu configuro o PWM com a nova posição de duty cyclo.
Agora eu preciso realizar essa mesma sequencia em outra saída do PIC. Eu li +ou- no datasheet do 18f4550 que ele tem apenas um modo de PWM mas que eu posso utilizar " ENHANCED CAPTURE/COMPARE/PWM (ECCP) MODULE" que me possibilita 1, 2, ou 4 saídas para o PWM. Como vou usar duas saídas penso em utilizar o modo " HALF-BRIDGE MODE", mas não sei se vai funcionar bem pois, pelo que li no datasheet, a saída 2 é o inverso da saída 1.
Eu preciso que uma saída só dispare seus pulsos quando a outra terminar sua sequencia, pois cada uma das saídas vai controlar um semiciclo da onda senoidal que será gerada.
Você poderia me ajudar com essa configuração do HALF-BRIDGE MODE? pag: 156 do datasheet
Gostaria da sua ajuda. Consegui desenvolver uma codigo que funciona da seguinte maneira:
> criei um vetor de 10 posições
> cada posição do vetor vai guardar uma porcentagem do período do PWM (duty cycle de 0% -> 100%->0%)
> a cada passagem do TMR2 por zero eu configuro o PWM com a nova posição de duty cyclo.
Agora eu preciso realizar essa mesma sequencia em outra saída do PIC. Eu li +ou- no datasheet do 18f4550 que ele tem apenas um modo de PWM mas que eu posso utilizar " ENHANCED CAPTURE/COMPARE/PWM (ECCP) MODULE" que me possibilita 1, 2, ou 4 saídas para o PWM. Como vou usar duas saídas penso em utilizar o modo " HALF-BRIDGE MODE", mas não sei se vai funcionar bem pois, pelo que li no datasheet, a saída 2 é o inverso da saída 1.
Eu preciso que uma saída só dispare seus pulsos quando a outra terminar sua sequencia, pois cada uma das saídas vai controlar um semiciclo da onda senoidal que será gerada.
Você poderia me ajudar com essa configuração do HALF-BRIDGE MODE? pag: 156 do datasheet
edson- Mensagens : 6
Data de inscrição : 06/08/2010
PWM
Eu preciso de uma ajuda maior. Não sei como configurar um PWM.
Já vi isso na aula de SPP, mas não entendi muito.
Como faz para configurar?
Obrigado
Matheus Pacheco
Já vi isso na aula de SPP, mas não entendi muito.
Como faz para configurar?
Obrigado
Matheus Pacheco
Matheus Pacheco- Mensagens : 7
Data de inscrição : 25/01/2011
Idade : 34
Localização : Belo Horizonte
Re: como controlar o duty cycle do PWM
Olá Matheus,
O PIC18F4550 que é utilizado no KIT PICMinas18 que você possui possui 2 modulos CCP (Capture Compare PWM). Você pode ler sobre o seu funcionamento no datasheet do PIC18F4550 (rev. E) na página 143. O compilador C18 possui uma biblioteca que facilita o uso deste periférico. Você pode ver a documentação da biblioteca no diretório onde voce instalou o C18, na pasta doc. (por exemplo: C:\mplabc18\doc). A documentação chama "PIC18F Peripheral Library Help Document.chm" Como é uma biblioteca do compilador basta incluir #include <pwm.h>
Nesta biblioteca existem duas funções muito uteis:
--> void OpenPWM1( char period ) : Esta função recebe um número de 8 bits para o período do PWM. O período pode ser calculado pela fórmula
PWM period = [(period ) + 1] x 4 x Tosc x TMR2 prescaler
Repare que o prescaler do timer2 é utilizado, logo é necessário inclui-lo e inicia-lo.
-->void SetDCPWM1(unsigned int dutycycle) : Esta função recebe o dutycycle. Dutycycle é um número de 10 bits que especifica o tempo em nivel lógico 1 que o PWM ficará. (o restante do periodo ele fica em 0)
Este parâmetro pde ser calculado por:
PWM x Duty cycle = (DCx<9:0>) x Tosc
Espero ter ajudado,
Bruno S. Avelar
O PIC18F4550 que é utilizado no KIT PICMinas18 que você possui possui 2 modulos CCP (Capture Compare PWM). Você pode ler sobre o seu funcionamento no datasheet do PIC18F4550 (rev. E) na página 143. O compilador C18 possui uma biblioteca que facilita o uso deste periférico. Você pode ver a documentação da biblioteca no diretório onde voce instalou o C18, na pasta doc. (por exemplo: C:\mplabc18\doc). A documentação chama "PIC18F Peripheral Library Help Document.chm" Como é uma biblioteca do compilador basta incluir #include <pwm.h>
Nesta biblioteca existem duas funções muito uteis:
--> void OpenPWM1( char period ) : Esta função recebe um número de 8 bits para o período do PWM. O período pode ser calculado pela fórmula
PWM period = [(period ) + 1] x 4 x Tosc x TMR2 prescaler
Repare que o prescaler do timer2 é utilizado, logo é necessário inclui-lo e inicia-lo.
-->void SetDCPWM1(unsigned int dutycycle) : Esta função recebe o dutycycle. Dutycycle é um número de 10 bits que especifica o tempo em nivel lógico 1 que o PWM ficará. (o restante do periodo ele fica em 0)
Este parâmetro pde ser calculado por:
PWM x Duty cycle = (DCx<9:0>) x Tosc
Espero ter ajudado,
Bruno S. Avelar
PWM
Ajudou bastante
Obrigado Bruno
Obrigado Bruno
Matheus Pacheco- Mensagens : 7
Data de inscrição : 25/01/2011
Idade : 34
Localização : Belo Horizonte
PWM
Oi Bruno,
tenho mais uma dúvida. Quero usar o pino PWM para
controlar a intensidade do brilho de 8 leds brancos.
Porém eu preciso de potência suficiente para alimentar
os oitos. A saída PWM consegue dar um brilho bom
para todos os 8 leds?
Obrigado
Matheus Pacheco
tenho mais uma dúvida. Quero usar o pino PWM para
controlar a intensidade do brilho de 8 leds brancos.
Porém eu preciso de potência suficiente para alimentar
os oitos. A saída PWM consegue dar um brilho bom
para todos os 8 leds?
Obrigado
Matheus Pacheco
Matheus Pacheco- Mensagens : 7
Data de inscrição : 25/01/2011
Idade : 34
Localização : Belo Horizonte
Re: como controlar o duty cycle do PWM
Olá Matheus,
Infelizmente os pinos do PIC não suportam o dreno de corrente necessário para acender 8 LEDs.
Para que seja possível você deverá fazer um pequeno circuito que de um ganho de corrente. Uma forma de fazer é utilizar um transistor funcionando como uma chave que permite passagem de corrente provida da alimentação ou impede esta corrente. Este hardware utiliza apenas um resistor e um transistor (alem de fios e/ou protoboard e o circuito dos LEDs). Você deve olhar ainda se o transistor em questão consegue chavear na velocidade que você deseja o PWM. Em geral os transistores são bons o suficiente para isso.
Espero ter ajudado.
Bruno S. Avelar
Infelizmente os pinos do PIC não suportam o dreno de corrente necessário para acender 8 LEDs.
Para que seja possível você deverá fazer um pequeno circuito que de um ganho de corrente. Uma forma de fazer é utilizar um transistor funcionando como uma chave que permite passagem de corrente provida da alimentação ou impede esta corrente. Este hardware utiliza apenas um resistor e um transistor (alem de fios e/ou protoboard e o circuito dos LEDs). Você deve olhar ainda se o transistor em questão consegue chavear na velocidade que você deseja o PWM. Em geral os transistores são bons o suficiente para isso.
Espero ter ajudado.
Bruno S. Avelar
PWM
Certo. Então se eu conseguir adaptar uma saída comum para PWM(da meneira como você explicou anteriormente utilizando timers),
posso conseguir o que eu quero, se eu ligar uma saida para cada Led?
Obrigado
Matheus Pacheco
posso conseguir o que eu quero, se eu ligar uma saida para cada Led?
Obrigado
Matheus Pacheco
Matheus Pacheco- Mensagens : 7
Data de inscrição : 25/01/2011
Idade : 34
Localização : Belo Horizonte
Re: como controlar o duty cycle do PWM
Sim, dado que cada porta possui corrente suficiente para alimentar um LED você pode utilizar timers para controlar o tempo de acionamento das portas digitais do PIC.
Bruno S. Avelar
Bruno S. Avelar
Tópicos semelhantes
» Kit multi pic
» Como configuro USART no pic18f4550?
» Multiplicação das portas utilizadas como saida no PIC
» Como configuro USART no pic18f4550?
» Multiplicação das portas utilizadas como saida no PIC
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos
|
|