Moderadores: 51, guest2003, Renie, gpenga
#include <ADuC7026.h> // ADuC7026 definitions
#include <stdio.h>
#include <math.h>
//**************Protótipos das funções***************
void inicializa(void);
void configura_ad(void);
void configura_da(void);
unsigned short le_ad(unsigned char);
void configura_timer1(void);
void IRQ_Handler(void) __irq;
void portadora(double);
//***************************************************
//****************Variáveis globais******************
unsigned short res_ad;
unsigned int x, i;
float temp, t;
unsigned short valores_dac0[360];
unsigned short valores_dac1[360];
//***************************************************
void main(void){
inicializa();
configura_ad();
configura_da();
portadora(35);
while(1);
}
void portadora(double freq){
double periodo_port;
for(t = 0; t < 360; t++){
temp = sin(t*0.0174532925)*3276; //fórmula seno
if (t <= 180){ //valores para senóide DAC0
valores_dac0[t] = ((unsigned short)temp);
valores_dac1[t] = 3276;
}
else{ //valores para senóide DAC2
valores_dac0[t] = 0;
valores_dac1[t] = ((unsigned short)temp);
}
}
//cálculo e configuração timer1 para interrupção e atualização da senóide
periodo_port = 1/freq; //calcula período da portadora
periodo_port /= 360; //divide pela qtd de pontos totais da senóide = periodo de interrupção
T1LD = periodo_port/0.0000000239348970799426; //divide periodo de interrupção pelo período do clock do core (41.78MHz)
T1LD -= 3;
T1CON = 0xC0; // Enabled,Periodic,Binary and CLK/16
IRQEN = GP_TIMER_BIT; // Enable XIRQ0 and Timer1 IRQ
i = 0; //contador de ponto da senóide = 0
return;
}
void inicializa(void){
PLLKEY1 = 0xAA; //sequência para habilitar escrita em PLLCON
PLLCON = 0x21; //registrador de seleção de fonte de clock
PLLKEY2 = 0x55; //PLLCON = 0x21 -> Internal 32KHz clock source
POWKEY1 = 0x01; //sequência para habilitar escrita em POWCON
POWCON = 0x00; //registrador de divisor do clock.
POWKEY2 = 0xF4; // POWCON = 0 -> CD = 0 / clock divider = 0 -> 41.78MHz;
CMPCON = 0x400; //comparador desabilitado
GP4CON = 0x0000; //todos pinos de P4 são GPIO
GP4DAT = 0x04000000;
return;
}
void configura_ad(void){
unsigned int time_wakeup;
time_wakeup = 50000;
ADCCON = 0x20; //ADC on;
while (time_wakeup > 0) time_wakeup--; //wake-up time para o ADC
ADCCON = 0x0223; // fADC/1 - 8 clocks - single-ended mode - single sw conv //0000 0010 0010 0011
REFCON = 0x01; //referência interna de 2.5V conectada ao Vref
return;
}
unsigned short le_ad(unsigned char canal){
ADCCP = canal; //seleciona canal
ADCCON |= 0x083; //inicia conversão
while(!ADCSTA); //espera conversão finalizar
return (ADCDAT >> 16) & 0x0FFF; //retorna resultado em 12 bits
}
void configura_da(void){
DAC0CON = 0x12; //core-clock dac update - referência interna de 2.5V
DAC2CON = 0x12; //core-clock dac update - referência interna de 2.5V
return;
}
void IRQ_Handler() __irq { // example with two IRQ
if ((IRQSTA & GP_TIMER_BIT) != 0){
T1CLRI = 0; // Clear Timer IRQ
DAC0DAT = valores_dac0[i] << 16;
DAC2DAT = valores_dac1[i] << 16;
i++;
if (i == 360) i = 0;
}
return ;
}
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante