Hola que tal, adjunto el esquema que estoy utilizando. Como nota, es un dspic30F4011 pero la version de proteus no lo maneja asi que lo coloque en un 16f877 pero es basicamente como esta armado. Tengo un 2do pot en AN1 y esta conectado exactamente igual que el pot de AN0. Por ahora solo leo las entradas analogicas para mostrarlas en el lcd asi como su resta(AN0-AN1).
Todas las Vdd y la AVdd estan conectadas a Vss por medio de un capacitor de 100nF lo mas pegados al dspic. Alguna otra recomendacion?? Gracias
Necesito que esa lectura sea lo mas precisa que se pueda sin oscilaciones . Tambien pongo el codigo que tengo para ver si es que algo anda mal por ahi jee
#include <30F4011.h> //EJEMPLO PWM
#device adc=10
#include <math.h>
#FUSES XT_PLL16 //XT Crystal Oscillator mode with 16X PLL
#FUSES PR //Primary Oscillator
#FUSES NOPUT //No Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOWDT //No Watch Dog Timer
#FUSES MCLR // Master Clear pin enabled
#use delay(clock=64000000)
#define LCD_ENABLE_PIN PIN_D0 ////
#define LCD_RS_PIN PIN_D2 ////
#define LCD_RW_PIN PIN_D3 ////
#define LCD_DATA4 PIN_F1 ////
#define LCD_DATA5 PIN_F4 ////
#define LCD_DATA6 PIN_F5 ////
#define LCD_DATA7 PIN_F6
#include <lcd.c>
#define ADC_CLOCK_DIV_5 0x0004
#define ADC_TAD_MUL_1 0x0100
#define ADC_TAD_MUL_5 0x0500
int16 p1,p2,p3;
float a;
unsigned int16 duty;
void main()
{
setup_timer1(TMR_DISABLED);
setup_timer3(TMR_DISABLED);
setup_timer2(TMR_INTERNAL | TMR_DIV_BY_8,0xABDF); //periodo de 22ms para servos
setup_compare(2, COMPARE_PWM | COMPARE_TIMER2);
setup_adc_ports(sAN0|sAN1|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_5|ADC_TAD_MUL_1); // |ADC_TAD_MUL_2 INTERNAL DIV_4
set_tris_D(0x00);
set_tris_F(0x00);
lcd_init();
int i=0;
while(i==0){
set_adc_channel(0); // pot1 1k
delay_us(2);
p3=read_adc();
//a= (93.75 * p1 / 1023.0);
//duty=a * (int16)64;
delay_us(3); //entre lectura de canales
set_adc_channel(1); // pot2 1K
delay_us(2);
p2=read_adc();
p1=p3-p2;
/*if(p1>0 && p1<=205){
duty=(int16)2980;}
else if(p1>205 && p1<=410) {
duty=(int16)3083.5;}
else if(p1>410 && p1<=614) {
duty=(int16)3187;}
else if(p1>614 && p1<=820) {
duty=(int16)3290.5;}
else if(p1>820 || p1<0) {
duty=(int16)3394;} */
//set_pwm_duty(2,duty);
lcd_gotoxy(1,1);
printf(lcd_putc,"p3=%4ld p2=%4ld",p3,p2); // u,4ld,f
lcd_gotoxy(1,2);
printf(lcd_putc,"resta=%4ld",p1); //"duty ms=%4ld",duty
delay_ms(10);
}
}