-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathdocs.html
363 lines (332 loc) · 21.5 KB
/
docs.html
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>allwincnc - Docs - Open-source CNC software for the Allwinner H3 based SBCs</title>
<link rel="stylesheet" href="img/main.css">
<link rel="stylesheet" href="img/code.css">
</head>
<body>
<script type="text/javascript" src="img/menu.js"></script>
<div class="page">
<div class="info-block">
You will need just one detailed document to use this project -
the document about ARISC driver.
<strong>ARISC</strong> driver - it's a component of the <strong>LinuxCNC</strong> software.
This component allows the software to talk with outside world
using the build-in <strong>Allwinner RISC</strong> CPU core (ARISC).
The driver contains 3 modules - arisc.gpio, arisc.pwm and <strong>arisc.encoder</strong>.
arisc.gpio don't uses the ARISC core, other modules - uses the ARISC core.
<strong>arisc.encoder</strong> module is WIP.
</div>
<h2>Driver startup parameters</h2>
<ul>
<li>
<span class="name">out</span> - a list of output GPIO pins (comma separated, no spaces).
You <span class="yes">can</span> use a pin names only.
Examples:
<code class="hal"># IT'S OK
loadrt arisc out=PA12,PA11,PA6,PA13</code>
</li>
<li>
<span class="name">in</span> - a list of input GPIO pins (comma separated, no spaces).
You <span class="yes">can</span> use a pin names only.
Examples:
<code class="hal"># IT'S OK
loadrt arisc in=PA12,PA11,PA6,PA13</code>
</li>
<li>
<span class="name">pwm</span> - PWM channel control types (comma separated, no spaces).
You <span class="yes">can</span> use 3 types of control:
<strong>f</strong> - by frequency, <strong>v</strong> - by speed, <strong>p</strong> - by position.
Number of chars (p/v/f) means number of output channels.
Examples:
<code class="hal"># 4 channels (0,1,2,3) with control by position
loadrt arisc pwm=p,p,p,p
# 3 channels, controlled by position (0), speed (1) and frequency (2)
loadrt arisc pwm=p,v,f</code>
</li>
<li>
<span class="name">encoders</span> - number of encoder channels. Up to 8.
Examples:
<code class="hal"># IT'S OK
loadrt arisc encoders=3</code>
</li>
</ul>
<p>
Examples:
<code class="hal"># 2 input pins, 1 output pin, 4 PWM channels, 3 encoder channels
loadrt arisc in=PA12,PA11 out=PD14 pwm=p,p,p,f encoders=3
# no input pins, 3 output pins, 3 PWM channels, no encoder channels
loadrt arisc out=PA12,PA11,PD14 pwm=p,p,p
</code>
</p>
<br />
<h2><span class="name">arisc.gpio</span> HAL pins</h2>
<table class="pins">
<tr><td class="name">arisc.gpio.<span class="note">X</span>-out</td><td>(bit, out)</td>
<td>output pin.</td></tr>
<tr><td class="name">arisc.gpio.<span class="note">X</span>-out-not</td><td>(bit, out)</td>
<td>output pin, inverted.</td></tr>
<tr><td class="name">arisc.gpio.<span class="note">X</span>-in</td><td>(bit, in)</td>
<td>input pin.</td></tr>
<tr><td class="name">arisc.gpio.<span class="note">X</span>-in-out</td><td>(bit, in)</td>
<td>input pin, inverted.</td></tr>
<tr><td class="name">arisc.gpio.<span class="note">X</span>-pull</td><td>(s32, in)</td>
<td>pin pull down (-1), pull up (1) or without (0).</td></tr>
<tr><td class="name">arisc.gpio.<span class="note">X</span>-multi-drive-level</td><td>(u32, in)</td>
<td>pin multi-drive (open drain) level (0..3).</td></tr>
</table>
<p>
Replace the <span class="note">X</span> chars with <strong>GPIO</strong> pin name,
listed in the output/input list.
Examples:
<code class="hal">loadrt arisc out=PA12,PA11,PA6,PA13 in=PA14,PA1,PA0
# --- IT'S OK ---
net xstep => arisc.gpio.PA12-out
net xdir => arisc.gpio.PA11-out-not
net ystep => arisc.gpio.PA6-out
net ydir => arisc.gpio.PA13-out
net home-x <= arisc.gpio.PA14-in
net home-y <= arisc.gpio.PA1-in-not
net home-z <= arisc.gpio.PA0-in
setp arisc.gpio.PA12-pull -1 # pull down PA12 to the GND
setp arisc.gpio.PA12-multi-drive-level 1
# --- ERROR ---
net xstep => arisc.gpio.PA36-out # there's no such pin
net xdir => arisc.gpio.3-out # there's no such pin
net ystep => arisc.gpio.PA14-in # there's no such pin
net ydir => arisc.gpio.A13-out # there's no such pin
net home-x <= arisc.gpio.PA12-out # there's no such pin
net home-y <= arisc.gpio.57-in # there's no such pin
net home-z <= arisc.gpio.P0-out # there's no such pin</code>
</p>
<br />
<h2><span class="name">arisc.gpio</span> HAL functions</h2>
<table class="pins">
<tr><td class="name">arisc.gpio.read</td><td>(float:no)</td>
<td>updates all input pins state.</td></tr>
<tr><td class="name">arisc.gpio.write</td><td>(float:no)</td>
<td>updates all output pins state.</td></tr>
</table>
<p>
Examples:
<code class="hal">loadrt motion base_period_nsec=50000 servo_period_nsec=1000000 num_joints=1
loadrt arisc out=PA12,PA11 in=PA6,PA13
addf arisc.gpio.read base-thread # read all used pins state
addf arisc.gpio.write base-thread # write all used pins state</code>
</p>
<br />
<h2><span class="name">arisc.pwm</span> HAL pins</h2>
<table class="pins">
<tr><td class="name">arisc.pwm.<span class="note">N</span>.enable</td><td>(bit, in)</td>
<td>channel ON/OFF (1/0). Default is 0.</td></tr>
<tr><td colspan="3">· · ·</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.pwm-port</td><td>(u32, in)</td>
<td>GPIO port number (0..7) for PWM signal.</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.pwm-pin</td><td>(u32, in)</td>
<td>GPIO pin number (0..23) for the PWM signal.</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.pwm-invert</td><td>(bit, in)</td>
<td>invert the PWM signal? (0/1). Default is 0.</td></tr>
<tr><td colspan="3">· · ·</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.dir-port</td><td>(u32, in)</td>
<td>GPIO port number (0..7) for PWM signal.</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.dir-pin</td><td>(u32, in)</td>
<td>GPIO pin number (0..23) for the DIR signal.</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.dir-invert</td><td>(bit, in)</td>
<td>invert the DIR signal? (0/1). Default is 0.</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.dir-hold</td><td>(u32, io)</td>
<td>minimal pause (in nanoseconds) between last PWM pulse and a DIR signal change.
Default is 50000 ns.</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.dir-setup</td><td>(u32, io)</td>
<td>minimal pause (in nanoseconds) between DIR signal change and next PWM pulse.
Default is 50000 ns.</td></tr>
<tr><td colspan="3">· · ·</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.dc-cmd</td><td>(float, in)</td>
<td>desired duty cycle (-1..1). 1 = 100%. Default is 0.</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.dc-min</td><td>(float, io)</td>
<td>minimum duty cycle.
If <span class="note">dc-fb</span> < <span class="note">dc-min</span>,
real duty cycle will be set to <span class="note">dc-min</span>. Default is -1.</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.dc-max</td><td>(float, io)</td>
<td>maximum duty cycle.
If <span class="note">dc-fb</span> > <span class="note">dc-max</span>,
real duty cycle will be set to <span class="note">dc-max</span>. Default is 1.</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.dc-max-t</td><td>(u32, io)</td>
<td>maximum time (in nanoseconds) of a PWM pulse duration.
If value is 0, value is ignored. Default is 0.</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.dc-offset</td><td>(float, io)</td>
<td>simple offset for the desired duty cycle value. Default is 0.</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.dc-scale</td><td>(float, io)</td>
<td>simple scale multiplier for the desired duty cycle value. Default is 1.</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.dc-fb</td><td>(float, out)</td>
<td>real duty cycle feedback
= <span class="note">dc-cmd</span> / <span class="note">dc-scale</span>
+ <span class="note">dc-offset</span>. Then value will be limited by the
<span class="note">dc-min</span>, <span class="note">dc-max</span> and
<span class="note">dc-max-t</span> values.</td></tr>
<tr><td colspan="3">· · ·</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.freq-cmd</td><td>(float, io)</td>
<td>desired PWM frequency (in Hz). Default is 0.</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.freq-min</td><td>(float, io)</td>
<td>minimum PWM frequency (in Hz).
If <span class="note">freq-fb</span> < <span class="note">freq-min</span>,
real frequency will be set to 0. Default is 50 Hz.</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.freq-max</td><td>(float, io)</td>
<td>maximum PWM frequency (in Hz).
If <span class="note">freq-fb</span> > <span class="note">freq-max</span>,
real frequency will be set to <span class="note">freq-max</span>.
Default is 500000 Hz.</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.freq-fb</td><td>(float, out)</td>
<td>real PWM frequency feedback.</td></tr>
<tr><td colspan="3">· · ·</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.vel-cmd</td><td>(float, in)</td>
<td>desired velocity (in movement units/second). Default is 0.</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.vel-scale</td><td>(float, in)</td>
<td>simple scale multiplier for the desired velocity value. Default is 1.</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.vel-fb</td><td>(float, out)</td>
<td>real velocity feedback (in movement units/second).</td></tr>
<tr><td colspan="3">· · ·</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.pos-cmd</td><td>(float, in)</td>
<td>desired position (in movement units). Default is 0.</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.pos-scale</td><td>(float, in)</td>
<td>number of PWM pulses per movement unit. Default is 1.</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.pos-fb</td><td>(float, out)</td>
<td>real position feedback in movement units.</td></tr>
<tr><td colspan="3">· · ·</td></tr>
<tr><td class="name">arisc.pwm.<span class="note">N</span>.counts</td><td>(s32, out)</td>
<td>real position feedback in PWM pulses.</td></tr>
</table>
<p>
Replace <span class="note">N</span> with channel number (0..15).
Examples:
<code class="hal">loadrt motion base_period_nsec=50000 servo_period_nsec=1000000 num_joints=1
loadrt arisc pwm=p
setp arisc.pwm.0.pos-scale [AXIS_0]SCALE
setp arisc.pwm.0.pwm-port 0 # 0=PA
setp arisc.pwm.0.pwm-pin 12 # PA12
setp arisc.pwm.0.pwm-invert 0
setp arisc.pwm.0.dir-port 0 # 0=PA
setp arisc.pwm.0.dir-pin 11 # PA11
setp arisc.pwm.0.dir-invert 0
net x-enable arisc.pwm.0.enable joint.0.amp-enable-out
net x-pos-cmd arisc.pwm.0.pos-cmd joint.0.motor-pos-cmd</code>
</p>
<br />
<h2><span class="name">arisc.pwm</span> HAL functions</h2>
<table class="pins">
<tr><td class="name">arisc.pwm.read</td><td>(float:yes)</td>
<td>updates all feedback pin values for the all channels.</td></tr>
<tr><td class="name">arisc.pwm.write</td><td>(float:yes)</td>
<td>updates real frequency values for the all channels.</td></tr>
</table>
<p>
Examples:
<code class="hal">loadrt motion base_period_nsec=50000 servo_period_nsec=1000000 num_joints=1
loadrt arisc pwm=p
addf arisc.pwm.read servo-thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
addf arisc.pwm.write servo-thread</code>
</p>
<br />
<h2><span class="name">arisc.encoder</span> HAL pins</h2>
<table class="pins">
<tr><td class="name">arisc.encoder.<span class="note">N</span>.enable</td><td>(bit, in)</td>
<td>channel ON/OFF (1/0). Default is 0.</td></tr>
<tr><td colspan="3">· · ·</td></tr>
<tr><td class="name">arisc.encoder.<span class="note">N</span>.counter-mode</td><td>(bit, io)</td>
<td>Enables counter mode.
When 1, the counter counts each rising edge of the phase-A input, ignoring the value on phase-B.
This is useful for counting the output of a single channel (non-quadrature) sensor.
When 0, it counts in quadrature mode.
Default is 0.</td></tr>
<tr><td colspan="3">· · ·</td></tr>
<tr><td class="name">arisc.encoder.<span class="note">N</span>.x4-mode</td><td>(bit, io)</td>
<td>Enables times-4 mode.
When 1, the counter counts each edge of the quadrature waveform (four counts per full cycle).
When 0, it only counts once per full cycle.
In <span class="name">counter-mode</span>, this parameter is ignored.
Default is 1.</td></tr>
<tr><td colspan="3">· · ·</td></tr>
<tr><td class="name">arisc.encoder.<span class="note">N</span>.index-enable</td><td>(bit, io)</td>
<td>When 1, counts and position are reset to zero on the next rising edge of INDEX (Z).
At the same time, <span class="name">index-enable</span> is reset to zero
to indicate that the rising edge has occurred.
Default is 0.</td></tr>
<tr><td colspan="3">· · ·</td></tr>
<tr><td class="name">arisc.encoder.<span class="note">N</span>.reset</td><td>(bit, in)</td>
<td>When 1, <span class="name">counts</span> and <span class="name">pos</span> are reset to zero immediately.
Default is 0.</td></tr>
<tr><td colspan="3">· · ·</td></tr>
<tr><td class="name">arisc.encoder.<span class="note">N</span>.A-port</td><td>(u32, in)</td>
<td>GPIO port number (0..7) for the phase A signal.</td></tr>
<tr><td class="name">arisc.encoder.<span class="note">N</span>.A-pin</td><td>(u32, in)</td>
<td>GPIO pin number (0..23) for the phase A signal.</td></tr>
<tr><td class="name">arisc.encoder.<span class="note">N</span>.A-invert</td><td>(bit, in)</td>
<td>invert phase A signal? (0/1). Default is 0.</td></tr>
<tr><td class="name">arisc.encoder.<span class="note">N</span>.A-all-edges</td><td>(bit, in)</td>
<td>trigger phase A signal on any voltage edge? (0/1)
This HAL pin uses only when <span class="name">counter-mode</span> is enabled.
Default is 0.</td></tr>
<tr><td colspan="3">· · ·</td></tr>
<tr><td class="name">arisc.encoder.<span class="note">N</span>.B-port</td><td>(u32, in)</td>
<td>GPIO port number (0..7) for the phase B signal.</td></tr>
<tr><td class="name">arisc.encoder.<span class="note">N</span>.B-pin</td><td>(u32, in)</td>
<td>GPIO pin number (0..23) for the phase B signal.</td></tr>
<tr><td colspan="3">· · ·</td></tr>
<tr><td class="name">arisc.encoder.<span class="note">N</span>.Z-port</td><td>(u32, in)</td>
<td>GPIO port number (0..7) for the INDEX signal.</td></tr>
<tr><td class="name">arisc.encoder.<span class="note">N</span>.Z-pin</td><td>(u32, in)</td>
<td>GPIO pin number (0..23) for the INDEX signal.</td></tr>
<tr><td class="name">arisc.encoder.<span class="note">N</span>.Z-invert</td><td>(bit, in)</td>
<td>invert INDEX signal? (0/1). Default is 0.</td></tr>
<tr><td class="name">arisc.encoder.<span class="note">N</span>.Z-all-edges</td><td>(bit, in)</td>
<td>trigger INDEX signal on any voltage edge? (0/1)
Default is 0.</td></tr>
<tr><td colspan="3">· · ·</td></tr>
<tr><td class="name">arisc.encoder.<span class="note">N</span>.pos-scale</td><td>(float, in)</td>
<td>number of encoder pulses per movement unit. Default is 1.</td></tr>
<tr><td class="name">arisc.encoder.<span class="note">N</span>.pos</td><td>(float, out)</td>
<td>real position feedback in movement units.</td></tr>
<tr><td class="name">arisc.encoder.<span class="note">N</span>.vel</td><td>(float, out)</td>
<td>real velocity feedback (in movement units/second).</td></tr>
<tr><td class="name">arisc.encoder.<span class="note">N</span>.vel-rpm</td><td>(float, out)</td>
<td>real velocity feedback (in revolutions/minute).</td></tr>
<tr><td class="name">arisc.encoder.<span class="note">N</span>.counts</td><td>(s32, out)</td>
<td>real position feedback in encoder pulses.</td></tr>
</table>
<p>
Replace <span class="note">N</span> with channel number (0..7).
Examples:
<code class="hal">loadrt arisc encoders=1
setp arisc.encoder.0.pos-scale [AXIS_0]SCALE
setp arisc.encoder.0.A-port 0 # 0=PA
setp arisc.encoder.0.A-pin 12 # PA12
setp arisc.encoder.0.B-port 0 # 0=PA
setp arisc.encoder.0.B-pin 11 # PA11
setp arisc.encoder.0.Z-port 0 # 0=PA
setp arisc.encoder.0.Z-pin 6 # PA6
net x-enc-en arisc.encoder.0.enable joint.0.amp-enable-out
net x-pos-fb arisc.encoder.0.pos joint.0.motor-pos-fb</code>
</p>
<br />
<h2><span class="name">arisc.encoder</span> HAL functions</h2>
<table class="pins">
<tr><td class="name">arisc.encoder.read</td><td>(float:yes)</td>
<td>updates all feedback pin values for the all channels.</td></tr>
</table>
<p>
Examples:
<code class="hal">loadrt motion base_period_nsec=50000 servo_period_nsec=1000000 num_joints=1
loadrt arisc encoders=1
addf arisc.encoder.read servo-thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread</code>
</p>
</div>
<script type="text/javascript" src="img/footer.js"></script>
</body>
<script type="text/javascript" src="img/main.js"></script>
<script type="text/javascript" src="img/code.js"></script>
</html>