Autor Tema: Onda cuadrada con pic 18f44550  (Leído 1493 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado syndu

  • PIC10
  • *
  • Mensajes: 12
Onda cuadrada con pic 18f44550
« en: 05 de Mayo de 2016, 01:32:10 »
genero la onda. pero al variar el ciclo de trabajo, varia la amplitud, y ya no se que hacer para correguir el problema!! ayuda!!

#include <p18cxxx.h>
#include <delays.h>
#include <stdlib.h>
#include "lcd.h"
#pragma config PLLDIV = 5 // (20 MHz crystal)
#pragma config CPUDIV = OSC1_PLL2
#pragma config USBDIV = 2 // Clock source from 96MHz PLL/2
#pragma config FOSC = HSPLL_HS //HSPLL_HS
#pragma config WDT = OFF
//variable lcd
CHAR lcd[16];
CHAR msg[]="% Alfa= ";

unsigned long n=0;
unsigned long conta=0;
float constante=17.64;            // valor calculado por regla de tres
unsigned int ADC,Alfa;
unsigned long Valor_Escalado;
unsigned int adc_read(unsigned char ch);
// variable interrupcion
unsigned int count=0;
void initTimer (void);
void InterruptHandlerHigh (void);
// High priority interrupt vector
#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh (void)
{
_asm
goto InterruptHandlerHigh //jump to interrupt routine
_endasm
}
// High priority interrupt routine
#pragma code
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh ()
{
if (PIR1bits.TMR2IF == 1)
{
PIR1bits.TMR2IF = 0;
count++;
if(count==n)
PORTC=0;
if(count==512)
{
PORTC=0xFF;
count=0;
}
}
}
void main()
{
TRISB=TRISC=TRISD = 0x00; // set direction to be output
PORTC=0x0;
ADCON1 = 0x0F;
INTCONbits.GIE = 1; //enable global interrupts
INTCONbits.PEIE = 1; //enable peripherical interrupts
   lcd_init();
   TRISAbits.TRISA0 = 1;
   initTimer();
do{
      lcd_clear();
      ADC = adc_read(0);                  // Read from channel 0 (AN0)
      lcd_display(1,1,msg);                // Display "mV = "
      Valor_Escalado=ADC;
      Valor_Escalado = constante*Valor_Escalado;                   // Scale up the result
      Alfa = Valor_Escalado / 100;               // Decimal part
      itoa(Alfa,lcd);                   // Convert Vdec to string in "lcd"
      lcd_display(1,8,lcd);                // Output to LCD
      Delay10KTCYx(250);
   n=Alfa*2.85-1;
      //initTimer();

}while(1);
}
void initTimer (void)
{
PR2 = 194; // T = (PR2+1) * 4 *(1/Fosc)*PRESCALER
// 16.25us= (PR2+1)* 4*(1/Fosc)*PRESCALER : Fosc=48Mhz : PRESCALER=1
T2CON=0;
T2CONbits.T2CKPS1 = 0;
T2CONbits.T2CKPS0 = 0; // 1:1 - prescaler
IPR1bits.TMR2IP = 1; // high priority
PIR1bits.TMR2IF = 0;
PIE1bits.TMR2IE = 1; //1=enable Interrupt
T2CONbits.TMR2ON = 1;
}

unsigned int adc_read(unsigned char ch){
   unsigned int result;
   ADCON0 = (ch & 0x0F) << 2;
   ADCON1 = 0x0B;   //RA0-RA3 Analog inputs.
   ADCON2 = 0x96;   // right justify,TACQ=4*TAD, TAD=1/(FOSC/64)
   ADCON0bits.ADON = 1; // ADC on
   ADCON0bits.GO_DONE = 1; // start
   while (ADCON0bits.GO_DONE == 1);
   result = ((unsigned int)(ADRESH) << 8) + ADRESL;
   ADCON0bits.ADON = 0;   // ADC Off
   return result;
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Onda cuadrada con pic 18f44550
« Respuesta #1 en: 05 de Mayo de 2016, 07:35:55 »
Citar
genero la onda. pero al variar el ciclo de trabajo, varia la amplitud, y ya no se que hacer para correguir el problema!! ayuda!!

Tenes algo conectado al PIN del PIC? desconectalo y probalo sin nada, parece no ser algo del programa, ya que el PWM no varia la amplitud, solo lo pone a 1 o a 0 a la salida, como si fuera una salida digital.

PD: El PIC18F44550 no figura en la pagina de microchip, estas seguro que esa es el PIC que posees ?


 

anything