| 1 | //-----------------------------------------------------------------------------
|
|---|
| 2 |
|
|---|
| 3 | #include "interpol.h"
|
|---|
| 4 | #include "usart.h"
|
|---|
| 5 | #include "ad7719_adc.h"
|
|---|
| 6 | //#include "typedefs.h"
|
|---|
| 7 | //#include "application.h"
|
|---|
| 8 | #include "num_conversion.h"
|
|---|
| 9 | //-----------------------------------------------------------------------------
|
|---|
| 10 | /*
|
|---|
| 11 | Temperatur Sensoren von IST nach DIN60751, Kl.B
|
|---|
| 12 | Messfehler +/- 0.30+0.005*|t|
|
|---|
| 13 |
|
|---|
| 14 | R(t) = R0(1 + At + Bt^2 + C(t-100)t^3) t = [-200, 0]°C
|
|---|
| 15 | R(t) = R0(1 + At + Bt^2) t = [0, 850]°C
|
|---|
| 16 |
|
|---|
| 17 | A = 3.9083*10^-3[°C^-1]
|
|---|
| 18 | B = -5.775*10^-7[°C^-2]
|
|---|
| 19 | C = -4.183*10^-12[°C^-4]
|
|---|
| 20 |
|
|---|
| 21 | Strom durch R ist konstant 400uA
|
|---|
| 22 | Intervallweise lineare Interpolation der Funktion R(t) mit MATLAB polyfit
|
|---|
| 23 | adcword = 13107200 * u(temperatur)
|
|---|
| 24 | */
|
|---|
| 25 | U08 space_STR[] = " |";
|
|---|
| 26 | U08 OoR_STR[] = " OoR |";
|
|---|
| 27 |
|
|---|
| 28 |
|
|---|
| 29 |
|
|---|
| 30 | float gettemp(void)
|
|---|
| 31 | {
|
|---|
| 32 |
|
|---|
| 33 |
|
|---|
| 34 | U8 temprange = 17;
|
|---|
| 35 | U32 adcword=0;
|
|---|
| 36 | float temp=-3.14; // should be initialized in a proper way, but I dont know how :-)
|
|---|
| 37 | const U32 min = 0x404054;
|
|---|
| 38 | const U32 max = 0x8CAF50;
|
|---|
| 39 | const U32 s = 0x4C6F0; //(max-min)/16 = s(lice)
|
|---|
| 40 |
|
|---|
| 41 | adcword = read_adc();
|
|---|
| 42 |
|
|---|
| 43 | if (adcword >= (min + 8*s))
|
|---|
| 44 | {
|
|---|
| 45 | if (adcword >= (min + 12*s))
|
|---|
| 46 | {
|
|---|
| 47 | if (adcword >= (min + 14*s))
|
|---|
| 48 | {
|
|---|
| 49 | if (adcword >= (min + 15*s))
|
|---|
| 50 | {
|
|---|
| 51 | if (adcword < max)
|
|---|
| 52 | {
|
|---|
| 53 | temprange = 16;
|
|---|
| 54 | }
|
|---|
| 55 | }
|
|---|
| 56 | else
|
|---|
| 57 | {
|
|---|
| 58 | temprange = 15;
|
|---|
| 59 | }
|
|---|
| 60 | }
|
|---|
| 61 | else
|
|---|
| 62 | {
|
|---|
| 63 | if (adcword >= (min + 13*s))
|
|---|
| 64 | {
|
|---|
| 65 | temprange = 14;
|
|---|
| 66 | }
|
|---|
| 67 | else
|
|---|
| 68 | {
|
|---|
| 69 | temprange = 13;
|
|---|
| 70 | }
|
|---|
| 71 | }
|
|---|
| 72 | }
|
|---|
| 73 | else
|
|---|
| 74 | {
|
|---|
| 75 | if (adcword >= (min + 10*s))
|
|---|
| 76 | {
|
|---|
| 77 | if (adcword >= (min + 11*s))
|
|---|
| 78 | {
|
|---|
| 79 | temprange = 12;
|
|---|
| 80 | }
|
|---|
| 81 | else
|
|---|
| 82 | {
|
|---|
| 83 | temprange = 11;
|
|---|
| 84 | }
|
|---|
| 85 | }
|
|---|
| 86 | else
|
|---|
| 87 | {
|
|---|
| 88 | if (adcword >= (min + 9*s))
|
|---|
| 89 | {
|
|---|
| 90 | temprange = 10;
|
|---|
| 91 | }
|
|---|
| 92 | else
|
|---|
| 93 | {
|
|---|
| 94 | temprange = 9;
|
|---|
| 95 | }
|
|---|
| 96 | }
|
|---|
| 97 | }
|
|---|
| 98 | }
|
|---|
| 99 | else
|
|---|
| 100 | {
|
|---|
| 101 | if (adcword >= (min + 4*s))
|
|---|
| 102 | {
|
|---|
| 103 | if (adcword >= (min + 6*s))
|
|---|
| 104 | {
|
|---|
| 105 | if (adcword >= (min + 7*s))
|
|---|
| 106 | {
|
|---|
| 107 | temprange = 8;
|
|---|
| 108 | }
|
|---|
| 109 | else
|
|---|
| 110 | {
|
|---|
| 111 | temprange = 7;
|
|---|
| 112 | }
|
|---|
| 113 | }
|
|---|
| 114 | else
|
|---|
| 115 | {
|
|---|
| 116 | if (adcword >= (min + 5*s))
|
|---|
| 117 | {
|
|---|
| 118 | temprange = 6;
|
|---|
| 119 | }
|
|---|
| 120 | else
|
|---|
| 121 | {
|
|---|
| 122 | temprange = 5;
|
|---|
| 123 | }
|
|---|
| 124 | }
|
|---|
| 125 | }
|
|---|
| 126 | else
|
|---|
| 127 | {
|
|---|
| 128 | if (adcword >= (min + 2*s))
|
|---|
| 129 | {
|
|---|
| 130 | if (adcword >= (min + 3*s))
|
|---|
| 131 | {
|
|---|
| 132 | temprange = 4;
|
|---|
| 133 | }
|
|---|
| 134 | else
|
|---|
| 135 | {
|
|---|
| 136 | temprange = 3;
|
|---|
| 137 | }
|
|---|
| 138 | }
|
|---|
| 139 | else
|
|---|
| 140 | {
|
|---|
| 141 | if (adcword >= (min + s))
|
|---|
| 142 | {
|
|---|
| 143 | temprange = 2;
|
|---|
| 144 | }
|
|---|
| 145 | else
|
|---|
| 146 | {
|
|---|
| 147 | if (adcword > min)
|
|---|
| 148 | {
|
|---|
| 149 | temprange = 1;
|
|---|
| 150 | }
|
|---|
| 151 | }
|
|---|
| 152 | }
|
|---|
| 153 | }
|
|---|
| 154 | }
|
|---|
| 155 |
|
|---|
| 156 |
|
|---|
| 157 | switch (temprange)
|
|---|
| 158 | {
|
|---|
| 159 | case 1:{ // Temp. Range [-50°C , -34.375°C[
|
|---|
| 160 | temp = ((float)adcword / 20764.727846 - 252.7721); //20764.727846 - 252.7721
|
|---|
| 161 | }
|
|---|
| 162 | break;
|
|---|
| 163 |
|
|---|
| 164 | case 2:{ // Temp. Range [-34.375°C , -18.75°C[
|
|---|
| 165 | temp = ((float)adcword / 20658.049789 - 253.8995); //20658.049789 - 253.8995
|
|---|
| 166 | }
|
|---|
| 167 | break;
|
|---|
| 168 |
|
|---|
| 169 | case 3:{ // Temp. Range [-18.75°C , -3.125°C[
|
|---|
| 170 | temp = ((float)adcword / 20557.997603 - 255.0436); //20557.997603 - 255.0436
|
|---|
| 171 | }
|
|---|
| 172 | break;
|
|---|
| 173 |
|
|---|
| 174 | case 4:{ // Temp. Range [-3.125°C , 12.5°C]
|
|---|
| 175 | temp = ((float)adcword / 20462.362624 - 256.2209); //20462.362624 - 256.2209
|
|---|
| 176 | }
|
|---|
| 177 | break;
|
|---|
| 178 |
|
|---|
| 179 | case 5:{ // Temp. Range [12.5°C , 28.125°C]
|
|---|
| 180 | temp = ((float)adcword / 20367.745024 - 257.4692); //20367.745024 - 257.4692
|
|---|
| 181 | }
|
|---|
| 182 | break;
|
|---|
| 183 |
|
|---|
| 184 | case 6:{ // Temp. Range [28.125°C , 43.75°C]
|
|---|
| 185 | temp = ((float)adcword / 20273.127424 - 258.8021); //20273.127424 - 258.8021
|
|---|
| 186 | }
|
|---|
| 187 | break;
|
|---|
| 188 |
|
|---|
| 189 | case 7:{ // Temp. Range [43.75°C , 59.375°C]
|
|---|
| 190 | temp = ((float)adcword / 20178.509824 - 260.2208); //20178.509824 - 260.2208
|
|---|
| 191 | }
|
|---|
| 192 | break;
|
|---|
| 193 |
|
|---|
| 194 | case 8:{ // Temp. Range [59.375°C , 75°C]
|
|---|
| 195 | temp = ((float)adcword / 20083.892224 - 261.7265); //20083.892224 - 261.7265
|
|---|
| 196 | }
|
|---|
| 197 | break;
|
|---|
| 198 |
|
|---|
| 199 | case 9:{ // Temp. Range [75°C , 90.625°C]
|
|---|
| 200 | temp = ((float)adcword / 19989.274624 - 263.3203); //19989.274624 - 263.3203
|
|---|
| 201 | }
|
|---|
| 202 | break;
|
|---|
| 203 |
|
|---|
| 204 | case 10:{ // Temp. Range [90.625°C , 106.25°C]
|
|---|
| 205 | temp = ((float)adcword / 19894.657024 - 265.0037); //19894.657024 - 265.0037
|
|---|
| 206 | }
|
|---|
| 207 | break;
|
|---|
| 208 |
|
|---|
| 209 | case 11:{ // Temp. Range [106.25°C , 121.875°C]
|
|---|
| 210 | temp = ((float)adcword / 19800.039424 - 266.7778); //19800.039424 - 266.7778
|
|---|
| 211 | }
|
|---|
| 212 | break;
|
|---|
| 213 |
|
|---|
| 214 | case 12:{ // Temp. Range [121.875°C , 137.5°C]
|
|---|
| 215 | temp = ((float)adcword / 19705.421824 - 268.6439); //19705.421824 - 268.6439
|
|---|
| 216 | }
|
|---|
| 217 | break;
|
|---|
| 218 |
|
|---|
| 219 | case 13:{ // Temp. Range [137.5°C , 153.125°C]
|
|---|
| 220 | temp = ((float)adcword / 19610.804224 - 270.6035); //19610.804224 - 270.6035
|
|---|
| 221 | }
|
|---|
| 222 | break;
|
|---|
| 223 |
|
|---|
| 224 | case 14:{ // Temp. Range [153.125°C , 168.75°C]
|
|---|
| 225 | temp = ((float)adcword / 19516.186624 - 272.6578); //19516.186624 - 272.6578
|
|---|
| 226 | }
|
|---|
| 227 | break;
|
|---|
| 228 |
|
|---|
| 229 | case 15:{ // Temp. Range [168.75°C , 184.375°C]
|
|---|
| 230 | temp = ((float)adcword / 19421.569024 - 274.8082); //19421.569024 - 274.8082
|
|---|
| 231 | }
|
|---|
| 232 | break;
|
|---|
| 233 |
|
|---|
| 234 | case 16:{ // Temp. Range [184.375°C , 200°C]
|
|---|
| 235 | temp = ((float)adcword / 19326.951424 - 277.0562); //19326.951424 - 277.0562
|
|---|
| 236 | }
|
|---|
| 237 | break;
|
|---|
| 238 | default:{ // Temp. Range beyond [-50C , 200C]
|
|---|
| 239 | PORTC = (PORTC | 0x04);
|
|---|
| 240 | }
|
|---|
| 241 | }// end of switch case statement
|
|---|
| 242 | return temp;
|
|---|
| 243 |
|
|---|
| 244 | }
|
|---|
| 245 |
|
|---|
| 246 | void readandsendpress(void)
|
|---|
| 247 | {
|
|---|
| 248 | U32 adcword=0;
|
|---|
| 249 | float press;
|
|---|
| 250 |
|
|---|
| 251 | adcword = read_adc();
|
|---|
| 252 |
|
|---|
| 253 | if ( (adcword > 0x253332) && (adcword < 0xF80000) ) // Press. Range is [0Bar , 250Bar]
|
|---|
| 254 | {
|
|---|
| 255 | press = ((float)adcword / (62 * 836.658790402)) - 63.0091; // 62 Ohm
|
|---|
| 256 | usart_write_float(press,2,5);
|
|---|
| 257 | usart_write_flash_str(space_STR);
|
|---|
| 258 | }
|
|---|
| 259 | else
|
|---|
| 260 | {
|
|---|
| 261 | usart_write_flash_str(OoR_STR); // Press. is beyond [0Bar , 250Bar]
|
|---|
| 262 | PORTC = (PORTC | 0x04);
|
|---|
| 263 | }
|
|---|
| 264 |
|
|---|
| 265 | }
|
|---|
| 266 |
|
|---|
| 267 |
|
|---|
| 268 | /*
|
|---|
| 269 | Temperatur Sensoren von IST nach DIN60751, Kl.B
|
|---|
| 270 | Messfehler +/- 0.30+0.005*|t|
|
|---|
| 271 |
|
|---|
| 272 | R(t) = R0(1 + At + Bt^2 + C(t-100)t^3) t = [-200, 0]°C
|
|---|
| 273 | R(t) = R0(1 + At + Bt^2) t = [0, 850]°C
|
|---|
| 274 |
|
|---|
| 275 | A = 3.9083*10^-3[°C^-1]
|
|---|
| 276 | B = -5.775*10^-7[°C^-2]
|
|---|
| 277 | C = -4.183*10^-12[°C^-4]
|
|---|
| 278 |
|
|---|
| 279 | Strom durch R ist konstant 400uA
|
|---|
| 280 | Messung ist ratiometrisch bezogen auf Referenzwiderstand an ADC Pin5 (REFIN-) und Pin6 (REFIN+)
|
|---|
| 281 | Referenzwiderstand ist ca. 6.28kOhm.
|
|---|
| 282 | ADC hat internes gain von 2.
|
|---|
| 283 |
|
|---|
| 284 | */
|
|---|
| 285 |
|
|---|
| 286 | float getresistance(void)
|
|---|
| 287 | {
|
|---|
| 288 |
|
|---|
| 289 | U32 adcword=0;
|
|---|
| 290 | float resistance;
|
|---|
| 291 | const float R_REF=6.28; // kilo-ohms
|
|---|
| 292 | adcword = read_adc();
|
|---|
| 293 | U32 fullscale = 16777215L; //2^24 -1
|
|---|
| 294 |
|
|---|
| 295 | resistance = ((float)adcword / (float)fullscale) /2.0 * R_REF; // divide through 2.0 because of PGA in ADC.
|
|---|
| 296 |
|
|---|
| 297 | return resistance; // in kilo-ohms
|
|---|
| 298 | }
|
|---|
| 299 |
|
|---|
| 300 | U32 getadc(void)
|
|---|
| 301 | {
|
|---|
| 302 | return read_adc();
|
|---|
| 303 | }
|
|---|