source: Sophya/trunk/Poubelle/archediab.old/archediab.sources/c/tache_regul.c

Last change on this file was 649, checked in by ansari, 26 years ago

archediab 28 vol

File size: 3.3 KB
Line 
1#include "manip.h"
2#include "choix_acquisition.h"
3#include "archeops.h"
4#include "choix_param.h"
5#include "structure.h"
6#include "carte_acqui.h"
7#include "carte_pci.h"
8#include "tm.h"
9#include "tache.h"
10#include "bolo.h"
11
12
13//*****************************************************************************************
14// ***
15#ifdef _diabolo //--------- pour Diabolo ------------------------------ ***
16// ***
17//*****************************************************************************************
18
19
20
21
22
23double deglitch_regul(double x);
24double deglitch_regul(double x)
25{
26double dx;
27static int debut=1;
28static double X,DX;
29//return(x); // ligne a retirer pour deglitcher
30
31if(debut) { X=0;DX=1000; debut=0; }
32
33dx=x-X; if(dx<0) dx=-dx;
34if( dx > DX )
35 {
36 x=X;
37 DX *=1.1;
38 }
39else {
40 DX=0.9 * DX + 0.5 * dx +1 ;
41 X=x;
42 } // en moyenne, 5 fois l'interval moyen
43return(x);
44}
45
46
47void tache_regul(tmtc* tt)
48{
49block_tc btc;
50btc=tt->tc.btc[tt->tc.pos_lit];
51tt->vi.reg.pid=* ( (regul_p_i_d*) &btc );
52}
53
54
55void regul(tmtc* tt)
56{
57int j,cc;
58double i,ecart;
59
60
61if(tt->vi.reg.pid.nb_mes<1) return; // pas de regul si repetition <1
62tt->vi.reg.compteur++;
63if( (tt->vi.reg.compteur>0) && (tt->vi.reg.compteur< (tt->vi.reg.pid.nb_mes*4+4) ) ) return;
64
65ecart=-deglitch_regul(tt->vi.reg.valeur);
66ecart/=4*tt->vi.reg.pid.nb_mes; // valeur mesurée et moyennée apres repetition
67ecart=ecart/(long)tt->ds.dsnorme;
68ecart=((1e5*(double)ecart)/(65536.*tt->reglage.gain[tt->vi.reg.pid.num_bolo-1]));
69tt->vi.reg.valeur=(long)ecart;
70i=tt->vi.reg.tint;
71i=i+ecart*tt->vi.reg.pid.i; // terme intergral
72if(i>4000) i=4000;
73if(i<0) i=0;
74cc=tt->vi.reg.pid.p*ecart+i+(ecart-tt->vi.reg.anc_ecart)*tt->vi.reg.pid.d; // calcul de la commande
75if(cc>4000) cc=4000;
76if(cc<0) cc=0;
77if(!tt->vi.reg.pid.chauf) cc=0;
78//cc=tt->vi.reg.pid.p;
79tt->vi.reg.cc=cc;
80cc=( 0x0fff - cc ) & 0x0fff; // 12 bits avec inverser la polarité
81if( (acquisition_PCI) && ( tt->vi.flag_ecriture_data>2 ) ) // rien en attente d'ecriture: j'ecris direct en interruption
82 {
83 ecrit_carte(tc_regul ); // ecrit bolo 251 --> ecrit regulation
84 ecrit_carte( ( (tt->vi.reg.pid.chauf&3 ) <<6 ) | (cc>>6) ); // ecrit relais (2 bits) + 6 bits de data
85 ecrit_carte( (cc<<2) | 2 ); // ecrit 6 bits de data + 1 + 0
86 for(j=0;j<7;j++) ecrit_carte(0); // reste 7 mots à ecrire
87 tt->vi.flag_ecriture_data=0;
88 }
89
90tt->vi.reg.compteur=0;
91tt->vi.reg.valeur=0;
92tt->vi.reg.anc_ecart=(int)ecart;
93tt->vi.reg.tint=i;
94}
95
96void raz_periodique(tmtc* tt)
97{
98/***************************** ne fait rien !!!!!!!!
99int j;
100if(tt->reg.per_raz<1) return; // pas de raz si periode demandee = 0
101tt->reg.nb_raz++;
102if( (tt->reg.nb_raz>0) && (tt->reg.nb_raz< (tt->reg.per_raz) ) ) return;
103
104
105if( tt->vi.flag_ecriture_data>2 ) // j'ecris direct en interruption sans regrader si autre chose est en cours d'ecriture
106 {
107 ecrit_carte(23 ); // ecrit bolo 23 --> bebo A
108 ecrit_carte( 16); // ecrit a
109 for(j=0;j<8;j++) ecrit_carte(0); // reste 8 mots à ecrire
110 }
111
112tt->tb.synchro[2][tt->tb.pos_ecrit]=999;
113tt->reg.nb_raz=0;
114*/
115}
116
117
118//*****************************************************************************************
119// ***
120#endif //-------------------------------------------------------------------- ***
121// ***
122//*****************************************************************************************
123
124
Note: See TracBrowser for help on using the repository browser.