-
Notifications
You must be signed in to change notification settings - Fork 0
/
filtrar.c
61 lines (47 loc) · 1.72 KB
/
filtrar.c
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
#include "MT-10.h"
#define B0 1024
#define B1 0
#define B2 -1024
// =============
// recibe una tensión de entrada, y según el filtro en el que se encuentre el sistema
// aplica el sistema de la documentación
// =============
int filtrado(int tension_ent){
//Constantes de filtrado necesarias para los cálculos
static int a [2][7] = {{-2029, -2011, -1970, -1878, -1660, -1115, 141} , {1006, 988, 955, 890, 772, 569, 239}};
static int filtros_ganancia [7] = {8, 17, 34, 66, 125, 227, 392};
static int historia[2][7] = { {0,0,0,0,0,0,0} , {0,0,0,0,0,0,0}};
int salida;
int aux;
aux = historia[0][filtro];
salida = B0 * tension_ent -a[0][filtro] * historia[0][filtro] -a[1][filtro] * historia[1][filtro];
historia[0][filtro] = salida >> 10;
salida += B1 * aux + historia[1][filtro] * B2;
historia[1][filtro] = aux;
salida = salida >> 10;
salida = salida * filtros_ganancia[filtro];
salida = salida >> 10;
return salida;
}
// =============
// llama a la función filtrado para cada filtro, y suma sus salidas según la ganancia seleccionada mediante
// la interfaz. Además gestiona la salida del nv de energía por el vúmetro
// =============
int filtradoMultiple () {
int output;
int i;
int salida_unica;
int tension;
static int ganancia_energia [16] = {1024, 790, 610, 471, 364, 281, 217, 167, 129, 99, 77, 59, 46, 35, 27, 21};
output = 0;
tension = leerADC();
for(i=0; i<7 ;i++){
filtro = i;
salida_unica = (filtrado(tension) * ganancia_energia[nv[i]]) >> 10;
output += salida_unica;
if(i==fila_ilum)
nv_energia += salida_unica*salida_unica;
}
output = output >> 1;
return output;
}