No esquema vc está usando um Xtal de 12Mhz, mas no código esta 48Mhz...
Qual é o correto?
Outra coisa, qual compilador usou?
Abs
Moderadores: andre_luis, 51, guest2003, Renie
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.
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
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante