Motion Master
Loading...
Searching...
No Matches
narrow_angle_calibration.h
Go to the documentation of this file.
1#pragma once
2
3#include <MU_3SL_defs.h>
4#include <MU_3SL_interface.h>
5
6#include <chrono>
7#include <future>
8#include <optional>
9
10#include "machine_procedure.h"
11#include "motion-master.pb.h"
12#include "motion_master_error.h"
13#include "util.h"
14
15// Automatic gains registers
16#define AC_AF_GAIN_M_ADDRESS 0x2B
17#define AC_AF_GAIN_N_ADDRESS 0x2F
18
19// Registers necessary to set raw mode
20#define MODE_ST_ADDRESS 0x12
21#define OUT_ZERO_OUT_MSB_ADDRESS 0x11
22// Sinus and Cosinus offset registers
23#define VOSS_M_ADDRESS 0x02
24#define VOSS_N_ADDRESS 0x08
25#define VOSC_M_ADDRESS 0x03
26#define VOSC_N_ADDRESS 0x09
27// Multiturn interface
28#define MT_INTERFACE_ADDRESS 0x10
29// Phase adjustment
30#define PH_M_ADDRESS 0x04
31#define PH_N_ADDRESS 0x0A
32// Cosine gain
33#define GX_M_ADDRESS 0x01
34#define GX_N_ADDRESS 0x07
35
36// Command register
37#define CMD_MU_ADDRESS 0x75
38#define STATUS0_ADDRESS 0x76
39#define STATUS1_ADDRESS 0x77
40#define WRITE_ALL 0x01
41#define CRC_CALC 0x0E
42
43#define SPO_0_BASE_ADDRESS 0x52
44#define SPO_1_2_ADDRESS 0x53
45#define SPO_3_4_ADDRESS 0x54
46#define SPO_5_6_ADDRESS 0x55
47#define SPO_7_8_ADDRESS 0x56
48#define SPO_9_10_ADDRESS 0x57
49#define SPO_11_12_ADDRESS 0x58
50#define SPO_13_14_ADDRESS 0x59
51
52#define CRC16_ADDRESS_0 0x22
53#define CRC16_ADDRESS_1 0x21
54#define MPC_ADDRESS 0x0F
55#define HARD_REV_ADDRESS 0x74
56
57#define HRD_DATA_FILE_SIZE 8000u
58
59class Cia402Drive;
60class SiUnitVelocity;
61
62typedef struct {
63 long int sine_offset;
64 long int cosine_offset;
65 long int phase;
66 uint32_t PHR;
67 long int gain;
69
71 public:
72 NarrowAngleCalibration(uint32_t device_address, Cia402Drive& cia402_drive,
73 uint8_t encoder_ordinal,
74 bool activate_health_monitoring, bool measurement_only,
75 uint32_t external_encoder_type_,
76 int32_t velocity_base_value_rpm = 0);
77
78 ~NarrowAngleCalibration() override;
79
80 std::optional<MotionMasterError> execute(uint64_t pending_signals) override;
81
89 std::pair<int64_t, double> get_magnet_distance(uint32_t ring_revision);
90
91 private:
92 enum class CalibrationStage {
93 kInit = 0,
94 kInitIteration,
95 kDeinitIteration,
96 kCalibration,
97 kValidation,
98 kDeinit,
99 kWriteEeprom,
100 kAbsReset,
101 kFinal,
102 kDone
103 };
104
105 uint8_t encoder_ordinal_;
106 bool activate_health_monitoring_;
107 bool measurement_only_;
108 uint32_t external_encoder_type_;
109 int32_t velocity_base_value_rpm_;
110 CirculoEncoderType encoder_type_;
111 int32_t hardware_id_;
112 int32_t multiturn_resolution_;
113 uint8_t default_msb_out_;
114
115 bool biss_reset_required_ = false;
116
117 // Used only for encoder port 2 and encoder functions COMMUTATION_AND_MOTION
118 // and COMMUTATION_AND_VELOCITY
119 double calibration_velocity_base_value_rpm_;
120 double calibration_velocity_rpm_;
121
122 // Limited range motion encoder calibration
123 int32_t min_software_position_limit_;
124 int32_t max_software_position_limit_;
125 uint32_t position_encoder_singleturn_resolution_;
126 int32_t starting_position_;
127 double profile_acceleration_rpm_;
128 double start_recording_demand_velocity_rpm_;
129
130 double max_motor_speed_rpm_;
131 double gear_ratio_;
132 double feed_constant_;
133
135
136 bool commutation_offset_measurement_possible_ = false;
137
138 MU_Handle mu_handle_;
139
140 MU_Calibration* mu_calibration_ = nullptr;
141
142 MU_CalibrationAnalyzeResult* mu_analyze_result_ = nullptr;
143
144 // Iteration data
145 bool master_track_calibration_successful_ = false;
146 bool nonius_track_calibration_successful_ = false;
147 int32_t iteration_number_ = 0;
148 int32_t max_iterations_ = 13;
149 size_t number_of_samples_ = 6000;
150 size_t number_of_hrd_data_files_;
151
152 CalibrationStage calibration_stage_ = CalibrationStage::kInit;
153
154 bool validation_iteration_ = false;
155
156 std::optional<std::future<MotionMasterError>> future_;
157
158 MotionMasterError error_;
159
160 std::unique_ptr<SiUnitVelocity> si_unit_velocity_;
161
162 static constexpr float coarse_gain_values_[4] = {4.4f, 7.8f, 12.4f, 20.7f};
163
164 // DEBUG variables
165 std::vector<std::pair<CalibrationParameters, CalibrationParameters>>
166 calibration_parameter_store_;
167
168 const std::vector<std::map<CirculoEncoderType, std::pair<int32_t, int32_t>>>
169 magnet_distance_amplification_limits_ = {
170 {// Default ring - revision 0 (the same as Hutchinson at the moment)
175 {// Bogen ring - revision 1
180 {// Hutchinson ring - revision 2
185
186 const std::vector<std::map<CirculoEncoderType, std::vector<double>>>
187 magnet_distance_polynomial_coefficients_ = {
188 {// Default ring - revision 0 (the same as Hutchinson at the moment)
190 {-1.93733026150236881113e-01, 1.84893973187097715449e-02,
191 -1.27277290997118431833e-04, 4.27826067036225706997e-07,
192 -5.20368296543940458560e-10, 0, 0}},
194 {-1.87769498023411640641e-01, 1.27635840217653444284e-02,
195 6.14758921668711374314e-04, -1.34096326750597602447e-05,
196 7.56425020103532749652e-08, 0, 0}},
198 {-1.04397317851772072905e-01, 1.70625714417142575197e-02,
199 -8.13961183382052607229e-05, -4.74936939216182293326e-07,
200 7.04504263424913605881e-09, -2.76371817076000863454e-11,
201 3.64854567222488168656e-14}},
203 {-2.84403156637705600840e-01, 3.12795823555360244517e-02,
204 -3.25259935985799334551e-04, 1.81647913872471759832e-06,
205 -4.91288513836093814287e-09, 5.10776292998975389867e-12, 0}}},
206 {// Bogen ring - revision 1
208 {-1.39784903650814168463e-01, 1.45325823633666237344e-02,
209 -7.50005188278302195896e-05, 1.61253405153954890157e-07,
210 -4.89306413790261647012e-11, 0, 0}},
212 {-1.81692029808327909501e-01, 3.02858503823710337177e-02,
213 1.23175956046672112430e-04, -8.59123594643554747716e-06,
214 6.60504319801355069769e-08, 0, 0}},
216 {-3.00602095387669798754e-01, 2.34428435042899098451e-02,
217 -2.62627767128114210458e-04, 1.69123403634972594129e-06,
218 -5.27050975872971237842e-09, 5.33125270236813597257e-12,
219 3.18588067695482955623e-15}},
221 {-1.66308923049894613611e-01, 1.82202872259577333680e-02,
222 3.95115033121136774701e-04, -1.41407239990230904438e-05,
223 1.61906309244842605822e-07, -8.18318393262045254823e-10,
224 1.54906578095712552649e-12}}},
225 {// Hutchinson ring - revision 2
227 {-1.93733026150236881113e-01, 1.84893973187097715449e-02,
228 -1.27277290997118431833e-04, 4.27826067036225706997e-07,
229 -5.20368296543940458560e-10, 0, 0}},
231 {-1.87769498023411640641e-01, 1.27635840217653444284e-02,
232 6.14758921668711374314e-04, -1.34096326750597602447e-05,
233 7.56425020103532749652e-08, 0, 0}},
235 {-1.04397317851772072905e-01, 1.70625714417142575197e-02,
236 -8.13961183382052607229e-05, -4.74936939216182293326e-07,
237 7.04504263424913605881e-09, -2.76371817076000863454e-11,
238 3.64854567222488168656e-14}},
240 {-2.84403156637705600840e-01, 3.12795823555360244517e-02,
241 -3.25259935985799334551e-04, 1.81647913872471759832e-06,
242 -4.91288513836093814287e-09, 5.10776292998975389867e-12, 0}}}};
243
244 MotionMasterError init();
245
246 MotionMasterError init_next_iteration();
247
248 MotionMasterError deinit_iteration();
249
250 MotionMasterError calibration();
251
252 MotionMasterError deinit();
253
254 MotionMasterError set_biss_to_raw_mode();
255
256 MotionMasterError reset_biss_to_default();
257
258 MotionMasterError get_and_check_software_position_limits();
259
260 MotionMasterError initialize_internal_values();
261
262 void set_default_msb_out();
263
264 MotionMasterError set_default_calibration();
265
299 MU_Error analyze_and_compute_analog_adjustments(
300 const uint16_t* master_data, const uint16_t* nonius_data,
301 int number_of_samples, CalibrationParameters& master_params,
302 CalibrationParameters& nonius_params);
303
327 std::pair<MotionMasterError, MU_Error> write_master_track_analog_parameters();
328
355 std::pair<MotionMasterError, MU_Error> write_nonius_track_analog_parameters();
356
382 MotionMasterError initialize_calibration_engine(MU_Handle mu_handle);
383
398 static bool is_master_analog_within_tolerance(
399 CalibrationParameters calibration_parameters, uint8_t precision);
400
418 static bool is_nonius_analog_within_tolerance(
419 CalibrationParameters calibration_parameters, uint8_t precision);
420
440 std::pair<MotionMasterError, MU_Error> write_nonius_sync_table();
441
463 MotionMasterError commit_parameters_to_eeprom();
464
485 MotionMasterError apply_hardware_reset();
486
503 MotionMasterError finalize_calibration();
504
514 void print_calibration_summary();
515
516 void write_final_nonius_data_debug_file();
517
536 MU_Error apply_optimized_nonius_table();
537
555 void log_all_calibration_parameters();
556
578 void log_internal_calibration_state();
579
580 MotionMasterError config_hrd_stream_recording();
581
582 MotionMasterError start_hrd_stream_recording();
583
584 void limit_calibration_velocity(double max_calibration_velocity_rpm,
585 bool notify = false);
586
587 MotionMasterError ignore_biss_status_bits(bool ignore);
588
589 MotionMasterError commutation_offset_measurement();
590
591 MotionMasterError adjust_position(int32_t target_position);
592
593 bool commutation_offset_measurement_possible();
594
595 int32_t convert_angle_to_position_units(double angle) const;
596};
EncoderLocation
Definition util.h:70
@ kUnspecified
Definition util.h:70
CirculoEncoderType
Definition util.h:62
@ kCirculo7Inner
Definition util.h:64
@ kCirculo9Outer
Definition util.h:67
@ kCirculo7Outer
Definition util.h:65
@ kCirculo9Inner
Definition util.h:66
Definition cia402_drive.h:120
MachineProcedure(uint32_t device_address, Cia402Drive &cia402_drive)
Definition machine_procedure.cc:3
Definition motion_master_error.h:6
NarrowAngleCalibration(uint32_t device_address, Cia402Drive &cia402_drive, uint8_t encoder_ordinal, bool activate_health_monitoring, bool measurement_only, uint32_t external_encoder_type_, int32_t velocity_base_value_rpm=0)
Definition narrow_angle_calibration.cc:25
std::optional< MotionMasterError > execute(uint64_t pending_signals) override
Definition narrow_angle_calibration.cc:57
std::pair< int64_t, double > get_magnet_distance(uint32_t ring_revision)
Get the magnet distance in millimeters at a certain position.
Definition narrow_angle_calibration.cc:343
~NarrowAngleCalibration() override
Definition narrow_angle_calibration.cc:40
Definition si_unit_velocity.h:11
Definition narrow_angle_calibration.h:62
long int gain
Definition narrow_angle_calibration.h:67
long int phase
Definition narrow_angle_calibration.h:65
long int cosine_offset
Definition narrow_angle_calibration.h:64
uint32_t PHR
Definition narrow_angle_calibration.h:66
long int sine_offset
Definition narrow_angle_calibration.h:63