Rev 1655 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1655 | giacomo | 1 | #include <math.h> |
2 | |||
3 | #include <modules/hartport.h> |
||
4 | #include <kernel/kern.h> |
||
5 | #include <kernel/func.h> |
||
6 | #include <ll/i386/x-dos.h> |
||
7 | |||
8 | #include "drivers/pclab.h" |
||
9 | |||
10 | #include "const.h" |
||
11 | |||
12 | float vmax = 0.0, vmin = 0.0, vmaxth = 0.0, vminth = 0.0; |
||
13 | |||
14 | int da_motor(float v) |
||
15 | { |
||
16 | |||
17 | da_conv( 2.5 , 2 ); |
||
18 | da_conv( v + 2.5 , 1 ); |
||
19 | |||
20 | return(0); |
||
21 | |||
22 | } |
||
23 | |||
24 | float v2x(float v) |
||
25 | { |
||
26 | float x; |
||
27 | |||
28 | x= LUNGH * (v-(vmax+vmin)/2 ) / (vmax-vmin); |
||
29 | |||
30 | return x; |
||
31 | |||
32 | } |
||
33 | |||
34 | float v2theta(float v) |
||
35 | { |
||
36 | float theta; |
||
37 | |||
38 | theta=2.0*(THETAMAX/FCA) * (v-(vmaxth+vminth)/2 ) / (vmaxth-vminth); |
||
39 | |||
40 | return theta; |
||
41 | |||
42 | } |
||
43 | |||
44 | float bass1(float u) |
||
45 | { |
||
46 | float y; |
||
47 | static float oldy=0; |
||
48 | |||
49 | y=(oldy + prm.WCUT * DEADSECX(PERIOD_CARRELLO) *u)/(1+ prm.WCUT * DEADSECX(PERIOD_CARRELLO)); |
||
50 | oldy=y; |
||
51 | |||
52 | return y; |
||
53 | |||
54 | } |
||
55 | |||
56 | float bass2(float u) |
||
57 | { |
||
58 | float y; |
||
59 | static float oldy=0; |
||
60 | |||
61 | y=(oldy + prm.WCUT1 * DEADSECX(PERIOD_CARRELLO) *u)/(1+ prm.WCUT1 * DEADSECX(PERIOD_CARRELLO)); |
||
62 | oldy=y; |
||
63 | |||
64 | return y; |
||
65 | |||
66 | } |
||
67 | |||
68 | float bass3(float u) |
||
69 | { |
||
70 | float y; |
||
71 | static float oldy=0; |
||
72 | |||
73 | y=(oldy + prm.WCUT * DEADSECTH(PERIOD_CARRELLO) *u)/(1+ prm.WCUT * DEADSECTH(PERIOD_CARRELLO)); |
||
74 | oldy=y; |
||
75 | |||
76 | return y; |
||
77 | |||
78 | } |
||
79 | |||
80 | float bass4(float u) |
||
81 | { |
||
82 | float y; |
||
83 | static float oldy=0; |
||
84 | |||
85 | y=(oldy + prm.WCUT1 * DEADSECTH(PERIOD_CARRELLO) *u)/(1+ prm.WCUT1 * DEADSECTH(PERIOD_CARRELLO)); |
||
86 | oldy=y; |
||
87 | |||
88 | return y; |
||
89 | |||
90 | } |
||
91 | |||
92 | float dx(float u) |
||
93 | { |
||
94 | static float oldu=0; |
||
95 | float y; |
||
96 | |||
97 | y=(u-oldu)/DEADSECX(PERIOD_CARRELLO); |
||
98 | oldu=u; |
||
99 | |||
100 | return y; |
||
101 | |||
102 | } |
||
103 | |||
104 | float dth(float u) |
||
105 | { |
||
106 | static float oldu=0; |
||
107 | float y; |
||
108 | |||
109 | y=(u-oldu)/DEADSECTH(PERIOD_CARRELLO); |
||
110 | oldu=u; |
||
111 | |||
112 | return y; |
||
113 | |||
114 | } |
||
115 | |||
116 | TASK carrello(void) |
||
117 | { |
||
118 | float y[2]={0,0}, yp[2]={0,0}; |
||
119 | PORT px, pth; |
||
120 | |||
121 | float th_input = 0.0,arr_th_input[AVR],th_eff,av_th_input; |
||
122 | float x_input = 0.0,arr_x_input[AVR],x_eff,av_x_input; |
||
123 | |||
124 | int flag_th=1,flag_x=1,index_th=0,index_x=0; |
||
125 | |||
126 | int i; |
||
127 | float offset,vout,vout_total; |
||
128 | |||
129 | px = port_create("porta1",sizeof(float),1,STICK,WRITE); |
||
130 | pth = port_create("porta2",sizeof(float),1,STICK,WRITE); |
||
131 | |||
132 | while (1) { |
||
133 | |||
134 | task_nopreempt(); |
||
135 | th_input=ad_conv(10); |
||
136 | task_preempt(); |
||
137 | |||
138 | if(flag_th==1) { |
||
139 | for(i=0; i<AVR;++i) arr_th_input[i] = th_input; |
||
140 | flag_th=0; |
||
141 | } |
||
142 | av_th_input=0; |
||
143 | for(i=0;i<AVR;++i) av_th_input += arr_th_input[i]; |
||
144 | av_th_input /= AVR ; |
||
145 | |||
146 | if(fabs(th_input-av_th_input)>=prm.NOISE) th_input=av_th_input; |
||
147 | |||
148 | arr_th_input[index_th]=th_input; |
||
149 | index_th = (index_th+1) % AVR ; |
||
150 | |||
151 | th_eff = v2theta(th_input); |
||
152 | y[1] = bass3(th_eff); |
||
153 | yp[1] = bass4(dth(y[1])); |
||
154 | |||
155 | task_nopreempt(); |
||
156 | x_input=ad_conv(11); |
||
157 | task_preempt(); |
||
158 | |||
159 | if(flag_x==1) { |
||
160 | for(i=0; i<AVR;++i) arr_x_input[i] = x_input; |
||
161 | flag_x=0; |
||
162 | } |
||
163 | av_x_input=0; |
||
164 | for(i=0;i<AVR;++i) av_x_input += arr_x_input[i]; |
||
165 | av_x_input /= AVR; |
||
166 | if(fabs(x_input-av_x_input)>=prm.NOISE) x_input = av_x_input; |
||
167 | |||
168 | arr_x_input[index_x] = x_input; |
||
169 | index_x = (index_x+1) % AVR ; |
||
170 | |||
171 | x_eff = v2x(x_input); |
||
172 | y[0] = bass1(x_eff); |
||
173 | yp[0] = bass2(dx(y[0])); |
||
174 | |||
175 | vout = prm.COST * (prm.GUAD[0] * (y[0]-v2x((vmax+vmin)/2)) + prm.GUAD[1] * th_eff\ |
||
176 | + prm.GUAD[2] * yp[0] + prm.GUAD[3] * yp[1]); |
||
177 | |||
178 | if(vout >= 0) offset=prm.OFFSVAL; |
||
179 | else offset=-prm.OFFSVAL; |
||
180 | |||
181 | vout_total = vout + offset; |
||
182 | |||
183 | if(vout_total >= VDANG ) vout_total = VDANG ; |
||
184 | if(vout_total <= -VDANG ) vout_total = -VDANG ; |
||
185 | |||
186 | da_motor(vout_total); |
||
187 | |||
188 | port_send(px, &y[0], NON_BLOCK); |
||
189 | port_send(pth, &y[1], NON_BLOCK); |
||
190 | |||
191 | task_endcycle(); |
||
192 | |||
193 | } |
||
194 | |||
195 | port_delete(px); |
||
196 | port_delete(pth); |
||
197 | |||
198 | } /* FINE DEL TASK CARRELLO */ |