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));
}