mirror of
https://github.com/sinseman44/PyCNC.git
synced 2026-10-15 07:56:59 +00:00
utils for PID control
This commit is contained in:
1 parent
87df112541
commit
df7eba664f
2 files changed
+254
No files matched your search
Executable
+107
@@ -0,0 +1,107 @@
|
||||
#!/usr/bin/env python
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
|
||||
cnc_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(cnc_dir)
|
||||
from cnc.hal_raspberry import hal
|
||||
|
||||
"""
|
||||
This executable module is looking for PID coefficients.
|
||||
Can be ran only on real hardware.
|
||||
"""
|
||||
|
||||
# change settings below for your hardware/environment
|
||||
EXTRUDER_TARGET_TEMPERATURE = 200
|
||||
BED_TARGET_TEMPERATURE = 70
|
||||
DUMMY_CYCLES = 2
|
||||
TOTAL_CYCLES = 7
|
||||
|
||||
|
||||
# finder itself
|
||||
def finder(target_temperature, get_temperature, control):
|
||||
print("Heating...")
|
||||
on = True
|
||||
control(100)
|
||||
last_t = get_temperature()
|
||||
last_time = time.time()
|
||||
max_t = 0
|
||||
min_t = 10000
|
||||
cycle_number = 0
|
||||
cycle_accumulator = 0
|
||||
cycle_counter = 0
|
||||
cycle_time = 0
|
||||
while True:
|
||||
current_time = time.time()
|
||||
t = get_temperature()
|
||||
time_filter = (current_time - last_time) > 0.1
|
||||
if t >= target_temperature and on and time_filter:
|
||||
on = False
|
||||
control(0)
|
||||
last_time = current_time
|
||||
cycle_number += 1
|
||||
if cycle_number > DUMMY_CYCLES:
|
||||
print("Cycle took {} s".format(current_time - cycle_time))
|
||||
cycle_accumulator += current_time - cycle_time
|
||||
cycle_counter += 1
|
||||
cycle_time = current_time
|
||||
if t < target_temperature and not on and time_filter:
|
||||
if cycle_number > TOTAL_CYCLES:
|
||||
break
|
||||
on = True
|
||||
control(100)
|
||||
last_time = current_time
|
||||
if abs(last_t - t) >= 1:
|
||||
print("Temperature is {}, cycle #{}".format(t, cycle_number))
|
||||
last_t = t
|
||||
if cycle_number > DUMMY_CYCLES:
|
||||
if t > max_t:
|
||||
max_t = t
|
||||
if t < min_t:
|
||||
min_t = t
|
||||
time.sleep(0.001)
|
||||
d_temperature = max_t - min_t
|
||||
d_time = cycle_accumulator / cycle_counter
|
||||
print("dT={}, dt={}".format(d_temperature, d_time))
|
||||
p = 1.0 / (1.2 * d_temperature)
|
||||
i = 1.0 / (15.0 * d_time)
|
||||
d = 1.0 / (0.15 * d_time)
|
||||
print("Finder result P={}, I={}, D={}".format(p, i, d))
|
||||
return p, i, d
|
||||
|
||||
|
||||
# finder itself
|
||||
def main():
|
||||
hal.init()
|
||||
try:
|
||||
hal.fan_control(True)
|
||||
print("Running for extruder...")
|
||||
try:
|
||||
ep, ei, ed = finder(EXTRUDER_TARGET_TEMPERATURE,
|
||||
hal.get_extruder_temperature,
|
||||
hal.extruder_heater_control)
|
||||
except (IOError, OSError):
|
||||
ep, ei, ed = None, None, None
|
||||
print("Extruder malfunction")
|
||||
hal.extruder_heater_control(0)
|
||||
print("Running for bed...")
|
||||
try:
|
||||
bp, bi, bd = finder(BED_TARGET_TEMPERATURE,
|
||||
hal.get_bed_temperature,
|
||||
hal.bed_heater_control)
|
||||
except (IOError, OSError):
|
||||
bp, bi, bd = None, None, None
|
||||
print("Bed malfunction")
|
||||
print("Done")
|
||||
print("Extruder P={}, I={}, D={}".format(ep, ei, ed))
|
||||
print("Bed P={}, I={}, D={}".format(bp, bi, bd))
|
||||
hal.bed_heater_control(0)
|
||||
hal.fan_control(False)
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
hal.deinit()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in new issue
Block a user