-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathArcus-3D-M2.hal
1233 lines (1046 loc) · 44.5 KB
/
Arcus-3D-M2.hal
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
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# #######################################
#
# HAL file for BeagleBone + CRAMPS cape + expansion for 8 steppers and color mixing
#
# Derived from example hm2-stepper config
#
# ########################################
# ###################################
# Core EMC/HAL Loads
# ###################################
# kinematics
loadrt lineardeltakins
# settings for delta printer
setp lineardeltakins.L [MACHINE]CF_ROD
setp lineardeltakins.R [MACHINE]DELTA_R
loadrt tp
# motion controller, get name and thread periods from ini file
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES num_aio=61 num_dio=21 kins=lineardeltakins
# THREADS
#loadrt threads name1=run-thread period1=50170000
# Gantry component for Z Axis
# load low-level drivers
loadrt hal_bb_gpio output_pins=826,914,923,925 input_pins=807,808,809,810,817,911,913
loadrt [PRUCONF](DRIVER) prucode=$(HAL_RTMOD_DIR)/[PRUCONF](PRUBIN) [PRUCONF](CONFIG) halname=hpg
#loadrt delayline names=joints_delay,extruder_delay max_delay=20,5 samples=ffff,f
# other components
loadrt pid names=pid.e0-temp,pid.hbp-temp
loadrt limit1 names=limit1.e0-heater,limit1.hbp-heater,limit1.m0,limit1.f0
loadrt scale names=scale.f0,scale.e0-fan-comp,scale.m0,scale.ew0,scale.ew1,scale.ew2,scale.ew3,scale.ew4,scale.ew5,scale.c0
loadrt not names=not.e0-temp-range,not.hbp-temp-range,not.e0-error,not.hbp-error
loadrt wcomp names=wcomp.e0-temp-range,wcomp.hbp-temp-range,wcomp.e0-temp-limit,wcomp.hbp-temp-limit
loadrt lowpass names=lowpass.e0-temp,lowpass.hbp-temp
loadrt sum2 names=sum2.e0-temp-range-neg,sum2.e0-temp-range-pos,sum2.hbp-temp-range-neg,sum2.hbp-temp-range-pos,sum2.extrude-rate-adj,sum2.m0-offset
loadrt mux2 names=mux2.ve-base-vel,mux2.jog-velocity-signed,mux2.m0-enable
loadrt logic names=estopchain personality=0x205
loadrt comp names=comp.hbp-hot,comp.hbp-info,comp.e0-active,comp.hbp-active
#loadrt watchdog num_inputs=3
loadrt estop_latch names=estop-latch
loadrt mult2 names=mult2.nozzle-discharge,mult2.filament-dia,mult2.filament-area,mult2.extrude-accel-adj,mult2.ve-jog-dtg,mult2.retract-vel-neg,mult2.extrude-rate-scaled,mult2.jog-velocity-neg
loadrt mult2 names=mult2.ew0,mult2.ew1,mult2.ew2,mult2.ew3,mult2.ew4,mult2.ew5,mult2.m0
loadrt div2 names=div2.extrude-rate,div2.retract-time,div2.ve-jog-time
loadrt mux4 names=mux4.ve
loadrt oneshot names=oneshot.retract,oneshot.ve-jog
loadrt ddt names=ddt.extruder-accel
loadrt or2 names=or2.ve-jog-enable
loadrt abs names=abs.nozzle-vel
loadrt reset names=reset.extruder-en1,reset.extruder-en2
addf hpg.capture-position servo-thread
addf bb_gpio.read servo-thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
# HBP
addf lowpass.hbp-temp servo-thread
addf pid.hbp-temp.do-pid-calcs servo-thread
addf sum2.hbp-temp-range-neg servo-thread
addf sum2.hbp-temp-range-pos servo-thread
addf wcomp.hbp-temp-range servo-thread
addf not.hbp-temp-range servo-thread
addf wcomp.hbp-temp-limit servo-thread
addf limit1.hbp-heater servo-thread
addf not.hbp-error servo-thread
addf comp.hbp-active servo-thread
# E0
addf scale.e0-fan-comp servo-thread
addf lowpass.e0-temp servo-thread
addf pid.e0-temp.do-pid-calcs servo-thread
addf limit1.e0-heater servo-thread
addf sum2.e0-temp-range-neg servo-thread
addf sum2.e0-temp-range-pos servo-thread
addf wcomp.e0-temp-range servo-thread
addf not.e0-temp-range servo-thread
addf wcomp.e0-temp-limit servo-thread
addf comp.e0-active servo-thread
# F0
addf scale.f0 servo-thread
addf limit1.f0 servo-thread
addf comp.hbp-hot servo-thread
addf comp.hbp-info servo-thread
# Estop chain
#addf watchdog.set-timeouts servo-thread
#addf watchdog.process servo-thread
addf estopchain servo-thread
addf estop-latch servo-thread
# velocity extruding
addf mult2.nozzle-discharge servo-thread
addf mult2.filament-dia servo-thread
addf mult2.filament-area servo-thread
addf div2.extrude-rate servo-thread
addf mult2.extrude-rate-scaled servo-thread
addf ddt.extruder-accel servo-thread
addf sum2.extrude-rate-adj servo-thread
addf mult2.extrude-accel-adj servo-thread
addf mult2.jog-velocity-neg servo-thread
addf mux2.jog-velocity-signed servo-thread
addf div2.ve-jog-time servo-thread
addf oneshot.ve-jog servo-thread
addf or2.ve-jog-enable servo-thread
addf mux2.ve-base-vel servo-thread
addf mult2.ve-jog-dtg servo-thread
addf mult2.retract-vel-neg servo-thread
addf reset.extruder-en1 servo-thread
addf reset.extruder-en2 servo-thread
addf div2.retract-time servo-thread
addf oneshot.retract servo-thread
addf mux4.ve servo-thread
# cooling
addf scale.c0 servo-thread
# mixing
addf mux2.m0-enable servo-thread
addf mult2.m0 servo-thread
addf sum2.m0-offset servo-thread
addf scale.m0 servo-thread
addf limit1.m0 servo-thread
addf mult2.ew0 servo-thread
addf scale.ew0 servo-thread
addf mult2.ew1 servo-thread
addf scale.ew1 servo-thread
addf mult2.ew2 servo-thread
addf scale.ew2 servo-thread
addf mult2.ew3 servo-thread
addf scale.ew3 servo-thread
addf mult2.ew4 servo-thread
addf scale.ew4 servo-thread
addf mult2.ew5 servo-thread
addf scale.ew5 servo-thread
# Update functions
addf hpg.update servo-thread
addf bb_gpio.write servo-thread
# user components
loadusr -Wn Therm hal_temp_bbb -n Therm -c 04:[EXTRUDER_0]THERMISTOR,05:[HBP]THERMISTOR -b [MACHINE]CAPE_TYPE
# Python user-mode HAL module for storing values
loadusr -Wn storage hal_storage -n storage -f storage.ini -a
# ###################################
# UI remote component definition
# ###################################
sete 1 0.1
newcomp fdm-e0 timer=100
newpin fdm-e0 fdm-e0.temp.meas float in eps=1
newpin fdm-e0 fdm-e0.temp.set float io
newpin fdm-e0 fdm-e0.temp.standby float in
newpin fdm-e0 fdm-e0.temp.limit.min float in
newpin fdm-e0 fdm-e0.temp.limit.max float in
newpin fdm-e0 fdm-e0.temp.in-range bit in
newpin fdm-e0 fdm-e0.error bit in
newpin fdm-e0 fdm-e0.active bit in
ready fdm-e0
newcomp fdm-hbp timer=100
newpin fdm-hbp fdm-hbp.temp.meas float in eps=1
newpin fdm-hbp fdm-hbp.temp.set float io
newpin fdm-hbp fdm-hbp.temp.standby float in
newpin fdm-hbp fdm-hbp.temp.limit.min float in
newpin fdm-hbp fdm-hbp.temp.limit.max float in
newpin fdm-hbp fdm-hbp.temp.in-range bit in
newpin fdm-hbp fdm-hbp.error bit in
newpin fdm-hbp fdm-hbp.active bit in
ready fdm-hbp
newcomp fdm-f0 timer=100
newpin fdm-f0 fdm-f0.set float io
ready fdm-f0
newcomp fdm-ve-jog timer=100
newpin fdm-ve-jog fdm-ve-jog.distance float io
newpin fdm-ve-jog fdm-ve-jog.velocity float io
newpin fdm-ve-jog fdm-ve-jog.direction bit io
newpin fdm-ve-jog fdm-ve-jog.trigger bit io
newpin fdm-ve-jog fdm-ve-jog.continuous bit io
newpin fdm-ve-jog fdm-ve-jog.extruder-count u32 in
newpin fdm-ve-jog fdm-ve-jog.extruder-sel s32 in
newpin fdm-ve-jog fdm-ve-jog.dtg float in
newpin fdm-ve-jog fdm-ve-jog.max-velocity float in
ready fdm-ve-jog
setp fdm-ve-jog.extruder-count 1
setp fdm-ve-jog.extruder-sel 1
newcomp fdm-ve-params timer=100
newpin fdm-ve-params fdm-ve-params.filament-dia float io
newpin fdm-ve-params fdm-ve-params.retract-vel float io
newpin fdm-ve-params fdm-ve-params.retract-len float io
newpin fdm-ve-params fdm-ve-params.extrude-scale float io
newpin fdm-ve-params fdm-ve-params.accel-adj-gain float io
ready fdm-ve-params
newcomp fdm-m0 timer=100
newpin fdm-m0 fdm-m0.weight float io
ready fdm-m0
newcomp fdm-c0 timer=100
newpin fdm-c0 fdm-c0.weight float io
ready fdm-c0
newcomp fdm-ew0 timer=100
newpin fdm-ew0 fdm-ew0.weight float io
ready fdm-ew0
newcomp fdm-ew1 timer=100
newpin fdm-ew1 fdm-ew1.weight float io
ready fdm-ew1
newcomp fdm-ew2 timer=100
newpin fdm-ew2 fdm-ew2.weight float io
ready fdm-ew2
newcomp fdm-ew3 timer=100
newpin fdm-ew3 fdm-ew3.weight float io
ready fdm-ew3
newcomp fdm-ew4 timer=100
newpin fdm-ew4 fdm-ew4.weight float io
ready fdm-ew4
newcomp fdm-ew5 timer=100
newpin fdm-ew5 fdm-ew5.weight float io
ready fdm-ew5
newcomp fdm-e0-pid timer=100
newpin fdm-e0-pid fdm-e0-pid.Pgain float io
newpin fdm-e0-pid fdm-e0-pid.Igain float io
newpin fdm-e0-pid fdm-e0-pid.Dgain float io
newpin fdm-e0-pid fdm-e0-pid.maxerrorI float io
newpin fdm-e0-pid fdm-e0-pid.bias float io
newpin fdm-e0-pid fdm-e0-pid.max float in
newpin fdm-e0-pid fdm-e0-pid.min float in
newpin fdm-e0-pid fdm-e0-pid.command float io
newpin fdm-e0-pid fdm-e0-pid.feedback float in
newpin fdm-e0-pid fdm-e0-pid.output float in
ready fdm-e0-pid
# ######################################################
# Axis-of-motion Specific Configs (not the GUI)
# ######################################################
# ################
# X [0] Axis
# ################
# axis enable chain
newsig emcmot.00.enable bit
sets emcmot.00.enable FALSE
net emcmot.00.enable <= axis.0.amp-enable-out
net emcmot.00.enable => hpg.stepgen.00.enable
# position command and feedback
net emcmot.00.pos-cmd <= axis.0.motor-pos-cmd
net emcmot.00.pos-cmd => hpg.stepgen.00.position-cmd
net motor.00.pos-fb <= hpg.stepgen.00.position-fb
net motor.00.pos-fb => axis.0.motor-pos-fb
# timing parameters
setp hpg.stepgen.00.dirsetup [AXIS_0]DIRSETUP
setp hpg.stepgen.00.dirhold [AXIS_0]DIRHOLD
setp hpg.stepgen.00.steplen [AXIS_0]STEPLEN
setp hpg.stepgen.00.stepspace [AXIS_0]STEPSPACE
setp hpg.stepgen.00.position-scale [AXIS_0]SCALE
setp hpg.stepgen.00.maxvel [AXIS_0]STEPGEN_MAX_VEL
setp hpg.stepgen.00.maxaccel [AXIS_0]STEPGEN_MAX_ACC
#setp hpg.stepgen.00.step_type 0
setp hpg.stepgen.00.steppin [AXIS_0]STEPPIN
setp hpg.stepgen.00.dirpin [AXIS_0]DIRPIN
# ################
# Y [1] Axis
# ################
# axis enable chain
newsig emcmot.01.enable bit
sets emcmot.01.enable FALSE
net emcmot.01.enable <= axis.1.amp-enable-out
net emcmot.01.enable => hpg.stepgen.01.enable
# position command and feedback
net emcmot.01.pos-cmd <= axis.1.motor-pos-cmd
net emcmot.01.pos-cmd => hpg.stepgen.01.position-cmd
net motor.01.pos-fb <= hpg.stepgen.01.position-fb
net motor.01.pos-fb => axis.1.motor-pos-fb
# timing parameters
setp hpg.stepgen.01.dirsetup [AXIS_1]DIRSETUP
setp hpg.stepgen.01.dirhold [AXIS_1]DIRHOLD
setp hpg.stepgen.01.steplen [AXIS_1]STEPLEN
setp hpg.stepgen.01.stepspace [AXIS_1]STEPSPACE
setp hpg.stepgen.01.position-scale [AXIS_1]SCALE
setp hpg.stepgen.01.maxvel [AXIS_1]STEPGEN_MAX_VEL
setp hpg.stepgen.01.maxaccel [AXIS_1]STEPGEN_MAX_ACC
#setp hpg.stepgen.01.step_type 0
setp hpg.stepgen.01.steppin [AXIS_1]STEPPIN
setp hpg.stepgen.01.dirpin [AXIS_1]DIRPIN
# ################
# Z [2] Axis
# ################
# axis enable chain
newsig emcmot.02.enable bit
sets emcmot.02.enable FALSE
net emcmot.02.enable <= axis.2.amp-enable-out
net emcmot.02.enable => hpg.stepgen.02.enable
net emcmot.02.pos-cmd <= axis.2.motor-pos-cmd
net emcmot.02.pos-cmd => hpg.stepgen.02.position-cmd
net motor.02.pos-fb <= hpg.stepgen.02.position-fb
net motor.02.pos-fb => axis.2.motor-pos-fb
# timing parameters
setp hpg.stepgen.02.dirsetup [AXIS_2]DIRSETUP
setp hpg.stepgen.02.dirhold [AXIS_2]DIRHOLD
setp hpg.stepgen.02.steplen [AXIS_2]STEPLEN
setp hpg.stepgen.02.stepspace [AXIS_2]STEPSPACE
setp hpg.stepgen.02.position-scale [AXIS_2]SCALE
setp hpg.stepgen.02.maxvel [AXIS_2]STEPGEN_MAX_VEL
setp hpg.stepgen.02.maxaccel [AXIS_2]STEPGEN_MAX_ACC
#setp hpg.stepgen.02.step_type 0
setp hpg.stepgen.02.steppin [AXIS_2]STEPPIN
setp hpg.stepgen.02.dirpin [AXIS_2]DIRPIN
# ################
# A [3] Axis (Extruder) - Velocity control
# ################
# take all the actual speeds from the axes and calculate resulting speed.
net ve.nozzle-vel <= motion.current-vel
# multiply area with speed and we get discharge (mm^3 per second)
net ve.cross-section => mult2.nozzle-discharge.in0
net ve.nozzle-vel => mult2.nozzle-discharge.in1
net ve.nozzle-discharge <= mult2.nozzle-discharge.out
# calculate filament cross section area
# PI divided by 4
setp mult2.filament-area.in0 0.78539816339
net ve.filament-dia => mult2.filament-dia.in0
net ve.filament-dia => mult2.filament-dia.in1
net ve.filament-dia-squared mult2.filament-dia.out => mult2.filament-area.in1
net ve.filament-area <= mult2.filament-area.out
# calculate extrude rate
net ve.nozzle-discharge => div2.extrude-rate.in0
net ve.filament-area => div2.extrude-rate.in1
net ve.extrude-rate <= div2.extrude-rate.out
# scale extrude rate
net ve.extrude-rate => mult2.extrude-rate-scaled.in0
net ve.extrude-scale => mult2.extrude-rate-scaled.in1
net ve.extrude-rate-scaled <= mult2.extrude-rate-scaled.out
# these are used for a small offset in velocity during acceleration (buildup pressure inside
# the nozzle because of the current speed. Take the maximum accel you've specified in .ini
# get acceleration into lincurve
net ve.extrude-rate-scaled => ddt.extruder-accel.in
net ve.extrude-accel <= ddt.extruder-accel.out
net ve.extrude-accel => mult2.extrude-accel-adj.in0
net ve.extrude-accel-adj-gain => mult2.extrude-accel-adj.in1
net ve.extrude-accel-adj <= mult2.extrude-accel-adj.out
# get adjusted speed for adding to current speed during accelleration
net ve.extrude-rate-scaled => sum2.extrude-rate-adj.in0
net ve.extrude-accel-adj => sum2.extrude-rate-adj.in1
net ve.extrude-rate-adj <= sum2.extrude-rate-adj.out
# Velocity extruding jog support
net ve.jog-velocity => mult2.jog-velocity-neg.in0
setp mult2.jog-velocity-neg.in1 -1.0
net ve.jog-velocity-neg <= mult2.jog-velocity-neg.out
net ve.jog-velocity => mux2.jog-velocity-signed.in0
net ve.jog-velocity-neg => mux2.jog-velocity-signed.in1
net ve.jog-direction => mux2.jog-velocity-signed.sel
net ve.jog-velocity-signed <= mux2.jog-velocity-signed.out
net ve.jog-distance => div2.ve-jog-time.in0
net ve.jog-velocity => div2.ve-jog-time.in1
net ve.jog-time <= div2.ve-jog-time.out
net ve.jog-trigger => oneshot.ve-jog.in
net ve.jog-time => oneshot.ve-jog.width
setp oneshot.ve-jog.rising 1
setp oneshot.ve-jog.falling 1
setp oneshot.ve-jog.retriggerable 1
net ve.jog-active <= oneshot.ve-jog.out
net ve.jog-continuous => or2.ve-jog-enable.in0
net ve.jog-active => or2.ve-jog-enable.in1
net ve.jog-enable <= or2.ve-jog-enable.out
net ve.jog-enable => mux2.ve-base-vel.sel
setp mux2.ve-base-vel.in0 0.0
net ve.jog-velocity-signed => mux2.ve-base-vel.in1
net ve.base-vel <= mux2.ve-base-vel.out
net ve.jog-time-left <= oneshot.ve-jog.time-left
net ve.jog-velocity => mult2.ve-jog-dtg.in0
net ve.jog-time-left => mult2.ve-jog-dtg.in1
net ve.jog-dtg <= mult2.ve-jog-dtg.out
# negative retract velocity
net ve.retract-vel => mult2.retract-vel-neg.in0
setp mult2.retract-vel-neg.in1 -1.0
net ve.retract-vel-neg <= mult2.retract-vel-neg.out
# disable extruder on jog
setp reset.extruder-en1.rising 1
setp reset.extruder-en1.falling 1
setp reset.extruder-en1.retriggerable 1
setp reset.extruder-en1.reset-bit 0
net ve.jog-trigger => reset.extruder-en1.trigger
net ve.extruder-en <= reset.extruder-en1.out-bit
setp reset.extruder-en2.rising 1
setp reset.extruder-en2.falling 0
setp reset.extruder-en2.retriggerable 1
setp reset.extruder-en2.reset-bit 0
net ve.jog-continuous => reset.extruder-en2.trigger
net ve.extruder-en <= reset.extruder-en2.out-bit
# now the solution of Andy Pugh for automatically retracting/priming
#00 = motion without extrusion, jog
#01 = retract
#10 = motion with extrusion
#11 = pre-charge
net ve.base-vel => mux4.ve.in0
net ve.retract-vel-neg => mux4.ve.in1
net ve.extrude-rate-adj => mux4.ve.in2
net ve.retract-vel => mux4.ve.in3
net ve.extrude-vel <= mux4.ve.out
# calculate retract time
net ve.retract-len => div2.retract-time.in0
net ve.retract-vel => div2.retract-time.in1
net ve.retract-time <= div2.retract-time.out
# We want the retract-charge to run for a fixed time:
# when sel0 set to "1" meaning motion with extrusion" the on the rising edge
# there will temporarily be also sel1 which is high, meaning a pre-charge because the
# sel combination is 11
# when sel1 set to "0" meaning decoupling motion with extrusion" then the falling edge
# will trigger a 01 combination, meaning a retract
net ve.extruder-en => oneshot.retract.in mux4.ve.sel1
net ve.retract oneshot.retract.out => mux4.ve.sel0 motion.feed-hold
# trigger a retract/unretract move when extruder is enable or disabled
setp oneshot.retract.rising 1
setp oneshot.retract.falling 1
setp oneshot.retract.retriggerable 1
#by setting the width, the automatic retract/precharge can be disabled
net ve.retract-time => oneshot.retract.width
sets ve.retract-len [EXTRUDER_0]RETRACT_LEN
sets ve.retract-vel [EXTRUDER_0]RETRACT_VEL
sets ve.filament-dia [EXTRUDER_0]FILAMENT_DIA
sets ve.extrude-accel-adj-gain 0.03
sets ve.extrude-scale 1.0
# scale individual Extruder Weights for mixing.
newsig ew0.weight float
net ew0.weight => mult2.ew0.in0
net ew0.scaler => mult2.ew0.in1
net ew0.scale <= mult2.ew0.out
net ew0.scale => scale.ew0.gain
net ve.extrude-vel => scale.ew0.in
net ew0.extrude-vel-weighted <= scale.ew0.out
net ew0.extrude-vel-weighted => hpg.stepgen.03.velocity-cmd
sets ew0.scaler 0.01
sets ew0.weight 100.0
newsig ew1.weight float
net ew1.weight => mult2.ew1.in0
net ew1.scaler => mult2.ew1.in1
net ew1.scale <= mult2.ew1.out
net ew1.scale => scale.ew1.gain
net ve.extrude-vel => scale.ew1.in
net ew1.extrude-vel-weighted <= scale.ew1.out
net ew1.extrude-vel-weighted => hpg.stepgen.04.velocity-cmd
sets ew1.scaler 0.01
sets ew1.weight 0.0
newsig ew2.weight float
net ew2.weight => mult2.ew2.in0
net ew2.scaler => mult2.ew2.in1
net ew2.scale <= mult2.ew2.out
net ew2.scale => scale.ew2.gain
net ve.extrude-vel => scale.ew2.in
net ew2.extrude-vel-weighted <= scale.ew2.out
net ew2.extrude-vel-weighted => hpg.stepgen.05.velocity-cmd
sets ew2.scaler 0.01
sets ew2.weight 0.0
newsig ew3.weight float
net ew3.weight => mult2.ew3.in0
net ew3.scaler => mult2.ew3.in1
net ew3.scale <= mult2.ew3.out
net ew3.scale => scale.ew3.gain
net ve.extrude-vel => scale.ew3.in
net ew3.extrude-vel-weighted <= scale.ew3.out
net ew3.extrude-vel-weighted => hpg.stepgen.06.velocity-cmd
sets ew3.scaler 0.01
sets ew3.weight 0.0
newsig ew4.weight float
net ew4.weight => mult2.ew4.in0
net ew4.scaler => mult2.ew4.in1
net ew4.scale <= mult2.ew4.out
net ew4.scale => scale.ew4.gain
net ve.extrude-vel => scale.ew4.in
net ew4.extrude-vel-weighted <= scale.ew4.out
net ew4.extrude-vel-weighted => hpg.stepgen.07.velocity-cmd
sets ew4.scaler 0.01
sets ew4.weight 0.0
newsig ew5.weight float
net ew5.weight => mult2.ew5.in0
net ew5.scaler => mult2.ew5.in1
net ew5.scale <= mult2.ew5.out
net ew5.scale => scale.ew5.gain
net ve.extrude-vel => scale.ew5.in
net ew5.extrude-vel-weighted <= scale.ew5.out
net ew5.extrude-vel-weighted => hpg.stepgen.08.velocity-cmd
sets ew5.scaler 0.01
sets ew5.weight 0.0
# Extruder 1
# axis enable chain
newsig emcmot.03.enable bit
#net emcmot.03.enable <= axis.3.amp-enable-out
net emcmot.03.enable => hpg.stepgen.03.enable
sets emcmot.03.enable TRUE
# position command and feedback
#net emcmot.03.pos-cmd <= axis.3.motor-pos-cmd
#net emcmot.03.pos-cmd => hpg.stepgen.03.position-cmd
#net motor.03.pos-fb <= hpg.stepgen.03.position-fb
#net motor.03.pos-fb => axis.3.motor-pos-fb
# timing parameters
setp hpg.stepgen.03.control-type 1
setp hpg.stepgen.03.dirsetup [AXIS_3]DIRSETUP
setp hpg.stepgen.03.dirhold [AXIS_3]DIRHOLD
setp hpg.stepgen.03.steplen [AXIS_3]STEPLEN
setp hpg.stepgen.03.stepspace [AXIS_3]STEPSPACE
setp hpg.stepgen.03.position-scale [AXIS_3]SCALE
setp hpg.stepgen.03.maxvel [AXIS_3]STEPGEN_MAX_VEL
setp hpg.stepgen.03.maxaccel [AXIS_3]STEPGEN_MAX_ACC
#setp hpg.stepgen.03.step_type 0
setp hpg.stepgen.03.steppin [AXIS_3]STEPPIN
setp hpg.stepgen.03.dirpin [AXIS_3]DIRPIN
# Extruder 2
# axis enable chain
newsig emcmot.04.enable bit
#net emcmot.04.enable <= axis.4.amp-enable-out
net emcmot.04.enable => hpg.stepgen.04.enable
sets emcmot.04.enable TRUE
# position command and feedback
#net emcmot.04.pos-cmd <= axis.4.motor-pos-cmd
#net emcmot.04.pos-cmd => hpg.stepgen.04.position-cmd
#net motor.04.pos-fb <= hpg.stepgen.04.position-fb
#net motor.04.pos-fb => axis.4.motor-pos-fb
# timing parameters
setp hpg.stepgen.04.control-type 1
setp hpg.stepgen.04.dirsetup [AXIS_4]DIRSETUP
setp hpg.stepgen.04.dirhold [AXIS_4]DIRHOLD
setp hpg.stepgen.04.steplen [AXIS_4]STEPLEN
setp hpg.stepgen.04.stepspace [AXIS_4]STEPSPACE
setp hpg.stepgen.04.position-scale [AXIS_4]SCALE
setp hpg.stepgen.04.maxvel [AXIS_4]STEPGEN_MAX_VEL
setp hpg.stepgen.04.maxaccel [AXIS_4]STEPGEN_MAX_ACC
#setp hpg.stepgen.04.step_type 0
setp hpg.stepgen.04.steppin [AXIS_4]STEPPIN
setp hpg.stepgen.04.dirpin [AXIS_4]DIRPIN
# Extruder 3
# axis enable chain
newsig emcmot.05.enable bit
#net emcmot.05.enable <= axis.5.amp-enable-out
net emcmot.05.enable => hpg.stepgen.05.enable
sets emcmot.05.enable TRUE
# position command and feedback
#net emcmot.05.pos-cmd <= axis.5.motor-pos-cmd
#net emcmot.05.pos-cmd => hpg.stepgen.05.position-cmd
#net motor.05.pos-fb <= hpg.stepgen.05.position-fb
#net motor.05.pos-fb => axis.5.motor-pos-fb
# timing parameters
setp hpg.stepgen.05.control-type 1
setp hpg.stepgen.05.dirsetup [AXIS_5]DIRSETUP
setp hpg.stepgen.05.dirhold [AXIS_5]DIRHOLD
setp hpg.stepgen.05.steplen [AXIS_5]STEPLEN
setp hpg.stepgen.05.stepspace [AXIS_5]STEPSPACE
setp hpg.stepgen.05.position-scale [AXIS_5]SCALE
setp hpg.stepgen.05.maxvel [AXIS_5]STEPGEN_MAX_VEL
setp hpg.stepgen.05.maxaccel [AXIS_5]STEPGEN_MAX_ACC
#setp hpg.stepgen.05.step_type 0
setp hpg.stepgen.05.steppin [AXIS_5]STEPPIN
setp hpg.stepgen.05.dirpin [AXIS_5]DIRPIN
# Extruder 4
# axis enable chain
newsig emcmot.06.enable bit
#net emcmot.06.enable <= axis.6.amp-enable-out
net emcmot.06.enable => hpg.stepgen.06.enable
sets emcmot.06.enable TRUE
# position command and feedback
#net emcmot.06.pos-cmd <= axis.6.motor-pos-cmd
#net emcmot.06.pos-cmd => hpg.stepgen.06.position-cmd
#net motor.06.pos-fb <= hpg.stepgen.06.position-fb
#net motor.06.pos-fb => axis.6.motor-pos-fb
# timing parameters
setp hpg.stepgen.06.control-type 1
setp hpg.stepgen.06.dirsetup [AXIS_6]DIRSETUP
setp hpg.stepgen.06.dirhold [AXIS_6]DIRHOLD
setp hpg.stepgen.06.steplen [AXIS_6]STEPLEN
setp hpg.stepgen.06.stepspace [AXIS_6]STEPSPACE
setp hpg.stepgen.06.position-scale [AXIS_6]SCALE
setp hpg.stepgen.06.maxvel [AXIS_6]STEPGEN_MAX_VEL
setp hpg.stepgen.06.maxaccel [AXIS_6]STEPGEN_MAX_ACC
#setp hpg.stepgen.06.step_type 0
setp hpg.stepgen.06.steppin [AXIS_6]STEPPIN
setp hpg.stepgen.06.dirpin [AXIS_6]DIRPIN
# Extruder 5
# axis enable chain
newsig emcmot.07.enable bit
#net emcmot.07.enable <= axis.7.amp-enable-out
net emcmot.07.enable => hpg.stepgen.07.enable
sets emcmot.07.enable TRUE
# position command and feedback
#net emcmot.07.pos-cmd <= axis.7.motor-pos-cmd
#net emcmot.07.pos-cmd => hpg.stepgen.07.position-cmd
#net motor.07.pos-fb <= hpg.stepgen.07.position-fb
#net motor.07.pos-fb => axis.7.motor-pos-fb
# timing parameters
setp hpg.stepgen.07.control-type 1
setp hpg.stepgen.07.dirsetup [AXIS_7]DIRSETUP
setp hpg.stepgen.07.dirhold [AXIS_7]DIRHOLD
setp hpg.stepgen.07.steplen [AXIS_7]STEPLEN
setp hpg.stepgen.07.stepspace [AXIS_7]STEPSPACE
setp hpg.stepgen.07.position-scale [AXIS_7]SCALE
setp hpg.stepgen.07.maxvel [AXIS_7]STEPGEN_MAX_VEL
setp hpg.stepgen.07.maxaccel [AXIS_7]STEPGEN_MAX_ACC
#setp hpg.stepgen.07.step_type 0
setp hpg.stepgen.07.steppin [AXIS_7]STEPPIN
setp hpg.stepgen.07.dirpin [AXIS_7]DIRPIN
# Extruder 6
# axis enable chain
newsig emcmot.08.enable bit
#net emcmot.08.enable <= axis.8.amp-enable-out
net emcmot.08.enable => hpg.stepgen.08.enable
sets emcmot.08.enable TRUE
# position command and feedback
#net emcmot.08.pos-cmd <= axis.8.motor-pos-cmd
#net emcmot.08.pos-cmd => hpg.stepgen.08.position-cmd
#net motor.08.pos-fb <= hpg.stepgen.08.position-fb
#net motor.08.pos-fb => axis.8.motor-pos-fb
# timing parameters
setp hpg.stepgen.08.control-type 1
setp hpg.stepgen.08.dirsetup [AXIS_8]DIRSETUP
setp hpg.stepgen.08.dirhold [AXIS_8]DIRHOLD
setp hpg.stepgen.08.steplen [AXIS_8]STEPLEN
setp hpg.stepgen.08.stepspace [AXIS_8]STEPSPACE
setp hpg.stepgen.08.position-scale [AXIS_8]SCALE
setp hpg.stepgen.08.maxvel [AXIS_8]STEPGEN_MAX_VEL
setp hpg.stepgen.08.maxaccel [AXIS_8]STEPGEN_MAX_ACC
#setp hpg.stepgen.08.step_type 0
setp hpg.stepgen.08.steppin [AXIS_8]STEPPIN
setp hpg.stepgen.08.dirpin [AXIS_8]DIRPIN
# ##################################################
# Standard I/O - EStop, Enables, Limit Switches, Etc
# ##################################################
# Create estop signal chain
# Drive software estop to hardware
net estop-out iocontrol.0.user-enable-out => bb_gpio.p8.out-26
setp bb_gpio.p8.out-26.invert 1
# Monitor estop input from hardware
net estop-loop bb_gpio.p8.in-17 => iocontrol.0.emc-enable-in
setp bb_gpio.p8.in-17.invert 1
# create signals for tool loading loopback
net tool-prep-loop iocontrol.0.tool-prepare => iocontrol.0.tool-prepared
net tool-change-loop iocontrol.0.tool-change => iocontrol.0.tool-changed
# Axis enable signal (active low)
net emcmot.00.enable => bb_gpio.p9.out-14
setp bb_gpio.p9.out-14.invert 1
# Machine power
# Use halui.machine.is-on instead?
net emcmot.00.enable => bb_gpio.p9.out-23
# Tie machine power signal to the CRAMPS LED
# Feel free to tie any other signal you like to the LED
net emcmot.00.enable => bb_gpio.p9.out-25
# ################
# Limit Switches
# ################
newsig limit-x-min bit
newsig limit-x-max bit
newsig limit-y-min bit
newsig limit-y-max bit
newsig limit-z-min bit
newsig limit-z-max bit
net limit-x-min <= bb_gpio.p8.in-08
net limit-x-max <= bb_gpio.p8.in-07
net limit-y-min <= bb_gpio.p8.in-10
net limit-y-max <= bb_gpio.p8.in-09
# net limit-z-min <= bb_gpio.p9.in-13
net limit-z-max <= bb_gpio.p9.in-11
# Adjust as needed for your switch polarity
setp bb_gpio.p8.in-08.invert 0
setp bb_gpio.p8.in-07.invert 0
setp bb_gpio.p8.in-10.invert 0
setp bb_gpio.p8.in-09.invert 0
setp bb_gpio.p9.in-11.invert 0
setp bb_gpio.p9.in-13.invert 0
# Uncomment if you actually have limit switches setup
# You probably want to setup homing in the INI file, as well
net limit-x-max => axis.0.home-sw-in
#net limit-x-min => axis.0.neg-lim-sw-in
#net limit-x-max => axis.0.pos-lim-sw-in
net limit-y-max => axis.1.home-sw-in
#net limit-y-min => axis.1.neg-lim-sw-in
#net limit-y-max => axis.1.pos-lim-sw-in
net limit-z-max => axis.2.home-sw-in
#net limit-z-min => axis.2.neg-lim-sw-in
#net limit-z-max => axis.2.pos-lim-sw-in
# ################
# Probe
# ################
newsig probe.enable bit
newsig probe.signal bit
net probe.signal <= bb_gpio.p9.in-13
net probe.signal => motion.probe-input
setp bb_gpio.p9.in-13.invert 0
# ##################################################
# Temperature Signals
# ##################################################
# Extruder 0 temperature control
# --------------------------------------------------------------------------
newsig e0.temp.set float
newsig e0.temp.measr float
newsig e0.temp.meas float
newsig e0.temp.range.pos_error float
newsig e0.temp.range.neg_error float
newsig e0.temp.range.max float
newsig e0.temp.range.min float
newsig e0.temp.in-range bit
newsig e0.temp.pwm float
newsig e0.temp.pwm.max float
newsig e0.temp.limit.min float
newsig e0.temp.limit.max float
newsig e0.temp.standby float
newsig e0.temp.in-limit bit
newsig e0.therm-ok bit
newsig e0.no-error bit
newsig e0.error bit
newsig e0.active bit
net e0.temp.measr => lowpass.e0-temp.in
net e0.temp.meas <= lowpass.e0-temp.out
setp lowpass.e0-temp.gain 0.003
# PID
net emcmot.00.enable => pid.e0-temp.enable
net e0.temp.meas => pid.e0-temp.feedback
net e0.temp.set => pid.e0-temp.command
net e0.heater <= pid.e0-temp.output
net e0.heater => limit1.e0-heater.in
net e0.heaterl <= limit1.e0-heater.out
# Limit heater PWM to positive values
# PWM mimics hm2 implementation, which generates output for negative values
setp limit1.e0-heater.min 0.0
setp limit1.e0-heater.max 1.0
net e0.temp.pwm.max => pid.e0-temp.maxoutput
sets e0.temp.pwm.max [EXTRUDER_0]PWM_MAX
# Temperature checking
net e0.temp.set => sum2.e0-temp-range-pos.in0
net e0.temp.range.pos_error => sum2.e0-temp-range-pos.in1
net e0.temp.set => sum2.e0-temp-range-neg.in0
net e0.temp.range.neg_error => sum2.e0-temp-range-neg.in1
net e0.temp.range.min sum2.e0-temp-range-neg.out => wcomp.e0-temp-range.min
net e0.temp.range.max sum2.e0-temp-range-pos.out => wcomp.e0-temp-range.max
net e0.temp.meas => wcomp.e0-temp-range.in
#the output of wcomp.e0-temp-range will say if measured temperature is in range of set value
#this needs to be coupled to a digital input for M66 readout
net e0.temp.in-range <= wcomp.e0-temp-range.out
# limit the output temperature to prevent damage when thermistor is broken/removed
net e0.temp.limit.min => wcomp.e0-temp-limit.min
net e0.temp.limit.max => wcomp.e0-temp-limit.max
net e0.temp.meas => wcomp.e0-temp-limit.in
net e0.temp.in-limit <= wcomp.e0-temp-limit.out
# PID control linking
net e0.pid.Pgain fdm-e0-pid.Pgain <=> pid.e0-temp.Pgain
net e0.pid.Igain fdm-e0-pid.Igain <=> pid.e0-temp.Igain
net e0.pid.Dgain fdm-e0-pid.Dgain <=> pid.e0-temp.Dgain
net e0.pid.maxerrorI fdm-e0-pid.maxerrorI <=> pid.e0-temp.maxerrorI
#net e0.pid.bias fdm-e0-pid.bias <=> pid.e0-temp.bias
net e0.temp.limit.min => fdm-e0-pid.min
net e0.temp.limit.max => fdm-e0-pid.max
net e0.temp.set <=> fdm-e0-pid.command
net e0.temp.meas => fdm-e0-pid.feedback
net e0.heater => fdm-e0-pid.output
# PID parameters
#setp pid.e0-temp.FF0 0
#setp pid.e0-temp.FF1 0
#setp pid.e0-temp.FF2 0
sets e0.pid.Pgain [EXTRUDER_0]PID_PGAIN
sets e0.pid.Igain [EXTRUDER_0]PID_IGAIN
sets e0.pid.Dgain [EXTRUDER_0]PID_DGAIN
sets e0.pid.maxerrorI [EXTRUDER_0]PID_MAXERRORI
#sets e0.pid.bias [EXTRUDER_0]PID_BIAS
# Parameters
sets e0.temp.range.pos_error [EXTRUDER_0]TEMP_RANGE_POS_ERROR
sets e0.temp.range.neg_error [EXTRUDER_0]TEMP_RANGE_NEG_ERROR
sets e0.temp.limit.min [EXTRUDER_0]TEMP_LIMIT_MIN
sets e0.temp.limit.max [EXTRUDER_0]TEMP_LIMIT_MAX
sets e0.temp.standby [EXTRUDER_0]TEMP_STANDBY
# Fan compensation
net f0.pwm => scale.e0-fan-comp.in
net e0.pid.bias pid.e0-temp.bias <= scale.e0-fan-comp.out
setp scale.e0-fan-comp.gain [EXTRUDER_0]FAN_BIAS
# Bed temperature control
# ----------------------------------------------------------------------------
newsig hbp.temp.set float
newsig hbp.temp.measr float
newsig hbp.temp.meas float
newsig hbp.temp.range.pos_error float
newsig hbp.temp.range.neg_error float
newsig hbp.temp.range.max float
newsig hbp.temp.range.min float
newsig hbp.temp.in-range bit
newsig hbp.temp.pwm float
newsig hbp.temp.pwm.max float
newsig hbp.temp.limit.min float
newsig hbp.temp.limit.max float
newsig hbp.temp.standby float
newsig hbp.temp.in-limit bit
newsig hbp.therm-ok bit
newsig hbp.no-error bit
newsig hbp.error bit
newsig hbp.active bit
net hbp.temp.measr => lowpass.hbp-temp.in
net hbp.temp.meas <= lowpass.hbp-temp.out
setp lowpass.hbp-temp.gain 0.003
# PID
net emcmot.00.enable => pid.hbp-temp.enable
net hbp.temp.meas => pid.hbp-temp.feedback
net hbp.temp.set => pid.hbp-temp.command
net hbp.heater <= pid.hbp-temp.output
net hbp.heater => limit1.hbp-heater.in
net hbp.heaterl <= limit1.hbp-heater.out
# Limit heater PWM to positive values
# PWM mimics hm2 implementation, which generates output for negative values
setp limit1.hbp-heater.min 0
setp limit1.hbp-heater.max [HBP]PWM_MAX
net hbp.temp.pwm.max => pid.hbp-temp.maxoutput
sets hbp.temp.pwm.max [HBP]PWM_MAX
# Temperature checking
net hbp.temp.set => sum2.hbp-temp-range-pos.in0
net hbp.temp.range.pos_error => sum2.hbp-temp-range-pos.in1
net hbp.temp.set => sum2.hbp-temp-range-neg.in0
net hbp.temp.range.neg_error => sum2.hbp-temp-range-neg.in1
net hbp.temp.range.min sum2.hbp-temp-range-neg.out => wcomp.hbp-temp-range.min
net hbp.temp.range.max sum2.hbp-temp-range-pos.out => wcomp.hbp-temp-range.max
net hbp.temp.meas => wcomp.hbp-temp-range.in
#the output of wcomp.e0-temp-range will say if measured temperature is in range of set value
#this needs to be coupled to a digital input for M66 readout
net hbp.temp.in-range <= wcomp.hbp-temp-range.out
# limit the output temperature to prevent damage when thermistor is broken/removed
net hbp.temp.limit.min => wcomp.hbp-temp-limit.min
net hbp.temp.limit.max => wcomp.hbp-temp-limit.max
net hbp.temp.meas => wcomp.hbp-temp-limit.in
net hbp.temp.in-limit <= wcomp.hbp-temp-limit.out
setp comp.hbp-active.in0 0.0001
setp comp.hbp-active.hyst 0.0
net hbp.heaterl => comp.hbp-active.in1
net hbp.active <= comp.hbp-active.out
# PID parameters
setp pid.hbp-temp.Pgain [HBP]PID_PGAIN
setp pid.hbp-temp.Igain [HBP]PID_IGAIN
setp pid.hbp-temp.Dgain [HBP]PID_DGAIN
setp pid.hbp-temp.maxerrorI [HBP]PID_MAXERRORI
setp pid.hbp-temp.bias [HBP]PID_BIAS
# Parameters
sets hbp.temp.range.pos_error [HBP]TEMP_RANGE_POS_ERROR
sets hbp.temp.range.neg_error [HBP]TEMP_RANGE_NEG_ERROR
sets hbp.temp.limit.min [HBP]TEMP_LIMIT_MIN
sets hbp.temp.limit.max [HBP]TEMP_LIMIT_MAX
sets hbp.temp.standby [HBP]TEMP_STANDBY
# ##################################################
# Fans
# ##################################################
# F0
# ---------------------------
# ---------------------------
newsig f0.set float
#setp scale.f0.gain 0.00392156862745
setp scale.f0.gain 0.00196
# 12v pump on a 24v system. Limit pwm to 60%
setp limit1.f0.min 0.0
setp limit1.f0.max 0.6
net f0.set => scale.f0.in
net f0.pwm_limit <= scale.f0.out
net f0.pwm_limit => limit1.f0.in
net f0.pwm <= limit1.f0.out
# Cooling
# ---------------------------
newsig c0.set float
setp scale.c0.gain 0.01
net c0.weight => scale.c0.in
net c0.pwm <= scale.c0.out
sets c0.set 50.0
# ##################################################
# Mixer
# ##################################################