Problem använda OP i 16F1788

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
jfri
Inlägg: 180
Blev medlem: 1 februari 2010, 21:41:20

Problem använda OP i 16F1788

Inlägg av jfri »

Jag vill använda OP1 och OP2 i 16F1788 som spänningsföljare (detta borde väl gå?). Detta fungerar inte utspänningen kan bli både mindre eller större än inspänningen. En solcell är kopplad direkt till + ingången på OP1 RA4. Utgång och - ingång till ingången på ADC AN3. Ett batteri är kopplat direkt till + ingång på OP2 RB3 (+en 10 nF kondensator ned till jord). Utgång och - ingång till ADC AN11. En annan konstig sak är att nästan lika hög spänning som batteri kommer ut på RA2 och RA4 som bara är kopplat direkt till solcellen ( i ganska mörk miljö)
Tanken är att uC ska mäta sin egen spänningsförsörjning. Dessutom är solcell och batteri kopplat till comparator 2 vars utgång kopplas till en RG LED via RA7. Denna LED ska visa vilken av spänningarna är störst. Detta verkar fungera. Både batteri och solcell kopplas till en DC/DC omvandlare genom dioder. Denna omvandlare ger 5 V ut och spänningsmatar PICen. Ett annat problem är att ibland får jag ADC värden runt 4000 från solcellen. Men jag använder ju 10 bitar dvs max 1023. Förstår inte. Nedan hur mitt program fn ser ut

Kod: Markera allt

 main.c
#include <htc.h>           /* Global Header File */
#include <stdbool.h>       /* For true/false definition */
#include <stdio.h>
#include <xc.h>
#include "user.h"          /* User funct/params, such as InitApp */
#include "usart.h"

#define	_XTAL_FREQ	4000000L
#define SUNCH    3
#define BATCH   11

void Setup()
{
    OSCCON = 0b01101010;    //4*PLL disabled 4 MHz internal osc
    TRISC   =0b10111000;    //TX output RGB LED on RC0-RC2
    TRISB   =0b00010000;
    TRISA   =0b00001000;
    APFCON1 =0b10000000;    //C2OUT on RA6
    OPA1EN  =0b10000000;    //Enable OP1
    OPA2EN  =0b10000000;    //Enable OP2
    CM2CON0 =0b10100100;
    CM2CON1 =0b00000000;
    ANSELA  =0b00001000;    //AN3 RA3 analog input
    ANSELB  =0b00010000;    //AN11 RB4 analog input
    ADCON0  =0b10000001;    //Enable ADC 10 bits
    ADCON1  =0b11000000;    //2 complement FOSC/8 Vref+=Vcc Vref-=Vss
    ADCON2  =0b00001111;    //ADC negative reference from ADNREF
    RC0=1;                  //RED   LED
    RC1=0;                  //BLUE  LED
    RC2=0;                  //GREEN LED
    init_comms();
    __delay_ms(999);
}

void Loop()
{
    float   temp;                   //Temperatur
    int     rawtemp,sunadc,batadc;
    char    tstr[6]={'\0'};

    if (CM2CON0bits.C2OUT==1)       //Tänd LED röd eller grön beroende på in sp
        RA7=0;
    else
        RA7=1;
    __delay_ms(3000);
    rawtemp=ReadRawTemp(ONCARD);    //18B20 fungerar
    temp=GetTemperatures(rawtemp);
    printf("Temp (rawvalue)=%0.1f\n\r",temp);
    sunadc=Readadc(SUNCH);          //Läs solcell spänning
    __delay_ms(5);
    batadc=Readadc(BATCH);          //läs batt
    printf("sunadc=%d batadc=%d\n\r",sunadc,batadc);
    __delay_ms(2000);
}

void main()
{
    Setup();
    printf("Weather Board Sensors\n\r");

    do {Loop();} while (true);
}

Kod: Markera allt

 adc.c
#include <htc.h>            /* HiTech General Includes */

#define	_XTAL_FREQ	4000000L

int Readadc(char channel)
{
    ADCON0 &= 0b00000001;			//clear channel bits
    ADCON0  |= (channel<<2);			//set channel
    __delay_us(50);
    ADGO=1;					// initiate conversion on the selected channel
    while(ADGO)continue;
    return	(ADRESL | (ADRESH<<8));
}
sodjan
EF Sponsor
Inlägg: 43243
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Problem använda OP i 16F1788

Inlägg av sodjan »

Ska du köra med 2 komplement från ADCn?
jfri
Inlägg: 180
Blev medlem: 1 februari 2010, 21:41:20

Re: Problem använda OP i 16F1788

Inlägg av jfri »

Ja det är meningen
sodjan
EF Sponsor
Inlägg: 43243
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Problem använda OP i 16F1788

Inlägg av sodjan »

Är 2 kompl från ADC kompatibelt med "signed" i C?
Varför köra 2 kompl över huvudtaget?
jfri
Inlägg: 180
Blev medlem: 1 februari 2010, 21:41:20

Re: Problem använda OP i 16F1788

Inlägg av jfri »

Jag ändrade int till unsigned int och nu blir inte ADC värdet större än 1023. Både sol och batteri får mycket låga värden och utspänningarna från OP förstärkarna är också mycket låg (fungerar inte som spänningsföljare).
När man ser på figur 17-3 i databladet så fick jag intrycket att 2 komplement är det naturligaste och vad jag är van vid sedan tidigare. 10 bit resultat börjar på bit 0 och går till bit 9 till skillnad från signed som börjar på bit 6
Skriv svar