summaryrefslogtreecommitdiff
path: root/graphics/circuit_macros/examples/svg/controlSVG.m4
blob: 53db5c6312aab87f0291ce9ed55f488efe95bb46 (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
.PS
# control.m4
#.PS 5i
cct_init(svg_font(sans-serif,11bp__))
  linewid = linewid*0.8
  circlerad = 0.35/2
  bw = boxwid/2
  bh = boxht/2
PID: [
  {"svg_it(r(s))" above ljust}
  arrow
S1: circle
  line right "svg_it(e(s))" above
  { arrow right ; box ht bh wid bw "svg_it(K`'svg_sub(p))"
    arrow right linewid-circlerad ; S2: circle }
  { line up linewid ; arrow right ; box ht bh wid bw "svg_it(K`'svg_sub(D) s)"
    line to (S2,Here) ; arrow to S2.n }
  { line down linewid ; arrow right
    box ht bh wid bw "svg_it(K`'svg_sub(I) /s)"
    line to (S2,Here) ; arrow to S2.s }
  arrow right from S2.e "svg_it(u(s))" above
  box "svg_it(G(s))"
  arrow right ; "svg_it(y(s))" above rjust at Here+(0,2pt__)
  line down boxht*3/2 from last arrow.c then left last arrow.c.x-S1.x
  arrow to S1.s
  "-" below rjust
  ]
  "(a) PID control" below ljust at PID.sw+(0,-5pt__)

Obs: [ {"svg_it(r)" above ljust}
  arrow
S: circle
  "-" below rjust at S.s
  arrow <- down linewid/2 from S.s
  box ht bh wid bw "svg_it(K)"
  arrow <- down linewid/2
  line right linewid "svg_it(z)" above
Obs:box wid linewid*5.5 ht boxht*5/4 "svg_it(dz/dt = (A - LC) z + B u + L y)" 
  "Observer" above ljust at Obs.sw
  arrow <- right linewid/2 from 3/4<Obs.se,Obs.ne>
  line to (Here,S)
  {"svg_it(u)" above at Here+(linewid/2,0)}
  arrow from S.e to Here+(linewid,0)
Plant: box wid boxwid*1.7 ht boxht*5/4 \
    "svg_it(dx/dt = Ax + Bu)" "svg_it(y = Cx)"
  "Plant" above ljust at Plant.sw
  arrow right from Plant.e
  "svg_it(y)" above rjust at Here+(0,2pt__)
  move to last arrow.c 
  line to (Here, 1/4<Obs.se,Obs.ne>)
  arrow to (Obs.e,Here)
  ] with .nw at PID.sw+(0,-0.5)
  "(b) Output feedback with a full-order observer" below ljust \
   at Obs.sw+(0,-5pt__)

NL: [boxwid = boxwid*1.8
  boxht = boxht*3/2
  thicklines_
  scale = scale*0.8
  circlerad = 0.3/2
R: box wid boxwid*5/4 "reference" "svg_it(R)"
   arrow right linewid*4/3 "svg_it(y`'svg_sub(c ref))" above
Gh: box wid boxwid*5/4 "\"inverse\"" "of svg_it(G)"
   arrow from Gh.s down "svg_it(y`'svg_sub(m ref))" ljust
E: circle
   arrow from E.e right "svg_it(e)" above
   box wid boxwid*5/4 "stabilizer" "svg_it(K)"
   arrow "svg_it(du)" above
D: circle
   line from Gh.e to (D,Gh.e) "svg_it(u`'svg_sub(ref))" above
   arrow to D.n
   arrow from D.e right "svg_it(u)" above
G: box "plant" "svg_it(G)"
   arrow <- from G.n up boxht/2 
   "disturbance svg_it(z)" above
   arrow right from G.e + (0,boxht/4)
   "svg_it(y`'svg_sub(c))" ljust
   arrow right from G.e + (0,-boxht/4)
   "svg_it(y`'svg_sub(m))" ljust
   move to last arrow.c
   arrow down Here.y-G.s.y+boxht*2/3 then left Here.x-E.x then to E.s
   "svg_it(-)" at Here + (-0.15,-0.1)
   arrow <- down from R.s
   "svg_it(W) control input" at Here - (0,0.1)

UL:R.nw +(-boxht/2,boxht/2)
UR:(D.e,UL) + (0.1,0)
   line dashed from UL to UR then to (UR,G.s+(0,-boxht*3/2))
   line dashed to (Gh.w,Here) "Controller" above
   line dashed to (Here,Gh.s+(0,-boxht/2))
   line dashed to (UL,Here) then to UL
  ] with .nw at Obs.sw + (0,-0.5)
  "(c) Nonlinear feedforward (for performance) and small-signal feedback
   (for stability)" wid Obs.wid+0.4 below ljust at NL.sw+(0,-5pt__)

 command "</g>" # end font
.PE