Exemplo de PWM 3 níveis com PIC18F4550

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Re: Exemplo de PWM 3 níveis com PIC18F4550

Mensagempor scheleder » 21 Jan 2016 08:58

No esquema vc está usando um Xtal de 12Mhz, mas no código esta 48Mhz...
Qual é o correto?

Outra coisa, qual compilador usou?

Abs
[]'s
João Scheleder Neto
scheleder
Nibble
 
Mensagens: 50
Registrado em: 23 Jan 2007 15:57
Localização: Colombo/PR

Re: Exemplo de PWM 3 níveis com PIC18F4550

Mensagempor KrafT » 21 Jan 2016 12:07

Esse chip tem USB que por sua vez tem afinidade com 48 MHz. Logo, com cristal de 12MHz + PPL x4, eu tenho os 48Mhz.

O compilador é o CCS, mas como quase não tem software, dá até para fazer em assembly.
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Re: Exemplo de PWM 3 níveis com PIC18F4550

Mensagempor Rodrigoev » 21 Jan 2016 20:21

Está sendo implementado com um cortex-m4.
Rodrigoev
 
Mensagens: 2
Registrado em: 19 Jan 2016 16:39

Re: Exemplo de PWM 3 níveis com PIC18F4550

Mensagempor scheleder » 22 Jan 2016 07:58

KrafT escreveu:Esse chip tem USB que por sua vez tem afinidade com 48 MHz. Logo, com cristal de 12MHz + PPL x4, eu tenho os 48Mhz.

O compilador é o CCS, mas como quase não tem software, dá até para fazer em assembly.

Tendi!

Valeu!
[]'s
João Scheleder Neto
scheleder
Nibble
 
Mensagens: 50
Registrado em: 23 Jan 2007 15:57
Localização: Colombo/PR

Re: Exemplo de PWM 3 níveis com PIC18F4550

Mensagempor albert_emule » 20 Nov 2016 14:53

ze escreveu:há alguns anos fiz um treco deste pra girar um motor dum tanquinho. Como de praxe, postei no efêmero boteco e já era. Dicas preciosas do amigo proex, fabim e ... perdoem-me os d+... idade... já viu. Usei um driver igbt sucateado. Devido a alta indutância, eram apenas 17 'steps' de seno. Olhando com mais calma agora, percebo que a tabela poderia ir até 90º só. Mas era minha 1ª vez pow. dá um tempo...
A senoide ficou bunitinha e rodou direitinho. Deu um previsível apitinho. Ai que fofo. A fonte era um gerador 110vdc que era tocado a água. Atualmente está parado pois o córrego secou.
Colo o conteúdo pra somarmos algo
Código: Selecionar todos
/* Programa para uControlador para controle de motor ac com igbt*/
/* 26/09/2011 V0.0A - alpha pic16f627 com portas nand*/
// 30/09 - pic16f876a 2 pwm
//10/10 -dicas do asm51
#include <pic.h>
#define FOSC 10000000 //cristal
#define SAMPLE 17 //num de amostras por semiciclo
#define FREQ 60*2 //120-> 1 semiciclo
#define FREQINT (SAMPLE*FREQ)//freq de interrupção
#define PRESC 16 //prescaler
#define tmr0 0x100-((FOSC/4)/PRESC)/FREQINT
//************************ configuração fusíveis hitech -c*******************
__CONFIG(CP_ON & FOSC_HS & WDTE_OFF & BOREN_ON & LVP_OFF & PWRTE_ON);
static bit comuta;
unsigned char i; //global

unsigned int const tabseno[17]=
{   
99   ,
199   ,
391   ,
568   ,
723   ,
850   ,
945   ,
1003,
1023,
1003,
945   ,
850   ,
723   ,
568   ,
391   ,
199   ,
99
};

//controle pwm
void duty(unsigned int dt)
{
CCP1Y=CCP2Y=dt; //LSB (bit0 pro bit4 de CCP1CON)
dt>>=1;
CCP1X=CCP2X=dt; //LSB (bit1 pro bit5 de CCP2CON)
dt>>=1;
CCPR1L=CCPR2L=dt; //MSB (byte + significativo)
}

static void interrupt
isr(void)         // Here be interrupt function - the name is unimportant.
{
TMR0=tmr0;//restaura
TMR0IF=0;
if (i>16) //completou um semiciclo
   {
   CCP2CON=CCP1CON=0;//pwm off para garantir 0...
   i=0;
   comuta^=1; //próximo seniciclo
   PORTC=0;//... 0 no outro canal
   }
if (!comuta)
   {
   CCP1CON=0b00001100;//pwm1 on
   RC0=1;//liga igbt H direita
   }
else
   {
   CCP2CON=0b00001100;//pwm2 on
   RC3=1;//liga igbt H esquerda
   }
duty(tabseno[i]);
i++;
}

/**********************************************************************/
void main()
{
TRISA=TRISB=TRISC=0;//tudo saída
PORTA=PORTB=PORTC=0;//tudo zerado
CMCON=0xff;//pinos cmcon=digital
CCP1CON=CCP2CON=0;
PR2=0xff;//ajuste freq pwm
T2CON=0b00000100; //timer2 on, prescaler 1:1
OPTION_REG=0b10000011;// TMR0 prescaler 1:16
TMR0=tmr0;//520uS
TMR0IE=1;//habilita interrupt timer0
GIE=1;//interrupção geral
for (;;)
{
//só interrupt por enquanto
}

}

Meu plano era controlar a velocidade, mas ainda não sei como. Creio que tem que diminuir a freq de 60Hz E amplitude, né isso? Bom... dx a água rolar literalmente primeiro. Quem sabe depois de me aposentar... contagem regressiva



Você novamente? kkkk
albert_emule
 
Mensagens: 3
Registrado em: 01 Jun 2014 12:21

Anterior

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x