aboutsummaryrefslogtreecommitdiffhomepage
path: root/workspace/ts100/src/Analog.c
blob: fcc99b51ed37bd00f7d8ef3f896da25b743e8a1f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
 * Analog.c
 *
 *  Created on: 20 Sep 2016
 *      Author: ralim
 *      Contains the functions related to reading and scaling the adc pins
 *      This is used for temperature and battery voltage sense
 */
#include "Analog.h"

//Reads the dc input and returns it as X10 voltage (ie 236 = 23.6V)
//Seems unstable below 9.5V input
uint16_t readDCVoltage(uint16_t divFactor) {
	uint16_t reading = 0;
	for (u8 i = 0; i < 10; i++) {
		reading += ADC_GetConversionValue(ADC2);
	}
	reading /= divFactor; //take the average and convert to X10 voltage
	return reading; //return the read voltage
}

//This reads the thermocouple in the tip
//This allows us to read it in X10 mode
//Returns temperature in C X10 mode
int16_t readTipTemp() {
	static uint32_t rollingAverage[4];
	static uint8_t rIndex = 0;

	/*The head has a thermocouple inline with the heater
	 This is read by turning off the heater
	 Then read the output of the op-amp that is connected across the connections
	 */
	uint32_t ad_sum = 0;
	uint32_t max = 0, min;
	uint32_t ad_value, avg_data;
	uint32_t timer = getIronTimer();
	setIronTimer(0); //set the remaining time to zero
	HEAT_OFF(); //heater must be off
	delayMs(5); //wait for the heater to time out
	uint8_t gMeas_cnt = 9; //how many measurements to make
	max = ad_sum = min = Get_ADC1Value(0);

	while (gMeas_cnt > 0) {
		ad_value = Get_ADC1Value(0);
		ad_sum += ad_value;
		if (ad_value > max)
			max = ad_value;
		if (ad_value < min)
			min = ad_value;

		gMeas_cnt--;
	}
	setIronTimer(timer);
	ad_sum = ad_sum - max - min; //remove the two outliers
	avg_data = ad_sum / 8; //take the average
	rollingAverage[rIndex] = avg_data;
	rIndex = (rIndex + 1) % 4;
	return (rollingAverage[0] + rollingAverage[1] + rollingAverage[2]
			+ rollingAverage[3]) / 4; //get the average

}

/*******************************************************************************
 Function:
 Description:Reads the temperature of the on board temp sensor for calibration
 http://www.analog.com/media/en/technical-documentation/data-sheets/TMP35_36_37.pdf
 Output: The onboardTemp in C X 10
 *******************************************************************************/
int readSensorTemp(void) {
	static uint32_t rollingAverage[4];
	static uint8_t rIndex = 0;
	u32 ad_sum = 0;
	u32 max, min;
	u32 ad_value, avg_data, slide_data;

	u8 gMeas_cnt = 9;
	ad_sum = min = max = Get_ADC1Value(1);
	while (gMeas_cnt > 0) {
		ad_value = Get_ADC1Value(1);
		ad_sum += ad_value;
		if (ad_value > max)
			max = ad_value;
		if (ad_value < min)
			min = ad_value;
		gMeas_cnt--;
	}
	ad_sum = ad_sum - max - min;
	avg_data = ad_sum / 8;
	//^ Removes the two outliers from the data spread

	rollingAverage[rIndex] = avg_data; //store this result
	rIndex = (rIndex + 1) % 4; //move the index
	slide_data = (rollingAverage[0] + rollingAverage[1] + rollingAverage[2]
			+ rollingAverage[3]) / 4; //get the average
	return (250 + (3300 * slide_data / 4096) - 750);
	//(25 + ((10*(33*gSlide_data)/4096)-75));
	//^ Convert the reading to C

}

volatile uint16_t ADC1ConvertedValue[2];
//returns the latest reading from ADC1 that was buffered using DMA
uint16_t Get_ADC1Value(uint8_t i) {
	return ADC1ConvertedValue[i];
}
//This returns the calibrated temperature reading of the iron temp
//inputs : calibration value / wether to take a new reading or not
uint16_t readIronTemp(uint16_t calibration_temp, uint8_t read,
		uint16_t setPointTemp) {
	static uint16_t calTemp = 0;
	static uint16_t lastVal = 0;
	static uint16_t lastSetTemp;
	if(setPointTemp!=0xFFFF)
		lastSetTemp = setPointTemp;
	if (calibration_temp != 0)
		calTemp = calibration_temp;

	if (read) {
		int16_t compensation = 80 + 150 * (lastSetTemp - 1000) / 3000;
		int16_t tipTemp = readTipTemp();
		int16_t ColdJTemp = readSensorTemp();
		if (lastSetTemp == 1000)
			compensation -= 10;

		if (lastSetTemp != 0) {
			if (tipTemp > (compensation + calTemp))
				tipTemp -= compensation;
		}
		if (ColdJTemp > 400)
			ColdJTemp = 400;
		lastVal = (tipTemp * 1000 + 807 * ColdJTemp - calTemp * 1000) / 807;

	}

	return lastVal;

}