diff --git a/sndlock.cpp b/sndlock.cpp index 5dc0979..aeb09f7 100644 --- a/sndlock.cpp +++ b/sndlock.cpp @@ -261,10 +261,13 @@ static std::atomic init_current_heating[SND_PCHAN]; static std::atomic init_temp[SND_PCHAN]; static std::atomic leadin_current[SND_PCHAN]; static std::atomic leadin_thr[SND_PCHAN]; +static std::atomic loop_setpoint[SND_PCHAN]; +static std::atomic loop_bias[SND_PCHAN]; +static std::atomic loop_p[SND_PCHAN]; static void servo_thread(int channel) { - Clocker clocker = Clocker(std::chrono::milliseconds(100)); + Clocker clocker = Clocker(std::chrono::milliseconds(30)); Kirdy kirdy = Kirdy(kirdies[channel][0], kirdies[channel][1]); float temp; @@ -310,6 +313,7 @@ static void servo_thread(int channel) servo_state[channel] = "LOCKING"; while(servo_enable[channel]) { + kirdy.set_tec_current(loop_bias[channel] + loop_p[channel]*(li_principal[channel] - loop_setpoint[channel])); clocker.tick(); laser_temp[channel] = temp = kirdy.get_laser_temp(); } @@ -355,14 +359,17 @@ int main(int argc, char* argv[]) frequency[i] = 441.0 + 202.0*i; amplitude[i] = 1.0; multiplier[i] = 1; - lpf_bandwidth[i] = 10.0; + lpf_bandwidth[i] = 8.5; principal_angle[i] = M_PI/4.0; servo_state[i] = "DISABLED"; - init_current_cooling[i] = 270.0f; + init_current_cooling[i] = 310.0f; init_current_heating[i] = -30.0f; init_temp[i] = 16.0f; - leadin_current[i] = 230.0f; - leadin_thr[i] = 0.007f; + leadin_current[i] = 280.0f; + leadin_thr[i] = 0.01f; + loop_setpoint[i] = 0.01f; + loop_bias[i] = 280.0f; + loop_p[i] = 700.0f; } static std::thread dsp_thread_h = std::thread(dsp_thread); @@ -554,6 +561,26 @@ int main(int argc, char* argv[]) ImGui::InputFloat(str, &leadin_thr_l, 0.0f, 0.001f, "%.6f"); leadin_thr[i] = leadin_thr_l; ImGui::PopItemWidth(); + + ImGui::AlignTextToFramePadding(); + ImGui::Text("loop: "); + ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x / 6.0f); + ImGui::SameLine(); + sprintf(str, "bias mA ##%d", i); + float loop_bias_l = loop_bias[i]; + ImGui::InputFloat(str, &loop_bias_l, 1.0f, 500.0f, "%.3f"); + loop_bias[i] = loop_bias_l; + ImGui::SameLine(); + sprintf(str, "setpoint ##%d", i); + float loop_setpoint_l = loop_setpoint[i]; + ImGui::InputFloat(str, &loop_setpoint_l, 0.0f, 0.001f, "%.6f"); + loop_setpoint[i] = loop_setpoint_l; + ImGui::SameLine(); + sprintf(str, "P ##%d", i); + float loop_p_l = loop_p[i]; + ImGui::InputFloat(str, &loop_p_l, 0.0f, 50.0f, "%.2f"); + loop_p[i] = loop_p_l; + ImGui::PopItemWidth(); } }