Ir ao conteúdo
  • Cadastre-se

PIC 2 PWM com mesmo PIC


Posts recomendados

Ola galera tudo beleza?  galera gostaria de saber se é possível gerar 2 pwm com o PIC 18F4550 usando os modulos ccp1 e ccp2, sem ser por timer gerando interrupções, pois quero gerar dois pwm espelhados, ou seja, quando um estiver em nivel alto o outro em nivel baixo, ambos com mesma frequencia. desde ja agradeço

Link para o comentário
Compartilhar em outros sites

ola desculpa a demora, esse micro possui dois modulos de pwm, o CCP1 e CCP2,  trabalhar eles de forma distintas eu sei que tem como, agora eu queria saber se ao configurar um PWM ja tem alguma configuração interna que faz ele gerar o outro espelhado , na mesma frequencia e com o mesmo duty-cicle, assim como ajuste de tempo morto entre eles tambem.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Algo como... digamos que você entenda, saiba como e crie uma função pra fazer o setup do pwm em 10 bits

setup1(unsigned int st) e

setup2(unsigned int st)

Faça tipo isso
 

void setup2canais(unsigned int st)
{
setup1(st);
setup2(1023-st);//espelhado
}
...
setup2canais(768);//p.ex.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em 07/10/2017 às 17:04, Zago10 disse:

ola desculpa a demora, esse micro possui dois modulos de pwm, o CCP1 e CCP2,  trabalhar eles de forma distintas eu sei que tem como, agora eu queria saber se ao configurar um PWM ja tem alguma configuração interna que faz ele gerar o outro espelhado , na mesma frequencia e com o mesmo duty-cicle, assim como ajuste de tempo morto entre eles tambem.

 

Agora complicou .... ajuste de dead-time implica em não poder simplesmente espelhar, nem mesmo a simples inversão da saida PWM resolve esse quesito.

 

Vai ter de definir isso via software mesmo, programando ambos os canais PWM igualmente, e mudando apenas o momento de start entre eles, e usando um simples inversor em uma das saídas.

 

Digo isto de usar um inversor porque uma vez eu tentei programar dois PWMs em um Attiny para gerar sinais complementares, e sempre falhava em um dos extremos ( 0 ou 100 % , não me lembro em qual.... ), e acabei usando um BC como inversor , resolveu perfeitamente....

 

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Zago10 ,

 

Usei um BC547, mas pode usar qualquer pequeno transistor bipolar NPN com o emissor ligado ao GND, um resistor entre o coletor e o +5V, e um resistor que vai da saida PWM até a base do transistor. O sinal no coletor do transistor estará invertido em relação ao aplicado em sua base.

 

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

4 horas atrás, Nao Sei disse:

Verificar modulo eccp ,no cap.16 do datasheet.

image.png.a361d555acc02a11ba0bd73fd7dd2cc8.png

 

Da pesquisa que fiz outro dia lembro e como o desenho mostra o delay começa do meio do período, ele ocorre dos dois lados ... então se você colocar mais delay ele fica meio que no meio do duty e a onda do outro pino ainda fica por cima... não invertida... Tem que mostrar um código pronto para testar isso ai... por enquanto só com porta inversora... mas se tiver alguma forma seria bom aprender ^^

Link para o comentário
Compartilhar em outros sites

13 horas atrás, Bommu Perneta disse:

Da pesquisa que fiz outro dia lembro e como o desenho mostra o delay começa do meio do período, ele ocorre dos dois lados ... então se você colocar mais delay ele fica meio que no meio do duty e a onda do outro pino ainda fica por cima... não invertida... Tem que mostrar um código pronto para testar isso ai... por enquanto só com porta inversora... mas se tiver alguma forma seria bom aprender ^^

Não compreendi o que você quer,ficou confuso.Explica mais detalhado.

Link para o comentário
Compartilhar em outros sites

meio complicado escrever no meu tablet,.. mas vamos lá...

 

cada pino de pwm você pode encurtar a onda ou aumenta-la a partir do ponto de referência que é o inicio na esquerda... então você pode aumentar ou reduzir o tempo que a onda toma, mas sempre da esquerda para a direita... então você pode criar duas ondas com tamanho diferentes.

 

Agora imagine essas duas ondas, a onda maior você vai encurtar com o delay, mas note que o delay se retira dos dois lados da onda , do inicio e do fim com o mesmo tamanho... mas mesmo que você encurte a onda maior ou menor elas terão pontos em comum no tempo... se você encurtar as duas pode ser que você encontre uma região em que uma onda é positiva e a outra negativa... porém o período terá regiões em comum: a a parte low dos dois gráficos. 

 

 

Por isso que to falando de mostrar programa e simulação 

Link para o comentário
Compartilhar em outros sites

22 horas atrás, Nao Sei disse:

Verificar modulo eccp ,no cap.16 do datasheet.

image.png.a361d555acc02a11ba0bd73fd7dd2cc8.png

 

eu nunca tinha visto sobre essas configurações em minhas aulas de micro, estudamos apenas a configuração de duty e PR2... Alguem saberia me dar uma explicação mesmo que basica ou como funciona esses modos? P1A , B seriam alguma saida do micro? desde ja agradeço

 

Link para o comentário
Compartilhar em outros sites

Isso são funções digamos avançadas do micro controlador... tem que ficar mexendo em registradores dos mais variados tipos, bits de configuração, saber inglês se você não achar tutorial tudo explicadinho... pessoal que trabalha com isso já se bate, imagina dar essa cacetada na cabeça do aluno que está aprendendo a ligar led... Nas faculdades nem pic tem ou até mesmo Arduíno só te dão por um período X)  você tem que comprar... enfim... huahuaahu

 

Como fazer? Olha no datasheet aqui toda documentação desse teu e mais bugigangas na parte de "documentação"

http://www.microchip.com/wwwproducts/en/PIC18F4550

Olha tua imagem que você quer fazer e busca pelo pdf com um ctrl+f as palavras que estão nas imagens, cada uma está relacionando a um ou mais registradores.

 

 

Mas ainda não vi como isso vai dar do jeito que você quer...

Enfim... esperando o colega postar código lol X) Outra vez eu tento ^^

Link para o comentário
Compartilhar em outros sites

/* Calcula do valor do registro CCP em funcao da porcentagem desejada para o ciclo-ativo */
void calcula_ccp (float porcentagem)
{
    fosc = 4000000;            
    duty = (1/12000.0) * (porcentagem / 100.0);       
    valor_ccp = duty / ((1/fosc) * 1);           
    valor_ccp_long = (unsigned long)valor_ccp;     
    valor_ccp_high = (valor_ccp_long >> 2) & 0b11111111;
    valor_ccp_low = valor_ccp_long & 3;          
}


void atualiza_duty_pwm (float porcentagem)
{
    calcula_ccp(porcentagem);       
    CCPR1L = valor_ccp_high;      
    CCP1CON = (valor_ccp_low << 4) | 0b00001100;    

    // CCP1CON:
    //         Bits 3-0: Modo PWM
    //         Bits 5-4: 11 (bits 1 e 0) do duty
    //         Bits 7,6: Nao implementados
}

 

criei uma rotina para atualizar meu duty constantemente e gerar minha senoide a partir desta, porém preciso gerar um sinal espelhado identico, mas pela frequencia que vou trabalhar preciso gerar um tempo morto pois se nao meus mosfets entram em curto.  mas a orientação do datasheet e a explicação sobre os modulos de half e full bridge me ajuram muito... valeu me manda um email qualquer coisa  Bommu Perneta -> estou sempre la  ou me passa o sue... [email protected]

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Sério que precisa usar float? 32 bits? Não quer colaborar com o mc que gosta de 8 bits? Mas não se importa muito em trabalhar com 16? Cuja resolução de pwm é de 10 bits? (se não me falha a memória). Bem.. se já teve um resultado positivo, permita-me ficar apenas nesta observação e não te orientar como fazer ok? sorry.

abç

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

5 horas atrás, Isadora Ferraz disse:

Sério que precisa usar float? 32 bits? Não quer colaborar com o mc que gosta de 8 bits? Mas não se importa muito em trabalhar com 16? Cuja resolução de pwm é de 10 bits? (se não me falha a memória). Bem.. se já teve um resultado positivo, permita-me ficar apenas nesta observação e não te orientar como fazer ok? sorry.

abç

 então Isadora estou utilizando o float apenas para testar os hardware, ate porque esta bem lento, sai 1 hertz a cada 3 segundos.... ainda vou melhor isto, meu problema mesmo por enquanto ta em gerar os 2 pwm com tempo morto e espelhados... estou tentando configurar aqui os registradores PWM1CON, CCPRxCON e CCPxCON... mas parece que tem que configurar o ECCP1AS mas esse nao conheço.... e toda orientação e bem vinda. Desculpe-me as vezes a forma como exponho o problema ou a falta de conteudo, sou meio leigo no assunto ainda... desde ja obrigado

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Isadora Ferraz disse:

Tamo junto. (to tendo um de ja vu)

 

Publique o circuito. Fale pra que serve. E etc e tal.

 tenho bastante circuitos, pra colocar todos aqui seria muita coisa, pode ser via email caso queira bem detalhado?

mas o basico estou simulando no proteus o sinal do micro antes de jogar nos driver e depois na ponte H. circuito do proteus tem so o micro o cristal e o osciloscopio nada demais. Criei um programa bem basico só pra trabalhar essa configuração, mas nada que eu altero nos registrador altera a saida....... tenho um material de apoio dos registradores, o datasheet da microchip e ao meu ver coloquei tudo certo, mas sai apenas o pwm do CCP1

 

void main(void) {
    
    TRISC = 0;
    TRISD = 0;
    PORTC = 0;
    PORTD = 0;
    T2CON = 0b00000101;
    PR2 = 70;
    
    while(1){
        
        CCP1CON = 0b10101110;
        PWM1CON = 0b00011011;
        CCPR1L = 0b00100011;
        ECCP1AS = 0x00;
        
        
    }
    
    return;

Link para o comentário
Compartilhar em outros sites

Aqui em baixo código para pic PWM espelho com tempo morto. Para tirar o tempo morto e deixar o sinal PWM totalmente espelhado  é só comentar ECCP1DEL ou colocar tudo zero... Sem precisar de circuito externo ou inversor. ^^

Realmente o carinha tava certo, mas a configuração dessa bagaça me tomou um bom tempo que eu não queria fazer huauhauhauhaa mas enfim... tá ai.. manolo.

 


void main(void) {

    TRISC = 0;
    TRISD = 0;
    PORTC = 0;
    PORTD = 0;
    T2CON = 0b00000101;
    PR2 = 70;
       ECCP1DEL = 0b00011111; //configuração do tempo morto
          CCP1CON = 0b10101100;
      //  PWM1CON = 0b00011011;
        CCPR1L = 0b00100011;
        //ECCP1AS = 1;

    while(1){



    }
    return;
}

 

adicionado 1 minuto depois

Código feito no Mikroc e simulado no Proteus...

Link para o comentário
Compartilhar em outros sites

11 minutos atrás, Bommu Perneta disse:

Aqui em baixo código para pic PWM espelho com tempo morto. Para tirar o tempo morto e deixar o sinal PWM totalmente espelhado  é só comentar ECCP1DEL ou colocar tudo zero... Sem precisar de circuito externo ou inversor. ^^

Realmente o carinha tava certo, mas a configuração dessa bagaça me tomou um bom tempo que eu não queria fazer huauhauhauhaa mas enfim... tá ai.. manolo.

 


void main(void) {

    TRISC = 0;
    TRISD = 0;
    PORTC = 0;
    PORTD = 0;
    T2CON = 0b00000101;
    PR2 = 70;
       ECCP1DEL = 0b00011111; //configuração do tempo morto
          CCP1CON = 0b10101100;
      //  PWM1CON = 0b00011011;
        CCPR1L = 0b00100011;
        //ECCP1AS = 1;

    while(1){



    }
    return;
}

 

adicionado 1 minuto depois

Código feito no Mikroc e simulado no Proteus...

 eu tinha acabado de conseguir gerar um kkk porém nao era espelhado. só que eu marquei ... se for com tempo morto nao precisa ser espelhado eu acho.... testei o seu no proteus e tambem nao saiu espelhado... mas agradeço a todos ai . e se tiverem mais sugestão quanto mais melhor. valeu galera :*

Link para o comentário
Compartilhar em outros sites

Aqui saiu... mesmo com um i7 o porteus reclamou aqui de velocidade

 

59dee9415d640_agora11131.thumb.PNG.a9ee77bef7fa2a5ae39107339586192d.PNG

Tenta ver isso em um osciloscópio real manolo.

adicionado 8 minutos depois

Vai sem set simulation animation options lá na amba system  e diminui os FPS para 10.

 

Cria um novo projeto no mikroC e e cria um novo projeto e salva em outra pasta... tenta de novo... se não for... só testando com osciloscópio mesmo T_T ... 

 

O meu Proteus é o 8.6.

adicionado 12 minutos depois

Imagens do meu MikroC

aavcaaa.PNG.acc694f84ffd90fd0a13d2610268c550.PNGaavca22aa.PNG.6f5013e7add23d612ae682b031e5cdff.PNG

 

adicionado 38 minutos depois

ah , salva em outra pasta, mas também clica no proteus para trocar a pasta também do código que vai ser simulado... tudo para não enter errors ... enfim²

 

Boa noite e fuizzzzzzzzzzzzzzzzzzzzzz

Link para o comentário
Compartilhar em outros sites

Ah, um outro detalhe... Meu micro 18F4550 queimou esses dias atras e desenvolvi o programa com as configurações pro 4520.... no proteus estava simulando com o 4520, troquei pelo 4550 e funcionou... coloquei o programa no hardware do 4520 e funcionou tambem... acredito que esse modulo deva ter algum bug no proteus para o 4520 porque o datasheet dos dois essa parte sao identicos.... as vezes alguem futuramente  tenha esse problema tambem..... ou eu sou o unico premiado kk

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...