ich hab ein problem mit meinem ATtiny.
Ich will eigentlich nur abwechselnd eine Spannung (Batterie status) und die Temperatur messen.
Leider klappt das nicht so recht, irgendwie kommen immer 600k raus -> 326°C ... kann irgendwie nicht sein.
Benutzen tu ich den megaTinyCore.
Code:
Code: Alles auswählen
Setup
// ADC values
unsigned long lastMeasurement = 0; // time ADC mesurement was last taken
int measurementTime = 100; //interval for taking measurements
bool batt = true; //wich measurement to take next batt/temp
bool measurement = false; // measurement in progress
// battery voltage
int battery = 128; // initial value
// temperature related values
unsigned long temp = 0; //initial value
int8_t sigrow_offset = SIGROW.TEMPSENSE1; // Read signed value from signature row (calibration)
uint8_t sigrow_gain = SIGROW.TEMPSENSE0; // Read unsigned value from signature row (calibration)
///////////////ADC einstellen///////////////
////////////////////////////////////////////
ADC0.CTRLB = 0b00000001; //2 sampels accumulation
ADC0.CTRLC |= 0b01000111; //reduced sampling c, internal vref, /256 clk divider
ADC0.CTRLD = 0b10110001; //inital sample delay 256, sample delay variation on,
ADC0.SAMPCTRL = 0b00001111; //sample lenght = 7
ADC0.CTRLA = 0b00000101; //ADC on, 8bit, single conversion
Code: Alles auswählen
if(ADC0.COMMAND == 0b00000000 && measurement == true){ // measurement done, process value
measurement = false;
if(batt == true){ // if this is a battery mesurement process it inside checkBattery
checkBattery();
}else{
checkTemp(); // otherwise process inside checkTemp
}
}
if((millis() - lastMeasurement) >= measurementTime){ // check for time up to make a new measurement
lastMeasurement = millis(); // save last time mesurement was taken
if(batt == true){
analogReference(VDD); // vref to 5V (VDD) for battery measurment
ADC0.CTRLA = 0b00000100; //ADC off, 8bit, normaler modus
ADC0.CTRLB = 0b00000001; //2 sampels accumulation
ADC0.MUXPOS = 0b00000111; // AIN7 as input (connected to vBatt)
ADC0.CTRLA = 0b00000101; //ADC on, 8bit, normaler modus
ADC0.COMMAND = 0b00000001; //start conversion!
measurement = true;
}else{
analogReference(INTERNAL1V1);
ADC0.CTRLA = 0b00000000; //ADC off, 10bit, normaler modus
ADC0.CTRLB = 0b00000000; //0 sampels accumulation
ADC0.MUXPOS = 0b00000111; // tempsense as input
ADC0.CTRLA = 0b00000001; //ADC on, 10bit, normaler modus
ADC0.COMMAND = 0b00000001; // start conversion!
measurement = true;
}
}
Code: Alles auswählen
void checkTemp(){ // mesure temperature
temp = ADC0.RES;
temp -= sigrow_offset;
temp *= sigrow_gain; // Result might overflow 16 bit variable (10bit+8bit)
temp += 0x80; // Add 1/2 to get correct rounding on division below
temp >>= 8; // Divide result to get Kelvin
temp = (temp-273); // temp to celsius
batt = true; // change next measurement value
}
Code: Alles auswählen
void checkBattery(){ // mesure battery voltage
battery = ((ADC0.RES-345)*3.65); // scale ADC values
if(battery <= 0){ // set value to min if overflow
battery = 0;
}
if(battery >= 255){ // set value to max if overflow
battery = 255;
}
if(battery <= 1){ // ceck if undervoltage, than lockout
dutyrLED = 0; // setting dutyrLED for flashing
UVlockout(); // go into UVL
}
batt = false; // change next measurement value
}
Vielleicht sieht jemand das Problem.
Batteriespannung funktioniert wunderbar, temp ist aber immer 325.
(ich hab den Code aufs wesentliche reduziert, da sind noch andere Funktionen drin, die machen aber alle keine Probleme, nur der Temp Sensor treibt mich seit mehreren Stunden in den Wahnsinn)
Danke
Farbe