diff --git a/figs/detail_instrumentation_adc_noise_measured.pdf b/figs/detail_instrumentation_adc_noise_measured.pdf new file mode 100644 index 0000000..b573339 Binary files /dev/null and b/figs/detail_instrumentation_adc_noise_measured.pdf differ diff --git a/figs/detail_instrumentation_adc_noise_measured.png b/figs/detail_instrumentation_adc_noise_measured.png new file mode 100644 index 0000000..10afcc9 Binary files /dev/null and b/figs/detail_instrumentation_adc_noise_measured.png differ diff --git a/figs/detail_instrumentation_adc_quantization.pdf b/figs/detail_instrumentation_adc_quantization.pdf new file mode 100644 index 0000000..18b4258 Binary files /dev/null and b/figs/detail_instrumentation_adc_quantization.pdf differ diff --git a/figs/detail_instrumentation_adc_quantization.png b/figs/detail_instrumentation_adc_quantization.png new file mode 100644 index 0000000..f4211b7 Binary files /dev/null and b/figs/detail_instrumentation_adc_quantization.png differ diff --git a/figs/detail_instrumentation_adc_quantization.svg b/figs/detail_instrumentation_adc_quantization.svg new file mode 100644 index 0000000..39b7b87 --- /dev/null +++ b/figs/detail_instrumentation_adc_quantization.svg @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/figs/detail_instrumentation_amp_output_impedance.pdf b/figs/detail_instrumentation_amp_output_impedance.pdf new file mode 100644 index 0000000..2a821d0 Binary files /dev/null and b/figs/detail_instrumentation_amp_output_impedance.pdf differ diff --git a/figs/detail_instrumentation_amp_output_impedance.png b/figs/detail_instrumentation_amp_output_impedance.png new file mode 100644 index 0000000..b734aea Binary files /dev/null and b/figs/detail_instrumentation_amp_output_impedance.png differ diff --git a/figs/detail_instrumentation_amp_output_impedance.svg b/figs/detail_instrumentation_amp_output_impedance.svg new file mode 100644 index 0000000..0e554d8 --- /dev/null +++ b/figs/detail_instrumentation_amp_output_impedance.svg @@ -0,0 +1,416 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Voltage Amplifier + PiezoelectricStacks + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/figs/detail_instrumentation_capacitive_implementation.pdf b/figs/detail_instrumentation_capacitive_implementation.pdf new file mode 100644 index 0000000..ae955b3 Binary files /dev/null and b/figs/detail_instrumentation_capacitive_implementation.pdf differ diff --git a/figs/detail_instrumentation_capacitive_implementation.png b/figs/detail_instrumentation_capacitive_implementation.png new file mode 100644 index 0000000..270f546 Binary files /dev/null and b/figs/detail_instrumentation_capacitive_implementation.png differ diff --git a/figs/detail_instrumentation_capacitive_implementation.svg b/figs/detail_instrumentation_capacitive_implementation.svg new file mode 100644 index 0000000..50ebf26 --- /dev/null +++ b/figs/detail_instrumentation_capacitive_implementation.svg @@ -0,0 +1,569 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + CapacitiveSensor + + + + + + + + + + + + + + Target + + + + + + + + + + diff --git a/figs/detail_instrumentation_dac_adc_tf.pdf b/figs/detail_instrumentation_dac_adc_tf.pdf new file mode 100644 index 0000000..4bc3089 Binary files /dev/null and b/figs/detail_instrumentation_dac_adc_tf.pdf differ diff --git a/figs/detail_instrumentation_dac_adc_tf.png b/figs/detail_instrumentation_dac_adc_tf.png new file mode 100644 index 0000000..883a053 Binary files /dev/null and b/figs/detail_instrumentation_dac_adc_tf.png differ diff --git a/figs/detail_instrumentation_dac_output_noise.pdf b/figs/detail_instrumentation_dac_output_noise.pdf new file mode 100644 index 0000000..f261f1f Binary files /dev/null and b/figs/detail_instrumentation_dac_output_noise.pdf differ diff --git a/figs/detail_instrumentation_dac_output_noise.png b/figs/detail_instrumentation_dac_output_noise.png new file mode 100644 index 0000000..419b3c4 Binary files /dev/null and b/figs/detail_instrumentation_dac_output_noise.png differ diff --git a/figs/detail_instrumentation_dac_setup.pdf b/figs/detail_instrumentation_dac_setup.pdf new file mode 100644 index 0000000..6ed602c Binary files /dev/null and b/figs/detail_instrumentation_dac_setup.pdf differ diff --git a/figs/detail_instrumentation_dac_setup.png b/figs/detail_instrumentation_dac_setup.png new file mode 100644 index 0000000..0042a0e Binary files /dev/null and b/figs/detail_instrumentation_dac_setup.png differ diff --git a/figs/detail_instrumentation_dac_setup.svg b/figs/detail_instrumentation_dac_setup.svg new file mode 100644 index 0000000..d75448a --- /dev/null +++ b/figs/detail_instrumentation_dac_setup.svg @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/figs/detail_instrumentation_encoder_implementation.pdf b/figs/detail_instrumentation_encoder_implementation.pdf new file mode 100644 index 0000000..4dfc66c Binary files /dev/null and b/figs/detail_instrumentation_encoder_implementation.pdf differ diff --git a/figs/detail_instrumentation_encoder_implementation.png b/figs/detail_instrumentation_encoder_implementation.png new file mode 100644 index 0000000..38ffd91 Binary files /dev/null and b/figs/detail_instrumentation_encoder_implementation.png differ diff --git a/figs/detail_instrumentation_encoder_implementation.svg b/figs/detail_instrumentation_encoder_implementation.svg new file mode 100644 index 0000000..1e6610c --- /dev/null +++ b/figs/detail_instrumentation_encoder_implementation.svg @@ -0,0 +1,330 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Encoder + Ruler + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/figs/detail_instrumentation_femto_input_noise.pdf b/figs/detail_instrumentation_femto_input_noise.pdf new file mode 100644 index 0000000..e9f0e18 Binary files /dev/null and b/figs/detail_instrumentation_femto_input_noise.pdf differ diff --git a/figs/detail_instrumentation_femto_input_noise.png b/figs/detail_instrumentation_femto_input_noise.png new file mode 100644 index 0000000..7f95964 Binary files /dev/null and b/figs/detail_instrumentation_femto_input_noise.png differ diff --git a/figs/detail_instrumentation_femto_meas_setup.pdf b/figs/detail_instrumentation_femto_meas_setup.pdf new file mode 100644 index 0000000..65a59b1 Binary files /dev/null and b/figs/detail_instrumentation_femto_meas_setup.pdf differ diff --git a/figs/detail_instrumentation_femto_meas_setup.png b/figs/detail_instrumentation_femto_meas_setup.png new file mode 100644 index 0000000..b0d2a2e Binary files /dev/null and b/figs/detail_instrumentation_femto_meas_setup.png differ diff --git a/figs/detail_instrumentation_femto_meas_setup.svg b/figs/detail_instrumentation_femto_meas_setup.svg new file mode 100644 index 0000000..ee74517 --- /dev/null +++ b/figs/detail_instrumentation_femto_meas_setup.svg @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/figs/detail_instrumentation_force_sensor_adc.pdf b/figs/detail_instrumentation_force_sensor_adc.pdf new file mode 100644 index 0000000..5b94eb4 Binary files /dev/null and b/figs/detail_instrumentation_force_sensor_adc.pdf differ diff --git a/figs/detail_instrumentation_force_sensor_adc.png b/figs/detail_instrumentation_force_sensor_adc.png new file mode 100644 index 0000000..38d9d1e Binary files /dev/null and b/figs/detail_instrumentation_force_sensor_adc.png differ diff --git a/figs/detail_instrumentation_force_sensor_adc.svg b/figs/detail_instrumentation_force_sensor_adc.svg new file mode 100644 index 0000000..72b1afc --- /dev/null +++ b/figs/detail_instrumentation_force_sensor_adc.svg @@ -0,0 +1,1520 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ADC Model + PiezoelectricSensor Model + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/figs/detail_instrumentation_force_sensor_adc_R.pdf b/figs/detail_instrumentation_force_sensor_adc_R.pdf new file mode 100644 index 0000000..969ba0e Binary files /dev/null and b/figs/detail_instrumentation_force_sensor_adc_R.pdf differ diff --git a/figs/detail_instrumentation_force_sensor_adc_R.png b/figs/detail_instrumentation_force_sensor_adc_R.png new file mode 100644 index 0000000..98511f1 Binary files /dev/null and b/figs/detail_instrumentation_force_sensor_adc_R.png differ diff --git a/figs/detail_instrumentation_force_sensor_adc_R.svg b/figs/detail_instrumentation_force_sensor_adc_R.svg new file mode 100644 index 0000000..627f12e --- /dev/null +++ b/figs/detail_instrumentation_force_sensor_adc_R.svg @@ -0,0 +1,1562 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ADC Model + PiezoelectricSensor Model + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AddedResistor + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/figs/detail_instrumentation_force_sensor_adc_setup.pdf b/figs/detail_instrumentation_force_sensor_adc_setup.pdf new file mode 100644 index 0000000..6b79aac Binary files /dev/null and b/figs/detail_instrumentation_force_sensor_adc_setup.pdf differ diff --git a/figs/detail_instrumentation_force_sensor_adc_setup.png b/figs/detail_instrumentation_force_sensor_adc_setup.png new file mode 100644 index 0000000..dc8fbd3 Binary files /dev/null and b/figs/detail_instrumentation_force_sensor_adc_setup.png differ diff --git a/figs/detail_instrumentation_noise_sensitivities.pdf b/figs/detail_instrumentation_noise_sensitivities.pdf new file mode 100644 index 0000000..64d1786 Binary files /dev/null and b/figs/detail_instrumentation_noise_sensitivities.pdf differ diff --git a/figs/detail_instrumentation_noise_sensitivities.png b/figs/detail_instrumentation_noise_sensitivities.png new file mode 100644 index 0000000..026bf2c Binary files /dev/null and b/figs/detail_instrumentation_noise_sensitivities.png differ diff --git a/figs/detail_instrumentation_pd200_noise.pdf b/figs/detail_instrumentation_pd200_noise.pdf new file mode 100644 index 0000000..dde439b Binary files /dev/null and b/figs/detail_instrumentation_pd200_noise.pdf differ diff --git a/figs/detail_instrumentation_pd200_noise.png b/figs/detail_instrumentation_pd200_noise.png new file mode 100644 index 0000000..f0ccb86 Binary files /dev/null and b/figs/detail_instrumentation_pd200_noise.png differ diff --git a/figs/detail_instrumentation_pd200_setup.pdf b/figs/detail_instrumentation_pd200_setup.pdf new file mode 100644 index 0000000..918e674 Binary files /dev/null and b/figs/detail_instrumentation_pd200_setup.pdf differ diff --git a/figs/detail_instrumentation_pd200_setup.png b/figs/detail_instrumentation_pd200_setup.png new file mode 100644 index 0000000..092a7fa Binary files /dev/null and b/figs/detail_instrumentation_pd200_setup.png differ diff --git a/figs/detail_instrumentation_pd200_setup.svg b/figs/detail_instrumentation_pd200_setup.svg new file mode 100644 index 0000000..bd91ea9 --- /dev/null +++ b/figs/detail_instrumentation_pd200_setup.svg @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/figs/detail_instrumentation_pd200_specs_bandwidth.pdf b/figs/detail_instrumentation_pd200_specs_bandwidth.pdf new file mode 100644 index 0000000..8d2e6c4 Binary files /dev/null and b/figs/detail_instrumentation_pd200_specs_bandwidth.pdf differ diff --git a/figs/detail_instrumentation_pd200_specs_bandwidth.png b/figs/detail_instrumentation_pd200_specs_bandwidth.png new file mode 100644 index 0000000..642bde9 Binary files /dev/null and b/figs/detail_instrumentation_pd200_specs_bandwidth.png differ diff --git a/figs/detail_instrumentation_pd200_specs_bandwidth.svg b/figs/detail_instrumentation_pd200_specs_bandwidth.svg new file mode 100644 index 0000000..0a5ecff --- /dev/null +++ b/figs/detail_instrumentation_pd200_specs_bandwidth.svg @@ -0,0 +1,2832 @@ + + + + + + + image/svg+xml + + FRF_noFont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FRF_noFont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/figs/detail_instrumentation_pd200_specs_noise.pdf b/figs/detail_instrumentation_pd200_specs_noise.pdf new file mode 100644 index 0000000..d5efe26 Binary files /dev/null and b/figs/detail_instrumentation_pd200_specs_noise.pdf differ diff --git a/figs/detail_instrumentation_pd200_specs_noise.png b/figs/detail_instrumentation_pd200_specs_noise.png new file mode 100644 index 0000000..262d118 Binary files /dev/null and b/figs/detail_instrumentation_pd200_specs_noise.png differ diff --git a/figs/detail_instrumentation_pd200_tf.pdf b/figs/detail_instrumentation_pd200_tf.pdf new file mode 100644 index 0000000..ee3380c Binary files /dev/null and b/figs/detail_instrumentation_pd200_tf.pdf differ diff --git a/figs/detail_instrumentation_pd200_tf.png b/figs/detail_instrumentation_pd200_tf.png new file mode 100644 index 0000000..853be47 Binary files /dev/null and b/figs/detail_instrumentation_pd200_tf.png differ diff --git a/figs/detail_instrumentation_plant.pdf b/figs/detail_instrumentation_plant.pdf index 8b01dec..8f4afe1 100644 Binary files a/figs/detail_instrumentation_plant.pdf and b/figs/detail_instrumentation_plant.pdf differ diff --git a/figs/detail_instrumentation_plant.png b/figs/detail_instrumentation_plant.png index c666710..6b61e9c 100644 Binary files a/figs/detail_instrumentation_plant.png and b/figs/detail_instrumentation_plant.png differ diff --git a/figs/detail_instrumentation_plant.svg b/figs/detail_instrumentation_plant.svg index 85a5eed..9f6b052 100644 --- a/figs/detail_instrumentation_plant.svg +++ b/figs/detail_instrumentation_plant.svg @@ -54,46 +54,46 @@ - - - - - - - + - + - + - - - - - - - - - - - - - - - - - - - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -188,52 +188,52 @@ - + - + + + + + - - - - - - - - + + + + - + - + - - - + + + - - + + - + - + @@ -245,14 +245,14 @@ - + - - + + @@ -276,7 +276,7 @@ - + @@ -297,40 +297,39 @@ - + - + - + - - + + - - + + - + - - - - + + + - + - - + + diff --git a/figs/detail_instrumentation_sensor_capacitive.jpg b/figs/detail_instrumentation_sensor_capacitive.jpg new file mode 100644 index 0000000..317cca7 Binary files /dev/null and b/figs/detail_instrumentation_sensor_capacitive.jpg differ diff --git a/figs/detail_instrumentation_sensor_eddy_current.pdf b/figs/detail_instrumentation_sensor_eddy_current.pdf new file mode 100644 index 0000000..510fc24 Binary files /dev/null and b/figs/detail_instrumentation_sensor_eddy_current.pdf differ diff --git a/figs/detail_instrumentation_sensor_eddy_current.png b/figs/detail_instrumentation_sensor_eddy_current.png new file mode 100644 index 0000000..071e605 Binary files /dev/null and b/figs/detail_instrumentation_sensor_eddy_current.png differ diff --git a/figs/detail_instrumentation_sensor_eddy_current.svg b/figs/detail_instrumentation_sensor_eddy_current.svg new file mode 100644 index 0000000..257c0e3 --- /dev/null +++ b/figs/detail_instrumentation_sensor_eddy_current.svg @@ -0,0 +1,102 @@ + + + + diff --git a/figs/detail_instrumentation_sensor_encoder.jpg b/figs/detail_instrumentation_sensor_encoder.jpg new file mode 100644 index 0000000..276c835 Binary files /dev/null and b/figs/detail_instrumentation_sensor_encoder.jpg differ diff --git a/figs/detail_instrumentation_slip_ring.pdf b/figs/detail_instrumentation_slip_ring.pdf new file mode 100644 index 0000000..c50ca24 Binary files /dev/null and b/figs/detail_instrumentation_slip_ring.pdf differ diff --git a/figs/detail_instrumentation_slip_ring.png b/figs/detail_instrumentation_slip_ring.png new file mode 100644 index 0000000..99a4018 Binary files /dev/null and b/figs/detail_instrumentation_slip_ring.png differ diff --git a/figs/detail_instrumentation_step_response_force_sensor.pdf b/figs/detail_instrumentation_step_response_force_sensor.pdf new file mode 100644 index 0000000..5262ef2 Binary files /dev/null and b/figs/detail_instrumentation_step_response_force_sensor.pdf differ diff --git a/figs/detail_instrumentation_step_response_force_sensor.png b/figs/detail_instrumentation_step_response_force_sensor.png new file mode 100644 index 0000000..5b4b307 Binary files /dev/null and b/figs/detail_instrumentation_step_response_force_sensor.png differ diff --git a/figs/detail_instrumentation_step_response_force_sensor_R.pdf b/figs/detail_instrumentation_step_response_force_sensor_R.pdf new file mode 100644 index 0000000..40a08f1 Binary files /dev/null and b/figs/detail_instrumentation_step_response_force_sensor_R.pdf differ diff --git a/figs/detail_instrumentation_step_response_force_sensor_R.png b/figs/detail_instrumentation_step_response_force_sensor_R.png new file mode 100644 index 0000000..2e5963d Binary files /dev/null and b/figs/detail_instrumentation_step_response_force_sensor_R.png differ diff --git a/matlab/detail_instrumentation_nass.slx b/matlab/detail_instrumentation_nass.slx index 58ed9f1..99e148d 100644 Binary files a/matlab/detail_instrumentation_nass.slx and b/matlab/detail_instrumentation_nass.slx differ diff --git a/matlab/mat/2023-08-22_15-52_io131_dac_to_adc.mat b/matlab/mat/2023-08-22_15-52_io131_dac_to_adc.mat new file mode 100644 index 0000000..663eda6 Binary files /dev/null and b/matlab/mat/2023-08-22_15-52_io131_dac_to_adc.mat differ diff --git a/matlab/mat/2023-08-23_15-42_io131_adc_noise.mat b/matlab/mat/2023-08-23_15-42_io131_adc_noise.mat new file mode 100644 index 0000000..c73cc03 Binary files /dev/null and b/matlab/mat/2023-08-23_15-42_io131_adc_noise.mat differ diff --git a/matlab/mat/2023-08-23_16-00_io131_adc_noise_os8.mat b/matlab/mat/2023-08-23_16-00_io131_adc_noise_os8.mat new file mode 100644 index 0000000..32f2503 Binary files /dev/null and b/matlab/mat/2023-08-23_16-00_io131_adc_noise_os8.mat differ diff --git a/matlab/mat/2023-08-23_16-02_io131_adc_noise_os16.mat b/matlab/mat/2023-08-23_16-02_io131_adc_noise_os16.mat new file mode 100644 index 0000000..3f36caa Binary files /dev/null and b/matlab/mat/2023-08-23_16-02_io131_adc_noise_os16.mat differ diff --git a/matlab/mat/force_sensor_steps.mat b/matlab/mat/force_sensor_steps.mat new file mode 100644 index 0000000..14676bb Binary files /dev/null and b/matlab/mat/force_sensor_steps.mat differ diff --git a/matlab/mat/force_sensor_steps_R_82k7.mat b/matlab/mat/force_sensor_steps_R_82k7.mat new file mode 100644 index 0000000..1ddef74 Binary files /dev/null and b/matlab/mat/force_sensor_steps_R_82k7.mat differ diff --git a/matlab/mat/instrumentation_requirements.mat b/matlab/mat/instrumentation_requirements.mat new file mode 100644 index 0000000..1fdd321 Binary files /dev/null and b/matlab/mat/instrumentation_requirements.mat differ diff --git a/matlab/mat/instrumentation_sensitivity.mat b/matlab/mat/instrumentation_sensitivity.mat new file mode 100644 index 0000000..7b666e0 Binary files /dev/null and b/matlab/mat/instrumentation_sensitivity.mat differ diff --git a/matlab/mat/nass_model_controller.mat b/matlab/mat/nass_model_controller.mat index adee8e3..fbf5ac4 100644 Binary files a/matlab/mat/nass_model_controller.mat and b/matlab/mat/nass_model_controller.mat differ diff --git a/matlab/mat/nass_model_disturbances.mat b/matlab/mat/nass_model_disturbances.mat index 3fd93e6..b8a0139 100644 Binary files a/matlab/mat/nass_model_disturbances.mat and b/matlab/mat/nass_model_disturbances.mat differ diff --git a/matlab/mat/noise_PD200_1_10uF.mat b/matlab/mat/noise_PD200_1_10uF.mat new file mode 100644 index 0000000..b938267 Binary files /dev/null and b/matlab/mat/noise_PD200_1_10uF.mat differ diff --git a/matlab/mat/noise_PD200_2_10uF.mat b/matlab/mat/noise_PD200_2_10uF.mat new file mode 100644 index 0000000..d93635c Binary files /dev/null and b/matlab/mat/noise_PD200_2_10uF.mat differ diff --git a/matlab/mat/noise_PD200_3_10uF.mat b/matlab/mat/noise_PD200_3_10uF.mat new file mode 100644 index 0000000..4faeda2 Binary files /dev/null and b/matlab/mat/noise_PD200_3_10uF.mat differ diff --git a/matlab/mat/noise_PD200_4_10uF.mat b/matlab/mat/noise_PD200_4_10uF.mat new file mode 100644 index 0000000..2176376 Binary files /dev/null and b/matlab/mat/noise_PD200_4_10uF.mat differ diff --git a/matlab/mat/noise_PD200_4_3uF.mat b/matlab/mat/noise_PD200_4_3uF.mat new file mode 100644 index 0000000..d0c443e Binary files /dev/null and b/matlab/mat/noise_PD200_4_3uF.mat differ diff --git a/matlab/mat/noise_PD200_5_10uF.mat b/matlab/mat/noise_PD200_5_10uF.mat new file mode 100644 index 0000000..096fab5 Binary files /dev/null and b/matlab/mat/noise_PD200_5_10uF.mat differ diff --git a/matlab/mat/noise_PD200_6_10uF.mat b/matlab/mat/noise_PD200_6_10uF.mat new file mode 100644 index 0000000..af5496a Binary files /dev/null and b/matlab/mat/noise_PD200_6_10uF.mat differ diff --git a/matlab/mat/noise_dac.mat b/matlab/mat/noise_dac.mat new file mode 100644 index 0000000..69a23e0 Binary files /dev/null and b/matlab/mat/noise_dac.mat differ diff --git a/matlab/mat/noise_femto.mat b/matlab/mat/noise_femto.mat new file mode 100644 index 0000000..d21413e Binary files /dev/null and b/matlab/mat/noise_femto.mat differ diff --git a/matlab/mat/noise_meas_100s_20kHz_1.mat b/matlab/mat/noise_meas_100s_20kHz_1.mat new file mode 100644 index 0000000..7312858 Binary files /dev/null and b/matlab/mat/noise_meas_100s_20kHz_1.mat differ diff --git a/matlab/mat/noise_meas_100s_20kHz_2.mat b/matlab/mat/noise_meas_100s_20kHz_2.mat new file mode 100644 index 0000000..9ed7408 Binary files /dev/null and b/matlab/mat/noise_meas_100s_20kHz_2.mat differ diff --git a/matlab/mat/noise_meas_100s_20kHz_3.mat b/matlab/mat/noise_meas_100s_20kHz_3.mat new file mode 100644 index 0000000..ff820e8 Binary files /dev/null and b/matlab/mat/noise_meas_100s_20kHz_3.mat differ diff --git a/matlab/mat/noise_meas_100s_20kHz_4.mat b/matlab/mat/noise_meas_100s_20kHz_4.mat new file mode 100644 index 0000000..c4a6961 Binary files /dev/null and b/matlab/mat/noise_meas_100s_20kHz_4.mat differ diff --git a/matlab/mat/noise_meas_100s_20kHz_5.mat b/matlab/mat/noise_meas_100s_20kHz_5.mat new file mode 100644 index 0000000..980168a Binary files /dev/null and b/matlab/mat/noise_meas_100s_20kHz_5.mat differ diff --git a/matlab/mat/noise_meas_100s_20kHz_6.mat b/matlab/mat/noise_meas_100s_20kHz_6.mat new file mode 100644 index 0000000..93f4c34 Binary files /dev/null and b/matlab/mat/noise_meas_100s_20kHz_6.mat differ diff --git a/matlab/mat/tf_pd200_1_10uF_small_signal.mat b/matlab/mat/tf_pd200_1_10uF_small_signal.mat new file mode 100644 index 0000000..47560ee Binary files /dev/null and b/matlab/mat/tf_pd200_1_10uF_small_signal.mat differ diff --git a/matlab/mat/tf_pd200_2_10uF_small_signal.mat b/matlab/mat/tf_pd200_2_10uF_small_signal.mat new file mode 100644 index 0000000..a06dc53 Binary files /dev/null and b/matlab/mat/tf_pd200_2_10uF_small_signal.mat differ diff --git a/matlab/mat/tf_pd200_3_10uF_small_signal.mat b/matlab/mat/tf_pd200_3_10uF_small_signal.mat new file mode 100644 index 0000000..f2ce2ee Binary files /dev/null and b/matlab/mat/tf_pd200_3_10uF_small_signal.mat differ diff --git a/matlab/mat/tf_pd200_4_10uF_small_signal.mat b/matlab/mat/tf_pd200_4_10uF_small_signal.mat new file mode 100644 index 0000000..94f92f4 Binary files /dev/null and b/matlab/mat/tf_pd200_4_10uF_small_signal.mat differ diff --git a/matlab/mat/tf_pd200_5_10uF_small_signal.mat b/matlab/mat/tf_pd200_5_10uF_small_signal.mat new file mode 100644 index 0000000..c78eb07 Binary files /dev/null and b/matlab/mat/tf_pd200_5_10uF_small_signal.mat differ diff --git a/matlab/mat/tf_pd200_6_10uF_small_signal.mat b/matlab/mat/tf_pd200_6_10uF_small_signal.mat new file mode 100644 index 0000000..cb80a59 Binary files /dev/null and b/matlab/mat/tf_pd200_6_10uF_small_signal.mat differ diff --git a/nass-instrumentation.org b/nass-instrumentation.org index 07c92f9..7d85124 100644 --- a/nass-instrumentation.org +++ b/nass-instrumentation.org @@ -360,10 +360,10 @@ The received instrumentation are characterized in Section ref:sec:detail_instrum \coordinate[] (outputVs) at ($(plant.south east)!0.7!(plant.north east)$); \coordinate[] (outputde) at ($(plant.south east)!0.3!(plant.north east)$); - \node[block={1.0cm}{1.0cm}, left=0.8 of inputVa] (ampl_tf) {$G_{\text{ampl}}$}; - \node[addb={+}{}{}{}{}, left=0.4 of ampl_tf] (ampl_noise) {}; + \node[addb={+}{}{}{}{}, left=0.8 of inputVa] (ampl_noise) {}; + \node[block={1.0cm}{1.0cm}, left=0.4 of ampl_noise] (ampl_tf) {$G_{\text{ampl}}$}; - \node[addb={+}{}{}{}{}, left=0.8 of ampl_noise] (dac_noise) {}; + \node[addb={+}{}{}{}{}, left=0.8 of ampl_tf] (dac_noise) {}; \node[DAC, left=0.4 of dac_noise] (dac_tf) {}; \node[addb={+}{}{}{}{}, left=1.0 of dac_tf] (iff_sum) {}; @@ -371,17 +371,14 @@ The received instrumentation are characterized in Section ref:sec:detail_instrum \node[block={1.0cm}{1.0cm}, above=0.4 of iff_sum] (Kiff) {$\bm{K}_{\text{IFF}}$}; \node[block={1.0cm}{1.0cm}, left=0.4 of iff_sum] (Khac) {$\bm{K}_{\text{HAC}}$}; - % \node[block={1.0cm}{1.0cm}, above=0.4 of plant] (Kiff) {$\bm{K}_{\text{IFF}}$}; - % \node[block={1.0cm}{1.0cm}, below=0.4 of plant] (Khac) {$\bm{K}_{\text{HAC}}$}; - \node[addb={+}{}{}{}{}, right=0.8 of outputVs] (adc_noise) {}; \node[ADC, right=0.4 of adc_noise] (adc_tf) {}; \draw[->] (iff_sum.east) --node[midway, above]{$\bm{u}$} node[near start, sloped]{$/$} (dac_tf.west); \draw[->] (dac_tf.east) -- (dac_noise.west); - \draw[->] (dac_noise.east) -- (ampl_noise.west); - \draw[->] (ampl_noise.east) -- (ampl_tf.west); - \draw[->] (ampl_tf.east) -- (inputVa)node[above left]{$\bm{V}_a$}; + \draw[->] (dac_noise.east) -- (ampl_tf.west); + \draw[->] (ampl_tf.east) -- (ampl_noise.west); + \draw[->] (ampl_noise.east) -- (inputVa)node[above left]{$\bm{V}_a$}; \draw[->] (outputVs)node[above right]{$\bm{V}_s$} -- (adc_noise.west); \draw[->] (adc_noise.east) -- (adc_tf.west); \draw[->] (adc_tf.east) -| ++(0.4, 1.8) -| node[near start, sloped]{$/$} (Kiff.north); @@ -389,9 +386,9 @@ The received instrumentation are characterized in Section ref:sec:detail_instrum \draw[->] (outputde)node[above right]{$\bm{\epsilon}_{\mathcal{L}}$} -| ++(0.6, -1.0) -| node[near start, sloped]{$/$} ($(Khac.west)+(-0.6, 0)$) -- (Khac.west); \draw[->] (Khac.east) -- node[sloped]{$/$} (iff_sum.west); - \draw[<-] (dac_noise.north) -- ++(0, 0.8)coordinate(dac_noise_input) node[below left]{$n_{\text{ad}}$}; - \draw[<-] (ampl_noise.north) -- ++(0, 0.8)coordinate(ampl_noise_input) node[below right]{$n_{\text{ampl}}$}; - \draw[<-] (adc_noise.north) -- ++(0, 0.8)coordinate(adc_noise_input) node[below right]{$n_{\text{da}}$}; + \draw[<-] (dac_noise.north) -- ++(0, 0.8)coordinate(dac_noise_input) node[below left]{$n_{\text{da}}$}; + \draw[<-] (ampl_noise.north) -- ++(0, 0.8)coordinate(ampl_noise_input) node[below left]{$n_{\text{amp}}$}; + \draw[<-] (adc_noise.north) -- ++(0, 0.8)coordinate(adc_noise_input) node[below right]{$n_{\text{ad}}$}; \begin{scope}[on background layer] \node[fit={(dac_tf.south west) (dac_noise.east|-dac_noise_input)}, fill=colorblue!20!white, draw, dashed, inner sep=4pt] (dac_system) {}; @@ -399,7 +396,7 @@ The received instrumentation are characterized in Section ref:sec:detail_instrum \end{scope} \begin{scope}[on background layer] - \node[fit={(ampl_noise.west|-ampl_tf.south) (ampl_tf.east|-ampl_noise_input)}, fill=colorred!20!white, draw, dashed, inner sep=4pt] (ampl_system) {}; + \node[fit={(ampl_tf.south west) (ampl_noise.east|-ampl_noise_input)}, fill=colorred!20!white, draw, dashed, inner sep=4pt] (ampl_system) {}; \node[anchor={north}] at (ampl_system.south){$\text{Amplifier}$}; \end{scope} @@ -435,7 +432,8 @@ The received instrumentation are characterized in Section ref:sec:detail_instrum - Get closed-loop transfer functions from disturbance sources (noise of ADC, DAC and amplifier noise) to positioning error This is done using the multi-body model, with 2DoF APA model (having voltage input and outputs) - Focus is made on the vertical direction, as it is the direction with the most stringent requirements. -- Deduce the maximum ASD of the noise sources + If horizontal directions are considered, requirements are just less stringent than for the vertical direction. +- Deduce the maximum acceptable ASD of the noise sources As the voltage amplifier gain will impact how the DAC noise will be amplified, some assumption are made: - we want to apply -20 to 150V to the stacks @@ -477,14 +475,14 @@ open(mdl); % Open Simscape Model The following noise sources are considered (Figure ref:fig:detail_instrumentation_plant): - $n_{da}$: output voltage noise of the DAC -- $n_{amp}$: (input referred) voltage noise of the voltage amplifier +- $n_{amp}$: output voltage noise of the voltage amplifier - $n_{ad}$: voltage noise of the ADC measuring the force sensor stacks Encoder noise, only used to estimate $R_z$ is found to have little impact on the vertical sample error and is therefore ommited from this analysis for clarity. -The transfer function from these three noise sources (for one strut) to the vertical error of the sample are estimated from the multi-body model, including the APA300ML and the designed flexible joints. +The transfer function from these three noise sources (for one strut) to the vertical error of the sample are estimated from the multi-body model, including the APA300ML and the designed flexible joints (Figure ref:fig:detail_instrumentation_noise_sensitivities). -The latteral error was also considered, but the specifications are less stringent than vertical error and the sensitivity to disturbances is smaller. +The lateral error was also considered, but the specifications are less stringent than vertical error and the sensitivity to disturbances is smaller. #+begin_src matlab %% Identify the transfer functions from disturbance sources to vertical position error @@ -530,6 +528,7 @@ Khac = -5e4 * ... % Gain % Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/dac_noise'], 1, 'input'); io_i = io_i + 1; % DAC noise [V] +io(io_i) = linio([mdl, '/amp_noise'], 1, 'input'); io_i = io_i + 1; % Voltage Amplifier noise [V] io(io_i) = linio([mdl, '/NASS/adc_noise'], 1, 'input'); io_i = io_i + 1; % ADC noise [V] io(io_i) = linio([mdl, '/NASS/enc_noise'], 1, 'input'); io_i = io_i + 1; % Encoder noise [m] io(io_i) = linio([mdl, '/NASS'], 2, 'output', [], 'z'); io_i = io_i + 1; % Vertical error [m] @@ -537,54 +536,53 @@ io(io_i) = linio([mdl, '/NASS'], 2, 'output', [], 'y'); io_i = io_i + Gd = linearize(mdl, io); Gd.InputName = {... - 'du1', 'du2', 'du3', 'du4', 'du5', 'du6', ... % DAC and Voltage amplifier noise - 'dVs1', 'dVs2', 'dVs3', 'dVs4', 'dVs5', 'dVs6', ... % ADC noise + 'nda1', 'nda2', 'nda3', 'nda4', 'nda5', 'nda6', ... % DAC and Voltage amplifier noise + 'namp1', 'namp2', 'namp3', 'namp4', 'namp5', 'namp6', ... % DAC and Voltage amplifier noise + 'nad1', 'nad2', 'nad3', 'nad4', 'nad5', 'nad6', ... % ADC noise 'ddL1', 'ddL2', 'ddL3', 'ddL4', 'ddL5', 'ddL6' ... % Encoder noise }; Gd.OutputName = {'y', 'z'}; % Vertical error of the sample #+end_src -Sensitivity to disturbances. +#+begin_src matlab :exports none :tangle no +%% Save Requirements +save('./matlab/mat/instrumentation_sensitivity.mat', 'Gd'); +#+end_src + +#+begin_src matlab :exports none :eval no +%% Save Requirements +save('./mat/instrumentation_sensitivity.mat', 'Gd'); +#+end_src #+begin_src matlab :exports none :results none +%% Transfer function from noise sources to vertical motion errors freqs = logspace(0, 3, 1000); figure; tiledlayout(1, 1, 'TileSpacing', 'compact', 'Padding', 'None'); nexttile(); hold on; -plot(freqs, abs(squeeze(freqresp(Gd('z', 'du1'), freqs, 'Hz'))), 'DisplayName', '$\epsilon_z/n_{da}$ [m/V]'); -plot(freqs, abs(squeeze(freqresp(Gd('z', 'dVs1'), freqs, 'Hz'))), 'DisplayName', '$\epsilon_z/n_{ad}$ [m/V]'); -plot(freqs, abs(squeeze(freqresp(Gd('z', 'ddL1'), freqs, 'Hz'))), 'DisplayName', '$\epsilon_z/n_{de}$ [m/m]'); +plot(freqs, abs(squeeze(freqresp(Gd('z', 'nda1' ), freqs, 'Hz'))), 'DisplayName', '$\epsilon_z/n_{da}$'); +plot(freqs, abs(squeeze(freqresp(Gd('z', 'namp1'), freqs, 'Hz'))), 'DisplayName', '$\epsilon_z/n_{amp}$'); +plot(freqs, abs(squeeze(freqresp(Gd('z', 'nad1' ), freqs, 'Hz'))), 'DisplayName', '$\epsilon_z/n_{ad}$'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('Sensitivity'); -ylim([1e-10, 1e-4]); -leg = legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1); +xlabel('Frequency [Hz]'); ylabel('Sensitivity [m/V]'); +ylim([1e-9, 1e-4]); +leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); leg.ItemTokenSize(1) = 15; xlim([1, 1e3]); #+end_src -#+begin_src matlab :exports none :results none -freqs = logspace(0, 3, 1000); - -figure; -tiledlayout(1, 1, 'TileSpacing', 'compact', 'Padding', 'None'); -nexttile(); -hold on; -plot(freqs, abs(squeeze(freqresp(Gd('z', 'du1'), freqs, 'Hz'))), 'DisplayName', '$\epsilon_z/n_{da}$ [m/V]'); -plot(freqs, abs(squeeze(freqresp(Gd('z', 'dVs1'), freqs, 'Hz'))), 'DisplayName', '$\epsilon_z/n_{ad}$ [m/V]'); -plot(freqs, abs(squeeze(freqresp(Gd('y', 'du1'), freqs, 'Hz'))), 'DisplayName', '$\epsilon_y/n_{da}$ [m/V]'); -plot(freqs, abs(squeeze(freqresp(Gd('y', 'dVs1'), freqs, 'Hz'))), 'DisplayName', '$\epsilon_y/n_{ad}$ [m/V]'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('Sensitivity'); -ylim([1e-10, 1e-4]); -leg = legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1); -leg.ItemTokenSize(1) = 15; -xlim([1, 1e3]); +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/detail_instrumentation_noise_sensitivities.pdf', 'width', 'wide', 'height', 'normal'); #+end_src +#+name: fig:detail_instrumentation_noise_sensitivities +#+caption: Transfer function from noise sources to vertical motion errors +#+RESULTS: +[[file:figs/detail_instrumentation_noise_sensitivities.png]] + ** Estimation of maximum instrumentation noise From previous analysis, we know how the noise of the instrumentation will affect the vertical error of the sample. @@ -602,8 +600,7 @@ Use of system symmetry to simplify the analysis: - the effect of all the struts on the vertical errors are identical (verify from the extracted sensitivity curves). Therefore only one strut can be considered for this analysis, and the total effect of the six struts is just six times the effect of one strut (in terms of power, but in terms of RMS value it's only sqrt(6)=2.5) - -In order to have specifications for the noise of the instrumentations, assumptions: +In order to have specifications for the noise of the instrumentation, assumptions: - flat noise, which is quite typical The noise specification is computed such that if all the instrumentation have this maximum noise, the specification in terms of vertical error is still respected. @@ -618,37 +615,56 @@ max_asd_z = 15e-9 / sqrt(6) / sqrt(3); % [m/sqrt(Hz)] % Suppose unitary flat noise ASD => compute the effect on vertical noise unit_asd = ones(1, length(freqs)); -rms_unit_asd_dac = sqrt(sum((unit_asd.*abs(squeeze(freqresp(Gd('z', 'du1' ), freqs, 'Hz'))).').^2)); -rms_unit_asd_amp = sqrt(sum((unit_asd.*abs(squeeze(freqresp(Gd('z', 'du1' ), freqs, 'Hz'))).').^2)); -rms_unit_asd_adc = sqrt(sum((unit_asd.*abs(squeeze(freqresp(Gd('z', 'dVs1'), freqs, 'Hz'))).').^2)); -rms_unit_asd_enc = sqrt(sum((unit_asd.*abs(squeeze(freqresp(Gd('z', 'ddL1'), freqs, 'Hz'))).').^2)); +rms_unit_asd_dac = sqrt(sum((unit_asd.*abs(squeeze(freqresp(Gd('z', 'nda1' ), freqs, 'Hz'))).').^2)); +rms_unit_asd_amp = sqrt(sum((unit_asd.*abs(squeeze(freqresp(Gd('z', 'namp1'), freqs, 'Hz'))).').^2)); +rms_unit_asd_adc = sqrt(sum((unit_asd.*abs(squeeze(freqresp(Gd('z', 'nad1' ), freqs, 'Hz'))).').^2)); % Obtained maximum ASD for different instruments -max_dac_asd = max_asd_z./rms_unit_asd_dac; -max_amp_asd = max_asd_z./rms_unit_asd_amp; -max_adc_asd = max_asd_z./rms_unit_asd_adc; -max_enc_asd = max_asd_z./rms_unit_asd_enc; +max_dac_asd = max_asd_z./rms_unit_asd_dac; % [V/sqrt(Hz)] +max_amp_asd = max_asd_z./rms_unit_asd_amp; % [V/sqrt(Hz)] +max_adc_asd = max_asd_z./rms_unit_asd_adc; % [V/sqrt(Hz)] % Estimation of the equivalent RMS noise -max_dac_rms = max_dac_asd*sqrt(5e3) -max_amp_rms = max_amp_asd*sqrt(5e3) -max_adc_rms = max_adc_asd*sqrt(5e3) -max_enc_rms = max_enc_asd*sqrt(5e3) +max_dac_rms = 1e3*max_dac_asd*sqrt(5e3) % [mV RMS] +max_amp_rms = 1e3*max_amp_asd*sqrt(5e3) % [mV RMS] +max_adc_rms = 1e3*max_adc_asd*sqrt(5e3) % [mV RMS] #+end_src Obtained maximum noise are: -- DAC maximum output noise ASD $32\,\mu V/\sqrt{Hz}$. -- Voltage amplifier maximum noise (referred to input) ASD $32\,\mu V/\sqrt{Hz}$ -- ADC maximum measurement noise ASD $22\,\mu V/\sqrt{Hz}$. +- DAC maximum output noise ASD $14\,\mu V/\sqrt{Hz}$. +- Voltage amplifier maximum output voltage noise ASD $280\,\mu V/\sqrt{Hz}$ +- ADC maximum measurement noise ASD $11\,\mu V/\sqrt{Hz}$. In terms of RMS noise, -- DAC and voltage amplifier: <1 mV RMS +- DAC: <1 mV RMS +- Voltage amplifier: < 20 mV RMS - ADC: < 0.8 mV RMS -- [ ] Maybe make a table to summarize the specifications +#+name: tab:detail_instrumentation_specification_noise +#+caption: Obtained specification in terms of noise +#+attr_latex: :environment tabularx :width 0.7\linewidth :align Xccc +#+attr_latex: :center t :booktabs t +| | ADC | DAC | Amplifier | +|-------------+-----------------------+-----------------------+------------------------| +| Maximum ASD | $11\,\mu V/\sqrt{Hz}$ | $14\,\mu V/\sqrt{Hz}$ | $280\,\mu V/\sqrt{Hz}$ | +| RMS Noise | $0.8\,mV\,\text{RMS}$ | $1\,mV\,\text{RMS}$ | $20\,mV\,\text{RMS}$ | If the Amplitude Spectral Density of the noise of the ADC, DAC and voltage amplifiers are all below the specified maximum noises, then the induced vertical error will be below 15nmRMS. +#+begin_src matlab :exports none :tangle no +%% Save Requirements +save('./matlab/mat/instrumentation_requirements.mat', ... + 'max_dac_asd', 'max_amp_asd', 'max_adc_asd', ... + 'max_dac_rms', 'max_amp_rms', 'max_adc_rms'); +#+end_src + +#+begin_src matlab :exports none :eval no +%% Save Requirements +save('./mat/instrumentation_requirements.mat', ... + 'max_dac_asd', 'max_amp_asd', 'max_adc_asd', ... + 'max_dac_rms', 'max_amp_rms', 'max_adc_rms'); +#+end_src + * Choice of Instrumentation :PROPERTIES: :HEADER-ARGS:matlab+: :tangle matlab/detail_instrumentation_2_choice.m @@ -667,131 +683,6 @@ In this section, also tell which instrumentation has been bought, and different - [ ] block diagram of the model of the amplifier -** Piezoelectric Voltage Amplifier - -Low pass Filter -- Capacitance of the piezoelectric actuator -- Output impedance of the voltage amplifier - -Noise: [[cite:&spengen20_high_voltag_amplif]] - -Bandwidth: [[cite:&spengen16_high_voltag_amplif]] - -A picture of the PD200 amplifier is shown in Figure ref:fig:amplifier_PD200. - -#+name: fig:amplifier_PD200 -#+caption: Picture of the PD200 Voltage Amplifier -#+attr_latex: :width 0.7\linewidth -[[file:figs/amplifier_PD200.png]] - -The specifications as well as the amplifier characteristics as shown in the datasheet are summarized in Table ref:tab:pd200_characteristics. - -#+name: tab:pd200_characteristics -#+caption: Characteristics of the PD200 compared with the specifications -#+attr_latex: :environment tabularx :width 0.7\linewidth :align lcc -#+attr_latex: :center t :booktabs t :float t -| *Characteristics* | *Manual* | *Specification* | -|-------------------------------------+--------------+-----------------| -| Input Voltage Range | +/- 10 [V] | +/- 10 [V] | -| Output Voltage Range | -50/150 [V] | -20/150 [V] | -| Gain | 20 [V/V] | | -| Maximum RMS current | 0.9 [A] | > 50 [mA] | -| Maximum Pulse current | 10 [A] | | -| Slew Rate | 150 [V/us] | | -| Noise (10uF load) | 0.7 [mV RMS] | < 2 [mV rms] | -| Small Signal Bandwidth (10uF load) | 7.4 [kHz] | > 5 [kHz] | -| Large Signal Bandwidth (150V, 10uF) | 300 [Hz] | > 1 [Hz] | - -The most important characteristics are the large (small signal) bandwidth > 5 [kHz] and the small noise (< 2 [mV RMS]). - -For a load capacitance of $10\,\mu F$, the expected $-3\,dB$ bandwidth is $6.4\,kHz$ (Figure ref:fig:pd200_expected_small_signal_bandwidth) and the low frequency noise is $650\,\mu V\,\text{rms}$ (Figure ref:fig:pd200_expected_noise). - -These two characteristics are respectively measured in Section ref:sec:tf_meas and Section ref:sec:noise_meas. - -#+name: fig:pd200_expected_small_signal_bandwidth -#+caption:Expected small signal bandwidth -#+attr_latex: :width 0.7\linewidth -[[file:./figs/pd200_expected_small_signal_bandwidth.png]] - -#+name: fig:pd200_expected_noise -#+caption: Expected Low frequency noise from 0.03Hz to 20Hz -#+attr_latex: :width 0.7\linewidth -[[file:figs/pd200_expected_noise.png]] - -** ADC - -Talk about input impedance, ... -Add resistor, reading of the force sensor: ADC + [[file:~/Cloud/work-projects/ID31-NASS/matlab/test-bench-force-sensor/test-bench-force-sensor.org][test-bench-force-sensor]] - -** DAC - -ADC and DAC need to be sample synchronously with the control system, with low jitter. -[[cite:&abramovitch22_pract_method_real_world_contr_system]] -[[cite:&abramovitch23_tutor_real_time_comput_issues_contr_system]] - -** Relative Displacement Sensors - -- Encoders -- Capacitive Sensors -- Eddy current sensors - -- [ ] Speak about slip-ring issue - -Specifications: -- used for relative positioning -- vertical errors of 15nmRMS => 6nmRMS for each strut -- Stroke > 100um - -The Vionic encoder is shown in Figure ref:fig:encoder_vionic. - -#+name: fig:encoder_vionic -#+caption: Picture of the Vionic Encoder -#+attr_latex: :width 0.6\linewidth -[[file:figs/encoder_vionic.png]] - -From the Renishaw [[https://www.renishaw.com/en/how-optical-encoders-work--36979][website]]: -#+begin_quote -The VIONiC encoder features the third generation of Renishaw's unique filtering optics that average the contributions from many scale periods and effectively filter out non-periodic features such as dirt. -The nominally square-wave scale pattern is also filtered to leave a pure sinusoidal fringe field at the detector. -Here, a multiple finger structure is employed, fine enough to produce photocurrents in the form of four symmetrically phased signals. -These are combined to remove DC components and produce sine and cosine signal outputs with high spectral purity and low offset while maintaining *bandwidth to beyond 500 kHz*. - -Fully integrated advanced dynamic signal conditioning, Auto Gain , Auto Balance and Auto Offset Controls combine to ensure *ultra-low Sub-Divisional Error (SDE) of typically* $<\pm 15\, nm$. - -This evolution of filtering optics, combined with carefully-selected electronics, provide incremental signals with wide bandwidth achieving a maximum speed of 12 m/s with the lowest positional jitter (noise) of any encoder in its class. -Interpolation is within the readhead, with fine resolution versions being further augmented by additional noise-reducing electronics to achieve *jitter of just 1.6 nm RMS*. -#+end_quote - -The expected interpolation errors (non-linearity) is shown in Figure ref:fig:vionic_expected_noise. - -#+name: fig:vionic_expected_noise -#+attr_latex: :width \linewidth -#+caption: Expected interpolation errors for the Vionic Encoder -[[file:./figs/vionic_expected_noise.png]] - -The characteristics as advertise in the manual as well as our specifications are shown in Table ref:tab:vionic_characteristics. - -#+name: tab:vionic_characteristics -#+caption: Characteristics of the Vionic compared with the specifications -#+attr_latex: :environment tabularx :width 0.6\linewidth :align lcc -#+attr_latex: :center t :booktabs t :float t -| *Characteristics* | *Specification* | *Manual* | -|-------------------+-----------------+--------------| -| Time Delay | < 0.5 ms | < 10 ns | -| Bandwidth | > 5 kHz | > 500 kHz | -| Noise | < 50 nm rms | < 1.6 nm rms | -| Linearity | | < +/- 15 nm | -| Range | > 200 um | Ruler length | - -* Characterization of Instrumentation -:PROPERTIES: -:HEADER-ARGS:matlab+: :tangle matlab/detail_instrumentation_3_characterization.m -:END: -<> -** Introduction :ignore: - -For each element, make a table with the specifications, and the measured performances for comparison. - ** Matlab Init :noexport:ignore: #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) <> @@ -813,11 +704,169 @@ For each element, make a table with the specifications, and the measured perform <> #+end_src -** Analog to Digital Converters +#+begin_src matlab +%% Load computed requirements +load('instrumentation_requirements.mat') +#+end_src -[[file:~/Cloud/work-projects/ID31-NASS/matlab/test-bench-PD200/test-bench-pd200.org::*Quantization Noise of the ADC][Quantization Noise of the ADC]] +** Piezoelectric Voltage Amplifier +**** Introduction :ignore: -**** Quantization Noise +There are several characteristics of the piezoelectric voltage amplifiers that should be considered. +To be able to use the full stroke of the piezoelectric actuator, the voltage output should be between -20 and 150V. +It should accept an analog input voltage, preferably between -10 and 10V. + + +**** Small signal Bandwidth and Output Impedance + +There are two bandwidth that should be considered for a piezoelectric voltage amplifier: large signal bandwidth and small signal bandwidth. +Large signal bandwidth are linked to the output current capacities of the amplifier and will be discussed next. + +Small signal bandwidth of the voltage amplifier is very important for feedback applications as it can limit the bandwidth of the complete feedback system. + +A simplified electrical model of a voltage amplifier connected to a piezoelectric stack is shown in Figure ref:fig:detail_instrumentation_amp_output_impedance. +This model is only valid for small signals, but it well models the small signal bandwidth limitation [[cite:&fleming14_desig_model_contr_nanop_system, chap. 14]]. +$R_o$ corresponds to the output impedance of the amplifier. +With the piezoelectric load that corresponds to a capacitance $C_p$, it forms a first order low pass filter eqref:eq:detail_instrumentation_amp_output_impedance. + +\begin{equation}\label{eq:detail_instrumentation_amp_output_impedance} + \frac{V_a}{V_i}(s) = \frac{1}{1 + \frac{s}{\omega_0}}, \quad \omega_0 = \frac{1}{R_o C_p} +\end{equation} + +#+name: fig:detail_instrumentation_amp_output_impedance +#+caption: Electrical model of a voltage amplifier with output impedance $R_0$ connected to a piezoelectric stack with capacitance $C_p$ +[[file:figs/detail_instrumentation_amp_output_impedance.png]] + +Therefore, the small signal bandwidth is load dependent. +As the capacitance load of the two piezoelectric stacks correspond to a capacitance $C_p = 8.8\,\mu F$. +If a small signal bandwidth of $f_0 = \frac{\omega_0}{2\pi} = 5\,kHz$ is wanted, it corresponds to a maximum output impedance of $R_0 = 3.6\,\Omega$. + +#+begin_src matlab +Cp = 8.8e-6; % Capacitive load of the two piezoelectric actuators +f0 = 5e3; % Wanted low signal bandwidth [Hz] +Ro_max = 1/(2*pi*f0 * Cp); % Maximum wanted output impedance [Ohm] +#+end_src + +**** Large signal Bandwidth + +Large signal bandwidth are linked to the maximum output capabilities of the amplifiers in terms of amplitude as a function of frequency [[cite:&spengen16_high_voltag_amplif]]. + +As the primary objective of the NASS is to stabilize the position and not to perform scans, this specification is not as important as the small signal bandwidth. + +However, let's take into account scanning capabilities. +In the worst case: constant velocity scan (i.e. triangular reference signal) with a repetition rate of $f_r = 100\,\text{Hz}$ and using full voltage capabilities of the piezoelectric actuator $V_{pp} = 170\,V$. + +There are two things to consider: +- Slew rate that should be above $2 \cdot V_{pp} \cdot f_r = 34\,V/ms$ + This specification is easily achieved +- Current output capabilities: as the capacitance impedance decreases the the inverse of the frequency, it can reach very low values at high frequency + In order to reach high voltage at high frequency, the required current that the voltage amplifier needs to provide may reach very large values. + $I_{\text{max}} = 2 \cdot V_{pp} \cdot f \cdot C_p = 0.3\,A$ + +#+begin_src matlab +%% Slew-rate specifications - Triangular scan +Vpp = 170; % Full voltage scan [V] +f0 = 100; % Repetition rate of the triangular scan [Hz] + +slew_rate = 1e-3*2*Vpp*f0 % Required slew rate [V/ms] + +%% Maximum Output Current - Triangular scan +max_current = 2*Vpp*f0*Cp % [A] +#+end_src + +**** Output voltage noise + +As discussed in Section ref:sec:detail_instrumentation_dynamic_error_budgeting, the output noise of the voltage amplifier should be smaller than $20\,mV\,\text{RMS}$. + +As explained in [[cite:&spengen20_high_voltag_amplif]], the load capacitance of the piezoelectric stack filters the output noise of the amplifier (low pass filter of Figure ref:fig:detail_instrumentation_amp_output_impedance). +Therefore, when comparing noise of different voltage amplifiers, it should be noted what capacitance of the load is considered (i.e. the low signal bandwidth considered). + +Here, the output noise should be smaller than 20mVRMS for a load of 8.8uF. + +**** Choice of voltage amplifier + +The specifications as well as the amplifier characteristics as shown in the datasheet are summarized in Table ref:tab:pd200_characteristics. + +The most important characteristics are the (small signal) bandwidth > 5 [kHz] and the output voltage noise (< 20 [mV RMS]). + + +- Issue for the selection: manufacturers are not specifying the output noise as a function of frequency (i.e. the ASD of the noise), but only the RMS value (i.e. the integrated value over all frequency). + It does not take into account the frequency dependency of the noise, that is very important to perform error budgets + Also, the load the estimate the bandwidth and noise is often not mentioned (or no load for the bandwidth, and high capacitive load for the noise). +- Explain why the PD200 was selected: + - fulfill the specification + - clear documentation, especially about noise and bandwidth (Figure ref:fig:detail_instrumentation_pd200_specs) + +#+name: tab:pd200_characteristics +#+caption: Characteristics of the PD200 compared with the specifications +#+attr_latex: :environment tabularx :width \linewidth :align Xcccc +#+attr_latex: :center t :booktabs t :float t +| *Specification* | *PD200* | WMA-200 | LA75B | E-505 | +|---------------------------------------------------------+------------------------------------------+-------------------------------------------+----------------------+-----------| +| Input Voltage Range: $\pm 10\,V$ | $\pm 10\,V$ | $\pm8.75\,V$ | $-1/7.5\,V$ | | +| Output Voltage Range: $-20/150\,V$ | $-50/150\,V$ | $\pm 175\,V$ | $-20/150\,V$ | -30/130 | +| Gain | 20 | 20 | 20 | 10 | +| Output Current $> 50\,mA$ | $900\,mA$ | $150\,mA$ | $360\,mA$ | $215\,mA$ | +| Slew Rate $> 34\,V/ms$ | $150\,V/\mu s$ | $80\,V/\mu s$ | n/a | n/a | +| Output noise (10uF load) $< 20\,mV\ \text{RMS}$ | $0.7\,mV\,\text{RMS}$ ($10\,\mu F$ load) | $0.05\,mV$ ($10\,\mu F$ load) | $3.4\,mV$ | $0.6\,mV$ | +| Small Signal Bandwidth ($10\,\mu F$ load): $> 5\,kHz$ | $6.4\,kHz$ ($10\,\mu F$ load) | $300\,Hz$[fn:detail_instrumentation_1] | $30\,kHz$ (unloaded) | n/a | +| Output Impedance: $< 3.6\,\Omega$ | n/a | $50\,\Omega$[fn:detail_instrumentation_1] | n/a | n/a | + +#+name: fig:detail_instrumentation_pd200_specs +#+caption: Caption with reference to sub figure (\subref{fig:detail_instrumentation_pd200_specs_bandwidth}) +#+attr_latex: :options [htbp] +#+begin_figure +#+attr_latex: :caption \subcaption{\label{fig:detail_instrumentation_pd200_specs_bandwidth}sub caption a} +#+attr_latex: :options {0.48\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.95\linewidth +[[file:figs/detail_instrumentation_pd200_specs_bandwidth.png]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:detail_instrumentation_pd200_specs_noise}sub caption b} +#+attr_latex: :options {0.48\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.95\linewidth +[[file:figs/detail_instrumentation_pd200_specs_noise.png]] +#+end_subfigure +#+end_figure + +** ADC and DAC +**** Synchronicity and Jitter + +For control systems, it is very important that the inputs and outputs are sampled synchronously with the controller and with low jitter [[cite:&abramovitch22_pract_method_real_world_contr_system;&abramovitch23_tutor_real_time_comput_issues_contr_system]]. + +Therefore, the ADC and DAC: +- Needs to be well interfaced with the Speedgoat +- Sampling frequency of 10kHz +- Synchronous with the Speedgoat + +**** Sampling Frequency, Bandwidth and delays + +Several requirements that may appear the same but are different: +- Sampling frequency: defines the interval between two sampled points, also determines the Nyquist frequency +- Bandwidth: defines the maximum frequency of a measured signal (typically specified as the -3dB point), usually limited by implemented anti-aliasing filters +- Delay/latency: delay between the analog signal at the input of the ADC to the digital information transferred to the control system + +Sigma-Delta ADC can have extremely good noise characteristics, high bandwidth and sampling frequency but very poor latency. +Typically, the latency can reach 20 times the sampling period [[cite:&schmidt20_desig_high_perfor_mechat_third_revis_edition, chapt. 8.4]]. + +Therefore, Sigma-Delta ADC are very well used for signal acquisition, but has limited use for real-time control where latency is critical. +Therefore, for real time control applications, SAR-ADC (Successive approximation ADCs) is still the mostly applied type because of its single sample latency. + +**** ADC Noise + +From the dynamical error budget in Section ref:sec:detail_instrumentation_dynamic_error_budgeting +Measurement noise ASD should be bellow 11uV/sqrt(Hz), 0.8mV RMS + +Linearity is not a concerned as it is not used for positioning but only for active damping +So the accuracy of the measurement is not a concern + +ADC are affected by various noise sources +One of them is quantization noise, and is linked to the fact that input/output values can only take a finite number of values. +Let's first find the number of bits such that the quantization noise is fulfilling the requirements. + +Let's first suppose that the ADC is ideal and the only noise comes from the quantization error. +Interestingly, the noise amplitude is uniformly distributed. Let's note: - $q = \frac{\Delta V}{2^n}$ the quantization in [V], which is the corresponding value in [V] of the least significant bit @@ -825,29 +874,16 @@ Let's note: - $n$ is the number of ADC's bits - $f_s$ is the sample frequency in [Hz] -#+begin_src matlab -%% Estimate quantization noise of the ADC -delta_V = 20; % +/-10 V -n = 16; % number of bits -Fs = 10e3; % [Hz] - -q = delta_V/2^n; % Quantization in [V] -q_psd = q^2/12/Fs; % Quantization noise Power Spectral Density [V^2/Hz] -q_asd = sqrt(q_psd); % Quantization noise Amplitude Spectral Density [V/sqrt(Hz)] -#+end_src - -Let's suppose that the ADC is ideal and the only noise comes from the quantization error. -Interestingly, the noise amplitude is uniformly distributed. - The quantization noise can take a value between $\pm q/2$, and the probability density function is constant in this range (i.e., it’s a uniform distribution). -Since the integral of the probability density function is equal to one, its value will be $1/q$ for $-q/2 < e < q/2$ (Fig. ref:fig:probability_density_function_adc). +Since the integral of the probability density function is equal to one, its value will be $1/q$ for $-q/2 < e < q/2$ (Fig. ref:fig:detail_instrumentation_adc_quantization). -#+begin_src latex :file probability_density_function_adc.pdf +#+begin_src latex :file detail_instrumentation_adc_quantization.pdf \begin{tikzpicture} \path[fill=black!20!white] (-1, 0) |- (1, 1) |- (-1, 0); \draw[->] (-2, 0) -- (2, 0) node[above left]{$e$}; \draw[->] (0, -0.5) -- (0, 2) node[below right]{$p(e)$}; + \draw[dashed] (-2, 0) -- (-1, 0) |- (1, 1) |- (2, 0); \node[below] at (1, 0){$\frac{q}{2}$}; \node[below] at (-1, 0){$-\frac{q}{2}$}; @@ -855,10 +891,10 @@ Since the integral of the probability density function is equal to one, its valu \end{tikzpicture} #+end_src -#+name: fig:probability_density_function_adc +#+name: fig:detail_instrumentation_adc_quantization #+caption: Probability density function $p(e)$ of the ADC error $e$ #+RESULTS: -[[file:figs/probability_density_function_adc.png]] +[[file:figs/detail_instrumentation_adc_quantization.png]] Now, we can calculate the time average power of the quantization noise as \begin{equation} @@ -869,7 +905,7 @@ The other important parameter of a noise source is the power spectral density (P To find the power spectral density, we need to calculate the Fourier transform of the autocorrelation function of the noise. Assuming that the noise samples are not correlated with one another, we can approximate the autocorrelation function with a delta function in the time domain. -Since the Fourier transform of a delta function is equal to one, the *power spectral density will be frequency independent*. +Since the Fourier transform of a delta function is equal to one, the power spectral density will be frequency independent (i.e. white noise). Therefore, the quantization noise is white noise with total power equal to $P_q = \frac{q^2}{12}$. Thus, the two-sided PSD (from $\frac{-f_s}{2}$ to $\frac{f_s}{2}$), we should divide the noise power $P_q$ by $f_s$: @@ -881,85 +917,493 @@ Finally, the Power Spectral Density of the quantization noise of an ADC is equal \begin{equation} \begin{aligned} \Gamma &= \frac{q^2}{12 f_s} \\ - &= \frac{\left(\frac{\Delta V}{2^n}\right)^2}{12 f_s} \text{ in } \left[ \frac{V^2}{Hz} \right] + &= \frac{\left(\frac{\Delta V}{2^n}\right)^2}{12 f_s} \quad \text{in} \quad \left[ \frac{V^2}{Hz} \right] \end{aligned} \end{equation} -Let's take a 16bits ADC with a range of +/-10V and a sample frequency of 10kHz. - -The quantization is: -\[ q = \frac{20}{2^{16}} \approx 0.3\,mV \] - -\[ \Gamma_Q = \frac{q^2}{12 f_N} = 7.5 \cdot 10^{-13} \quad [V^2/Hz] \] - -ASD: -\[ 0.88\,\mu V/\sqrt{Hz} \] - - -**** Speedgoat - IO131 board - -Internally uses the AD7609 ADC from Analog Devices. -200kSPS -16 bits -+/-10V - -*oversampling*: [[id:5204af2e-d4e9-4ea3-a0b6-5697e5d0546c][Analog to Digital Converters]] - -cite:lab13_improv_adc - -To have additional $w$ bits of resolution, the oversampling frequency $f_{os}$ should be: +The minimum number of bits so that the quantization noise is above some define values can be computed using: \begin{equation} -f_{os} = 4^w \cdot f_s + n_{\text{min}} = \text{log}_2 \left( \frac{\Delta V}{\sqrt{12 Fs} \Phi_{\text{max}}} \right) \end{equation} -[[cite:hauser91_princ_overs_conver]] +With a sampling frequency $F_s = 10\,kHz$, a full range of $\Delta V = 20\,V$ and a maximum allowed ASD $\Phi_{\text{max}} = 11\,\mu V/\sqrt{Hz}$, the minimum number of bits is $n_{\text{min}} = 12.4$, which is easily satisfied. -#+begin_quote -Key points to consider are: -- The noise must approximate *white noise* with uniform power spectral density over the frequency band of interest. -- The *noise amplitude must be sufficient* to cause the input signal to change randomly from sample to sample by amounts comparable to at least the distance between two adjacent codes (i.e., 1 LSB). -- The input signal can be represented as a random variable that has equal probability of existing at any value between two adjacent ADC codes. -#+end_quote - -- [X] Check noise and compare with quantization noise -- [ ] See is oversampling increase performances, and how much compared to the prediction - Seems to increase the perf too much - -**** Measured Noise #+begin_src matlab -adc_noise = load("2023-08-23_15-42_io131_adc_noise.mat"); -adc_noise_os8 = load("2023-08-23_16-00_io131_adc_noise_os8.mat"); -adc_noise_os16 = load("2023-08-23_16-02_io131_adc_noise_os16.mat"); +delta_V = 20; % +/-10 V +Fs = 10e3; % Sampling Frequency [Hz] +max_adc_asd = 11e-6; % V/sqrt(Hz) + +min_n = log2(delta_V/(sqrt(12*Fs)*max_adc_asd)) #+end_src #+begin_src matlab +%% Estimate quantization noise of the ADC +delta_V = 20; % +/-10 V +n = 16; % number of bits +Fs = 10e3; % [Hz] + +q = delta_V/2^n; % Quantization in [V] +q_psd = q^2/12/Fs; % Quantization noise Power Spectral Density [V^2/Hz] +q_asd = sqrt(q_psd) % Quantization noise Amplitude Spectral Density [V/sqrt(Hz)] +#+end_src + +**** DAC Output voltage noise + +Similarly, the DAC output voltage noise ASD should be below $14\,\mu V/\sqrt{Hz}$, 1mV RMS. +This corresponds to a 13bits +/-10V DAC. + +**** Choice of the ADC and DAC Board + +Based on the above analysis, the choice of ADC and DAC is quite simple. + +Integrated in Speedgoat for best synchronicity. +Chosen model: IO131: +- 16 analog inputs, based on the AD7609 + - 16 bits, +/- 10V + - Maximum sampling rate of 200kSPS + - Simultaneous sampling + - Differential inputs: can use shielded twisted pairs for high noise immunity +- 8 analog outputs, based on the AD5754R + - 16 bits, +/- 10V + - Conversion time 10us + - Simultaneous update + +Noise is not specified, but as it has 16 bits resolution, it should be well below the requirements. +It will be experimentally measured in Section ref:sec:detail_instrumentation_characterization. + +** Relative Displacement Sensors + +Specifications: +- used for relative positioning +- Small enough to be integrated in each strut +- vertical errors of 15nmRMS => 6nmRMS for each strut => maximum 6nmRMS sensor noise +- Stroke > 100um + +There are many different sensors that can fulfil the requirements [[cite:&fleming13_review_nanom_resol_posit_sensor]]: +- Encoders +- Capacitive Sensors +- Eddy current sensors + +#+name: fig:detail_instrumentation_sensor_examples +#+caption: Measurement of strut flexible modes +#+attr_latex: :options [htbp] +#+begin_figure +#+attr_latex: :caption \subcaption{\label{fig:detail_instrumentation_sensor_encoder}Optical Linear Encoder} +#+attr_latex: :options {0.33\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.9\linewidth +[[file:figs/detail_instrumentation_sensor_encoder.jpg]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:detail_instrumentation_sensor_eddy_current}Eddy Current Sensor} +#+attr_latex: :options {0.33\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.9\linewidth +[[file:figs/detail_instrumentation_sensor_eddy_current.png]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:detail_instrumentation_sensor_capacitive}Capacitive Sensor} +#+attr_latex: :options {0.33\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.9\linewidth +[[file:figs/detail_instrumentation_sensor_capacitive.jpg]] +#+end_subfigure +#+end_figure + +The implementation: +- slight advantage to capacitive or eddy current sensors as they can measure in line with the APA (Figure ref:fig:detail_instrumentation_capacitive_implementation) +- for the encoder, the measurement has to be "offset" from the strut "action line", and therefore relative rotations between the two ends of the APA induces measurement errors (Figure ref:fig:detail_instrumentation_encoder_implementation). + +#+name: fig:detail_instrumentation_sensor_implementation +#+caption: Caption with reference to sub figure +#+attr_latex: :options [htbp] +#+begin_figure +#+attr_latex: :caption \subcaption{\label{fig:detail_instrumentation_encoder_implementation}Optical Encoder} +#+attr_latex: :options {0.48\textwidth} +#+begin_subfigure +#+attr_latex: :scale 1 +[[file:figs/detail_instrumentation_encoder_implementation.png]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:detail_instrumentation_capacitive_implementation}Capacitive Sensor} +#+attr_latex: :options {0.48\textwidth} +#+begin_subfigure +#+attr_latex: :scale 1 +[[file:figs/detail_instrumentation_capacitive_implementation.png]] +#+end_subfigure +#+end_figure + +One major issue is the fact that the sensor signals have to pass through an electrical slip-ring (because of the continuous spindle rotation). +Some measurements were performed on the slip-ring integrated in the micro-station, and the cross-talk between different slip-ring channels were found to be quite high. +It was preferred to use a sensor that transmit the measured displacement digitally, such that it is much less sensitive to noise and cross-talk. +For that reason, an optical encoder with digital output was preferred (i.e. the interpolation is performed directly in the head). + +The specifications are summarized in Table ref:tab:detail_instrumentation_sensor_specs. + +#+name: tab:detail_instrumentation_sensor_specs +#+caption: Characteristics of the Vionic compared with the specifications +#+attr_latex: :environment tabularx :width 0.6\linewidth :align Xccc +#+attr_latex: :center t :booktabs t :float t +| *Specification* | *Renishaw Vionic* | LION CPL190 | Cedrat ECP500 | +|-----------------------------+-------------------+-------------+---------------| +| Bandwidth $> 5\,\text{kHz}$ | > 500 kHz | 10kHz | 20kHz | +| Noise $< 6\,nm\,\text{RMS}$ | 1.6 nm rms | 4 nm rms | 15 nm rms | +| Range $> 100\,\mu m$ | Ruler length | 250 um | 500um | +| In line measurement | | $\times$ | $\checkmark$ | +| Digital Output | $\times$ | | | + +* Characterization of Instrumentation +:PROPERTIES: +:HEADER-ARGS:matlab+: :tangle matlab/detail_instrumentation_3_characterization.m +:END: +<> +** Introduction :ignore: + +All the instrumentation was then procured and tested individually to verify whether is fulfils the specifications or not. + +- [ ] Code couleur: + | Yellow | ADC | + | Rouge | PD200 | + | Vert | Femto | + | blue | DAC | +- [ ] Make sure that at some point I talk about twisted pairs etc.. Maybe use the nice schematic? + +** Matlab Init :noexport:ignore: +#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) +<> +#+end_src + +#+begin_src matlab :exports none :results silent :noweb yes +<> +#+end_src + +#+begin_src matlab :tangle no :noweb yes +<> +#+end_src + +#+begin_src matlab :eval no :noweb yes +<> +#+end_src + +#+begin_src matlab :noweb yes +<> +#+end_src + +#+begin_src matlab +%% Load computed requirements +load('instrumentation_requirements.mat') +#+end_src + +#+begin_src matlab +%% Sensitivity to disturbances +load('instrumentation_sensitivity.mat', 'Gd'); +#+end_src + +** Analog to Digital Converters +**** Introduction :ignore: + +Internally uses the AD7609 ADC from Analog Devices. +200kSPS, 16 bits, +/-10V + +**** Measured Noise +The ADC noise of the IO131 was simply measured by short-circuiting its input with a 50 Ohm resistor. +Results are shown in Figure ref:fig:detail_instrumentation_adc_noise_measured. +The ADC noise is a white noise with an amplitude spectral density of $5.6\,\mu V/\sqrt{Hz}$. + +#+begin_src matlab +%% ADC noise +adc = load("2023-08-23_15-42_io131_adc_noise.mat"); + % Spectral Analysis parameters Ts = 1e-4; Nfft = floor(1/Ts); win = hanning(Nfft); Noverlap = floor(Nfft/2); % Identification of the transfer function from Va to di -[pxx_adc, f] = pwelch(detrend(adc_noise.adc_1, 0), win, Noverlap, Nfft, 1/Ts); -[pxx_adc_os8, ~] = pwelch(detrend(adc_noise_os8.adc_1, 0), win, Noverlap, Nfft, 1/Ts); -[pxx_adc_os16, ~] = pwelch(detrend(adc_noise_os16.adc_1, 0), win, Noverlap, Nfft, 1/Ts); +[pxx, f] = pwelch(detrend(adc.adc_1, 0), win, Noverlap, Nfft, 1/Ts); + +adc.pxx = pxx; +adc.f = f; + +% estimated mean ASD +sprintf('Mean ASD of the ADC: %.1f uV/sqrt(Hz)', 1e6*sqrt(mean(adc.pxx))) + +% Estimate quantization noise of the IO318 ADC +delta_V = 20; % +/-10 V +n = 16; % number of bits +Fs = 10e3; % [Hz] + +adc.q = delta_V/2^n; % Quantization in [V] +adc.q_psd = adc.q^2/12/Fs; % Quantization noise Power Spectral Density [V^2/Hz] +adc.q_asd = sqrt(adc.q_psd); % Quantization noise Amplitude Spectral Density [V/sqrt(Hz)] #+end_src -#+begin_src matlab +#+begin_src matlab :exports none :results none +%% Measured ADC noise (IO318) figure; hold on; -plot(f, sqrt(pxx_adc), 'DisplayName', 'NOS') -plot(f, sqrt(pxx_adc_os8), 'DisplayName', '8 OS') -plot(f, sqrt(pxx_adc_os16), 'DisplayName', '16 OS') -plot([f(2), f(end)], [q_asd, q_asd], 'k--', 'DisplayName', 'Quantization noise') +plot(adc.f, sqrt(adc.pxx), 'color', colors(3,:), 'DisplayName', sprintf('Measured, %.2f mV RMS', 1e3*rms(detrend(adc.adc_1,0)))) +plot([adc.f(2), adc.f(end)], [max_adc_asd, max_adc_asd], '--', 'color', colors(3,:), 'DisplayName', sprintf('Specs, %.2f mV RMS', max_adc_rms)) +plot([adc.f(2), adc.f(end)], [adc.q_asd, adc.q_asd], 'k--', 'DisplayName', 'Quantization noise (16 bits, $\pm 10\,V$)') hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); xlabel('Frequency [Hz]'); ylabel('ASD [V/$\sqrt{Hz}$]'); -ylim([1e-7, 1e-4]) +legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); +ylim([1e-10, 4e-4]); xlim([1, 5e3]); +xticks([1e0, 1e1, 1e2, 1e3]) #+end_src +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/detail_instrumentation_adc_noise_measured.pdf', 'width', 'normal', 'height', 'normal'); +#+end_src + +#+name: fig:detail_instrumentation_adc_noise_measured +#+caption: Measured ADC noise (IO318) +#+RESULTS: +[[file:figs/detail_instrumentation_adc_noise_measured.png]] + +If required, it is possible to apply some oversampling to lower the obtained noise cite:lab13_improv_adc. +# *oversampling*: [[id:5204af2e-d4e9-4ea3-a0b6-5697e5d0546c][Analog to Digital Converters]] + +To have additional $w$ bits of resolution, the oversampling frequency $f_{os}$ should be: +\begin{equation} + f_{os} = 4^w \cdot f_s +\end{equation} + +As the ADC can work at 200kSPS, and we only need 10kSPS, we can have an oversampling factor of 16 and have two more bits of resolution (i.e. reducing the noise by a factor 4). +This works because the noise can be approximated by a white noise and the amplitude is larger than 1 LSB (0.3 mV) [[cite:hauser91_princ_overs_conver]]. + +# Key points to consider are: +# - The noise must approximate *white noise* with uniform power spectral density over the frequency band of interest. +# - The *noise amplitude must be sufficient* to cause the input signal to change randomly from sample to sample by amounts comparable to at least the distance between two adjacent codes (i.e., 1 LSB). +# - The input signal can be represented as a random variable that has equal probability of existing at any value between two adjacent ADC codes. + +**** Reading of piezoelectric force sensor + +There are few other things to consider when measuring the voltage generated by a piezoelectric stack. + +# Talk about input impedance, ... +# Add resistor, reading of the force sensor: ADC + [[file:~/Cloud/work-projects/ID31-NASS/matlab/test-bench-force-sensor/test-bench-force-sensor.org][test-bench-force-sensor]] + +The setup is shown in Figure ref:fig:detail_instrumentation_force_sensor_adc_setup where two stacks are used as actuator (in parallel) and one stack is used as sensor. +The voltage amplifier used has a gain of 20 [V/V]. + +#+name: fig:detail_instrumentation_force_sensor_adc_setup +#+caption: Schematic of the setup +[[file:figs/detail_instrumentation_force_sensor_adc_setup.png]] + +#+begin_src matlab +%% Read force sensor voltage with the ADC +load('force_sensor_steps.mat', 't', 'encoder', 'u', 'v'); + +% Exponential fit to compute the time constant +% Fit function +f_exp = @(b,x) b(1).*exp(-b(2).*x) + b(3); + +% Three steps are performed at the following time intervals: +t_s = [ 2.5, 23; + 23.8, 35; + 35.8, 50]; + +tau = zeros(size(t_s, 1),1); % Time constant [s] +V0 = zeros(size(t_s, 1),1); % Offset voltage [V] +a = zeros(size(t_s, 1),1); % + +for t_i = 1:size(t_s, 1) + t_cur = t(t_s(t_i, 1) < t & t < t_s(t_i, 2)); + t_cur = t_cur - t_cur(1); + y_cur = v(t_s(t_i, 1) < t & t < t_s(t_i, 2)); + + nrmrsd = @(b) norm(y_cur - f_exp(b,t_cur)); % Residual Norm Cost Function + B0 = [0.5, 0.15, 2.2]; % Choose Appropriate Initial Estimates + [B,rnrm] = fminsearch(nrmrsd, B0); % Estimate Parameters ‘B’ + + a(t_i) = B(1); + tau(t_i) = 1/B(2); + V0(t_i) = B(3); +end + +% Data to show the exponential fit +t_fit_1 = linspace(t_s(1,1), t_s(1,2), 100); +y_fit_1 = f_exp([a(1),1/tau(1),V0(1)], t_fit_1-t_s(1,1)); + +t_fit_2 = linspace(t_s(2,1), t_s(2,2), 100); +y_fit_2 = f_exp([a(2),1/tau(2),V0(2)], t_fit_2-t_s(2,1)); + +t_fit_3 = linspace(t_s(3,1), t_s(3,2), 100); +y_fit_3 = f_exp([a(3),1/tau(3),V0(3)], t_fit_3-t_s(3,1)); + +% Speedgoat ADC input impedance +Cp = 4.4e-6; % [F] +Rin = abs(mean(tau))/Cp; % [Ohm] + +% Estimated input bias current +in = mean(V0)/Rin; % [A] + +% Resistor added in parallel to the force sensor +fc = 3; % Wanted corner frequency [Hz] +Ra = Rin/(fc*Cp*Rin - 1); % [Ohm] + +% New ADC offset voltage +V_offset = Ra*Rin/(Ra + Rin) * in; % [V] +#+end_src + +The excitation signal (steps) and measured voltage across the sensor stack are shown in Figure ref:fig:detail_instrumentation_step_response_force_sensor. +The measured voltage shows an exponential decay which indicates that the charge across the capacitor formed by the stack is discharging into a resistor. +This corresponds to an RC circuit with a time constant $\tau = R_i C_p$. +Therefore, first order high filter, with corner frequency $1/\tau$. + +The exponential curves are fitted and a value of $\tau = 6.5\,s$ and an offset voltage of $2.26\,V$ are found. + +With the capacitance being $C_p = 4.4 \mu F$, the internal impedance of the Speedgoat ADC can be computed as follows $R_i = \frac{\tau}{C_p} = 1.5\,M\Omega$. + +It is close to the specified value of $1\,M\Omega$ found in the datasheet + +#+begin_src matlab :exports none :results none +%% Measured voltage accross the sensor stacks - Voltage steps are applied to the actuators +figure; +tiledlayout(1, 1, 'TileSpacing', 'compact', 'Padding', 'None'); +nexttile(); +hold on; +plot(t, u, 'DisplayName', '$u$'); +plot(t, v, 'DisplayName', '$V_s$'); +plot(t_fit_1, y_fit_1, 'k--', 'DisplayName', 'fit'); +plot(t_fit_2, y_fit_2, 'k--', 'HandleVisibility', 'off'); +plot(t_fit_3, y_fit_3, 'k--', 'HandleVisibility', 'off'); +hold off; +xlabel('Time [s]'); ylabel('Voltage [V]'); +leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; +xlim([0, 50]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file none +exportFig('figs/detail_instrumentation_step_response_force_sensor.pdf', 'width', 500, 'height', 300); +#+end_src + +#+attr_latex: :options [b]{0.48\linewidth} +#+begin_minipage +#+name: fig:detail_instrumentation_step_response_force_sensor +#+caption: Translation Stage +#+attr_latex: :scale 1 :float nil +[[file:figs/detail_instrumentation_step_response_force_sensor.png]] +#+end_minipage +\hfill +#+attr_latex: :options [b]{0.48\linewidth} +#+begin_minipage +#+name: fig:detail_instrumentation_force_sensor_adc +#+caption: Tilt Stage +#+attr_latex: :width 0.95\linewidth :float nil +[[file:figs/detail_instrumentation_force_sensor_adc.png]] +#+end_minipage + +As shown in Figure ref:fig:detail_instrumentation_step_response_force_sensor, the voltage across the Piezoelectric sensor stack shows a constant voltage offset. +This can be explained by looking at the electrical model shown in Figure ref:fig:detail_instrumentation_force_sensor_adc (taken from cite:reza06_piezoel_trans_vibrat_contr_dampin). + +The differential amplifier in the Speedgoat has some input bias current $i_n$ that induces a voltage offset $V_{\text{off}}$ across its own internal resistance $R_i$. +Note that the impedance of the piezoelectric stack is much larger that that at DC. + +Therefore, the input bias current $i_n$ is estimated from $i_n = V_{\text{off}}/R_i = 1.5\,\mu A$. + +In order to reduce the input voltage offset and to increase the corner frequency of the high pass filter, a resistor is added in parallel to the force sensor. + +- Reduction of input voltage offset: + \[ V_{off} = \frac{R_a R_{in}}{R_a + R_{in}} i_n \] +- Increase the high pass corner frequency $f_c$ + \[ C_p \frac{R_{in}R_a}{R_{in} + R_a} = \tau_c = \frac{1}{f_c} \] + \[ R_a = \frac{R_i}{f_c C_p R_i - 1} \] + + +The resistor is chosen such that the high pass corner frequency is equal to 3Hz. +This corresponds to a resistor of $R_p = 80\,k\Omega$. + +With this parallel resistance value, the voltage offset would be $V_{\text{off}} = 0.11\,V$, which is much more acceptable. + +To validate this, a resistor $R_p \approx 82\,k\Omega$ is then added in parallel with the force sensor as shown in Figure ref:fig:detail_instrumentation_force_sensor_adc_R. +After the resistor is added, the same steps response is performed. +And indeed, we obtain a much smaller offset voltage ($V_{\text{off}} = 0.15\,V$) and a much faster time constant ($\tau = 0.45\,s$). +This validates the model of the ADC and the effectiveness of the added resistor. + +#+begin_src matlab +%% Read force sensor voltage with the ADC with added 82.7kOhm resistor +load('force_sensor_steps_R_82k7.mat', 't', 'encoder', 'u', 'v'); + +% Step times +t_s = [1.9, 6; + 8.5, 13; + 15.5, 21; + 22.6, 26; + 30.0, 36; + 37.5, 41; + 46.2, 49.5]; % [s] + +tau = zeros(size(t_s, 1),1); % Time constant [s] +V0 = zeros(size(t_s, 1),1); % Offset voltage [V] +a = zeros(size(t_s, 1),1); % + +for t_i = 1:size(t_s, 1) + t_cur = t(t_s(t_i, 1) < t & t < t_s(t_i, 2)); + t_cur = t_cur - t_cur(1); + y_cur = v(t_s(t_i, 1) < t & t < t_s(t_i, 2)); + + nrmrsd = @(b) norm(y_cur - f_exp(b,t_cur)); % Residual Norm Cost Function + B0 = [0.5, 0.1, 2.2]; % Choose Appropriate Initial Estimates + [B,rnrm] = fminsearch(nrmrsd, B0); % Estimate Parameters ‘B’ + + a(t_i) = B(1); + tau(t_i) = 1/B(2); + V0(t_i) = B(3); +end + +% Data to show the exponential fit +t_fit_1 = linspace(t_s(1,1), t_s(1,2), 100); +y_fit_1 = f_exp([a(1),1/tau(1),V0(1)], t_fit_1-t_s(1,1)); + +t_fit_2 = linspace(t_s(2,1), t_s(2,2), 100); +y_fit_2 = f_exp([a(2),1/tau(2),V0(2)], t_fit_2-t_s(2,1)); + +t_fit_3 = linspace(t_s(3,1), t_s(3,2), 100); +y_fit_3 = f_exp([a(3),1/tau(3),V0(3)], t_fit_3-t_s(3,1)); +#+end_src + +#+begin_src matlab :exports none :results none +%% Measured voltage accross the sensor stacks - Voltage steps are applied to the actuators +figure; +tiledlayout(1, 1, 'TileSpacing', 'compact', 'Padding', 'None'); +nexttile(); +hold on; +plot(t, u, 'DisplayName', '$u$'); +plot(t, v, 'DisplayName', '$V_s$'); +plot(t_fit_1, y_fit_1, 'k--', 'DisplayName', 'fit'); +plot(t_fit_2, y_fit_2, 'k--', 'HandleVisibility', 'off'); +plot(t_fit_3, y_fit_3, 'k--', 'HandleVisibility', 'off'); +hold off; +xlabel('Time [s]'); ylabel('Voltage [V]'); +leg = legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; +xlim([0, 20]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file none +exportFig('figs/detail_instrumentation_step_response_force_sensor_R.pdf', 'width', 500, 'height', 300); +#+end_src + +#+attr_latex: :options [b]{0.48\linewidth} +#+begin_minipage +#+name: fig:detail_instrumentation_step_response_force_sensor_R +#+caption: Translation Stage +#+attr_latex: :scale 1 :float nil +[[file:figs/detail_instrumentation_step_response_force_sensor_R.png]] +#+end_minipage +\hfill +#+attr_latex: :options [b]{0.48\linewidth} +#+begin_minipage +#+name: fig:detail_instrumentation_force_sensor_adc_R +#+caption: Tilt Stage +#+attr_latex: :width 0.95\linewidth :float nil +[[file:figs/detail_instrumentation_force_sensor_adc_R.png]] +#+end_minipage + ** Instrumentation Amplifier -Because the ADC noise may be too large to measure noise of other instruments, a low noise instrumentation amplifier may be used. +Because the ADC noise may be too large to measure noise of other instruments (anything below $5.6\,\mu V/\sqrt{Hz}$ cannot be distinguish from the noise of the ADC itself), a low noise instrumentation amplifier can be used. Different instrumentation amplifiers were used: - EG&G 5113, 4nV/sqrt(Hz), gain up to 100000 (100dB) @@ -967,26 +1411,34 @@ Different instrumentation amplifiers were used: - Koheron AMP200, 2.4nV/sqrt(Hz), gain up to 100 Here, the Femto amplifier is used. -To measure its noise, the gain is set to xxdB, ... -#+begin_src latex :file noise_measure_setup_preamp.pdf +But first, the input noise of the amplifier is characterized. +- Footnote: for variable gain amplifiers, it is more convenient to refer to the input noise rather than the output noise. + +Its input is short circuited, and the output voltage is measured by the ADC. +The maximum amplifier gain of 80dB (i.e. 10000) is used. + +The measured voltage is then divided by 10000 to obtain the equivalent noise at the input of the voltage amplifier. +In that case, the noise of the ADC is negligible, thanks to the high gain used. + +#+begin_src latex :file detail_instrumentation_femto_meas_setup.pdf \begin{tikzpicture} \node[block={0.6cm}{0.6cm}] (const) {$0$}; % Pre Amp - \node[addb, right=0.6 of const] (addna) {}; - \node[block, right=0.4 of addna] (Ga) {$G_a(s)$}; + \node[addb, right=0.4 of const] (addna) {}; + \node[block, right=0.3 of addna] (Ga) {$G_a(s)$}; % ADC - \node[addb, right=1.2 of Ga] (addqad){}; - \node[ADC, right=0.4 of addqad] (ADC) {ADC}; + \node[addb, right=0.8 of Ga] (addqad){}; + \node[ADC, right=0.3 of addqad] (ADC) {ADC}; \draw[->] (const.east) -- (addna.west); \draw[->] (addna.east) -- (Ga.west); - \draw[->] (Ga.east) -- (addqad.west); + \draw[->] (Ga.east) -- (addqad.west); \draw[->] (addqad.east) -- (ADC.west); - \draw[->] (ADC.east) -- node[sloped]{$/$} ++(1.0, 0) node[above left]{$n$}; + \draw[->] (ADC.east) -- node[sloped]{$/$} ++(0.8, 0) node[above left]{$n$}; - \draw[<-] (addna.north) -- ++(0, 0.6) node[below right](na){$n_{a}$}; + \draw[<-] (addna.north) -- ++(0, 0.6) node[below right](na){$n_{a}$}; \draw[<-] (addqad.north) -- ++(0, 0.6) node[below right](qad){$q_{ad}$}; \coordinate[] (top) at (na.north); @@ -994,65 +1446,78 @@ To measure its noise, the gain is set to xxdB, ... % 5113 \begin{scope}[on background layer] - \node[fit={(addna.west|-bot) (Ga.east|-top)}, inner sep=10pt, draw, dashed, fill=black!20!white] (P) {}; + \node[fit={(addna.west|-bot) (Ga.east|-top)}, inner sep=4pt, draw, dashed, fill=colorgreen!20!white] (P) {}; \node[above] at (P.north) {Pre Amp}; \end{scope} % ADC \begin{scope}[on background layer] - \node[fit={(addqad.west|-bot) (ADC.east|-top)}, inner sep=10pt, draw, dashed, fill=black!20!white] (P) {}; + \node[fit={(addqad.west|-bot) (ADC.east|-top)}, inner sep=4pt, draw, dashed, fill=coloryellow!20!white] (P) {}; \node[above] at (P.north) {ADC}; \end{scope} \end{tikzpicture} #+end_src -#+name: fig:noise_measure_setup_preamp -#+caption: Sources of noise in the experimental setup -#+RESULTS: -[[file:figs/noise_measure_setup_preamp.png]] - #+begin_src matlab :exports none %% Femto Input Voltage Noise -femto = load('mat/noise_femto.mat', 't', 'Vout', 'notes'); % Load Data +femto = load('noise_femto.mat', 't', 'Vout', 'notes'); % Load Data % Compute the equivalent voltage at the input of the amplifier femto.Vout = femto.Vout/femto.notes.pre_amp.gain; femto.Vout = femto.Vout - mean(femto.Vout); -% Sampling time / frequency Ts = (femto.t(end) - femto.t(1))/(length(femto.t) - 1); -Fs = 1/Ts; - -% Hanning window -win = hanning(ceil(0.5/Ts)); - +Nfft = floor(1/Ts); +win = hanning(Nfft); +Noverlap = floor(Nfft/2); % Power Spectral Density -[pxx, f] = pwelch(femto.Vout, win, [], [], Fs); +[pxx, f] = pwelch(detrend(femto.Vout, 0), win, Noverlap, Nfft, 1/Ts); % Save the results inside the struct -femto.pxx = pxx; -femto.f = f; +femto.pxx = pxx(f<=5e3); +femto.f = f(f<=5e3); #+end_src -#+begin_src matlab :exports none +#+begin_src matlab :exports none :results none +%% Measured input voltage noise of the Femto voltage pre-amplifier figure; hold on; -plot(femto.f, sqrt(femto.pxx), 'DisplayName', '$\Gamma_{n_a}$'); -plot([1 Fs/2], [adc.Gamma_q, adc.Gamma_q]./femto.notes.pre_amp.gain, 'k--', 'DisplayName', '$\Gamma_{q_{ad}}/|G_a|$'); +plot(femto.f, sqrt(femto.pxx), 'color', colors(5,:), 'DisplayName', '$\Gamma_{n_a}$'); +plot(adc.f, sqrt(adc.pxx)./femto.notes.pre_amp.gain, 'color', colors(3,:), 'DisplayName', '$\Gamma_{q_{ad}}/|G_a|$') hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); xlabel('Frequency [Hz]'); ylabel('ASD [$V/\sqrt{Hz}$]'); legend('location', 'northeast'); -xlim([1, Fs/2]); ylim([1e-11, 1e-7]); +xlim([1, 5e3]); ylim([1e-10, 4e-4]); +xticks([1e0, 1e1, 1e2, 1e3]) #+end_src +#+begin_src matlab :tangle no :exports results :results file none +exportFig('figs/detail_instrumentation_femto_input_noise.pdf', 'width', 'half', 'height', 'normal'); +#+end_src + +#+attr_latex: :options [b]{0.48\linewidth} +#+begin_minipage +#+name: fig:detail_instrumentation_femto_meas_setup +#+caption: Translation Stage +#+attr_latex: :scale 1 :float nil +[[file:figs/detail_instrumentation_femto_meas_setup.png]] +#+end_minipage +\hfill +#+attr_latex: :options [b]{0.48\linewidth} +#+begin_minipage +#+name: fig:detail_instrumentation_femto_input_noise +#+caption: Tilt Stage +#+attr_latex: :scale 1 :float nil +[[file:figs/detail_instrumentation_femto_input_noise.png]] +#+end_minipage + ** Digital to Analog Converters **** Noise Measurement -[[file:~/Cloud/work-projects/ID31-NASS/matlab/test-bench-PD200/test-bench-pd200.org::*16bits DAC noise measurement][16bits DAC noise measurement]] In order not to have any quantization noise and only measure the output voltage noise of the DAC, we "ask" the DAC to output a zero voltage. -The measurement setup is schematically represented in Figure ref:fig:noise_measure_setup_dac. +The measurement setup is schematically represented in Figure ref:fig:detail_instrumentation_dac_setup. The gain of the pre-amplifier is adjusted such that the measured amplified noise is much larger than the quantization noise of the ADC. The Amplitude Spectral Density $\Gamma_n(\omega)$ of the measured signal is computed. @@ -1066,21 +1531,21 @@ And it is verified that the Amplitude Spectral Density of $n_{da}$ is much large \Gamma_{n_{da}} \gg \Gamma_{n_a} \end{equation} -#+begin_src latex :file noise_measure_setup_dac.pdf +#+begin_src latex :file detail_instrumentation_dac_setup.pdf \begin{tikzpicture} \node[block={0.6cm}{0.6cm}] (const) {$0$}; % DAC - \node[DAC, right=0.6 of const] (DAC) {DAC}; - \node[addb, right=0.4 of DAC] (addnda){}; + \node[DAC, right=0.4 of const] (DAC) {DAC}; + \node[addb, right=0.3 of DAC] (addnda){}; % Pre Amp - \node[addb, right=1.2 of addnda] (addna) {}; - \node[block, right=0.4 of addna] (Ga) {$G_a(s)$}; + \node[addb, right=0.8 of addnda] (addna) {}; + \node[block, right=0.3 of addna] (Ga) {$G_a(s)$}; % ADC - \node[addb, right=1.2 of Ga] (addqad){}; - \node[ADC, right=0.4 of addqad] (ADC) {ADC}; + \node[addb, right=0.8 of Ga] (addqad){}; + \node[ADC, right=0.3 of addqad] (ADC) {ADC}; \draw[->] (const.east) -- node[sloped]{$/$} (DAC.west); \draw[->] (DAC.east) -- (addnda.west); @@ -1088,10 +1553,10 @@ And it is verified that the Amplitude Spectral Density of $n_{da}$ is much large \draw[->] (addna.east) -- (Ga.west); \draw[->] (Ga.east) -- (addqad.west); \draw[->] (addqad.east) -- (ADC.west); - \draw[->] (ADC.east) -- node[sloped]{$/$} ++(1.0, 0); + \draw[->] (ADC.east) -- node[sloped]{$/$} ++(0.8, 0); - \draw[<-] (addnda.north) -- ++(0, 0.6) node[below right](nda){$n_{da}$}; - \draw[<-] (addna.north) -- ++(0, 0.6) node[below right](na){$n_{a}$}; + \draw[<-] (addnda.north) -- ++(0, 0.6) node[below left](nda){$n_{da}$}; + \draw[<-] (addna.north) -- ++(0, 0.6) node[below right](na){$n_{a}$}; \draw[<-] (addqad.north) -- ++(0, 0.6) node[below right](qad){$q_{ad}$}; \coordinate[] (top) at (na.north); @@ -1099,134 +1564,183 @@ And it is verified that the Amplitude Spectral Density of $n_{da}$ is much large % DAC \begin{scope}[on background layer] - \node[fit={(DAC.west|-bot) (addnda.east|-top)}, inner sep=10pt, draw, dashed, fill=black!20!white] (P) {}; + \node[fit={(DAC.west|-bot) (addnda.east|-top)}, inner sep=4pt, draw, dashed, fill=colorblue!20!white] (P) {}; \node[above] at (P.north) {DAC}; \end{scope} % 5113 \begin{scope}[on background layer] - \node[fit={(addna.west|-bot) (Ga.east|-top)}, inner sep=10pt, draw, dashed, fill=black!20!white] (P) {}; + \node[fit={(addna.west|-bot) (Ga.east|-top)}, inner sep=4pt, draw, dashed, fill=colorgreen!20!white] (P) {}; \node[above] at (P.north) {Pre Amp}; \end{scope} % ADC \begin{scope}[on background layer] - \node[fit={(addqad.west|-bot) (ADC.east|-top)}, inner sep=10pt, draw, dashed, fill=black!20!white] (P) {}; + \node[fit={(addqad.west|-bot) (ADC.east|-top)}, inner sep=4pt, draw, dashed, fill=coloryellow!20!white] (P) {}; \node[above] at (P.north) {ADC}; \end{scope} \end{tikzpicture} #+end_src -#+name: fig:noise_measure_setup_dac -#+caption: Sources of noise in the experimental setup +#+name: fig:detail_instrumentation_dac_setup +#+caption: Figure caption #+RESULTS: -[[file:figs/noise_measure_setup_dac.png]] +[[file:figs/detail_instrumentation_dac_setup.png]] #+begin_src matlab :exports none %% DAC Output Voltage Noise -dac = load('mat/noise_dac_1.mat', 't', 'Vn', 'notes'); -#+end_src +dac = load('mat/noise_dac.mat', 't', 'Vn', 'notes'); -#+begin_src matlab :exports none -%% DAC Output Voltage Noise -dac = load('mat/noise_dac_2.mat', 't', 'Vn', 'notes'); -#+end_src - -#+begin_src matlab :exports none % Take input acount the gain of the pre-amplifier dac.Vn = dac.Vn/dac.notes.pre_amp.gain; dac.Vn = dac.Vn - mean(dac.Vn); -#+end_src -#+begin_src matlab :exports none -% Sampling time / frequency Ts = (dac.t(end) - dac.t(1))/(length(dac.t) - 1); -Fs = 1/Ts; +Nfft = floor(1/Ts); +win = hanning(Nfft); +Noverlap = floor(Nfft/2); +% Identification of the transfer function from Va to di +[pxx, f] = pwelch(dac.Vn, win, Noverlap, Nfft, 1/Ts); + +dac.pxx = pxx(f<=5e3); +dac.f = f(f<=5e3); #+end_src -#+begin_src matlab :exports none -% Compute the PSD of the measured noise -win = hanning(ceil(0.5/Ts)); - -[pxx, f] = pwelch(dac.Vn, win, [], [], Fs); -dac.pxx = pxx; -dac.f = f; -#+end_src - -The obtained Amplitude Spectral Density of the DAC's output voltage is shown in Figure ref:fig:asd_noise_dac. +The obtained Amplitude Spectral Density of the DAC's output voltage is shown in Figure ref:fig:detail_instrumentation_dac_output_noise. +It is almost white noise with an ASD of 0.6uV/sqrt(Hz). +There is a little bit of 50Hz, and some low frequency noise (thermal noise?) which are not foreseen to be an issue as it will be inside the bandwidth. #+begin_src matlab :exports none colors = get(gca,'colororder'); figure; hold on; -plot(egg.f, sqrt(egg.pxx), 'DisplayName', '$\Gamma_{n_a}$'); -set(gca,'ColorOrderIndex',3) -plot(dac.f, sqrt(dac.pxx), 'DisplayName', '$\Gamma_{n_{da}}$'); -plot([1 Fs/2], [adc.Gamma_q, adc.Gamma_q]./dac.notes.pre_amp.gain, 'k--', 'DisplayName', '$\Gamma_{q_{ad}}/|G_a|$'); +plot(femto.f, sqrt(femto.pxx), 'color', colors(5,:), 'DisplayName', '$\Gamma_{n_a}$'); +plot(dac.f, sqrt(dac.pxx), 'color', colors(1,:), 'DisplayName', '$\Gamma_{n_{da}}$'); +plot(adc.f, sqrt(adc.pxx)./dac.notes.pre_amp.gain, 'color', colors(3,:), 'DisplayName', '$\Gamma_{q_{ad}}/|G_a|$') hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); xlabel('Frequency [Hz]'); ylabel('ASD [$V/\sqrt{Hz}$]'); -legend('location', 'southeast'); -xlim([1, Fs/2]); +leg = legend('location', 'east', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; +xlim([1, 5e3]); ylim([1e-10, 4e-4]); +xticks([1e0, 1e1, 1e2, 1e3]) #+end_src -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/asd_noise_dac.pdf', 'width', 'wide', 'height', 'tall'); +#+begin_src matlab :tangle no :exports results :results file none +exportFig('figs/detail_instrumentation_dac_output_noise.pdf', 'width', 'half', 'height', 'normal'); #+end_src -#+name: fig:asd_noise_dac -#+caption: Amplitude Spectral Density of the measured output voltage noise of the 16bits DAC -#+RESULTS: -[[file:figs/asd_noise_dac.png]] - -**** Bandwidth - DAC is directly wired to the ADC. The transfer function from DAC to ADC is computed. - -It corresponds to 1 sample delay. +It corresponds to 1 sample delay (Figure ref:fig:detail_instrumentation_dac_adc_tf). #+begin_src matlab -data_dac_adc = ("2023-08-22_15-52_io131_dac_to_adc.mat"); +%% Measure transfer function from DAC to ADC +data_dac_adc = load("2023-08-22_15-52_io131_dac_to_adc.mat"); + +% Frequency analysis parameters +Ts = 1e-4; % Sampling Time [s] +Nfft = floor(1.0/Ts); +win = hanning(Nfft); +Noverlap = floor(Nfft/2); + +[G_dac_adc, f] = tfestimate(data_dac_adc.dac_1, data_dac_adc.adc_1, win, Noverlap, Nfft, 1/Ts); + +% +G_delay = exp(-Ts*s); #+end_src +#+begin_src matlab :exports none :results none +%% Measure transfer function from DAC to ADC - It fits a pure "1-sample" delay +figure; +tiledlayout(3, 1, 'TileSpacing', 'compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +plot(f, abs(G_dac_adc), 'color', colors(2,:), 'DisplayName', 'Measurement'); +plot(f, abs(squeeze(freqresp(G_delay, f, 'Hz'))), 'k--', 'DisplayName', 'Pure Delay'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude [V/V]'); set(gca, 'XTickLabel',[]); +ylim([1e-1, 1e1]); +leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; + +ax2 = nexttile(); +hold on; +plot(f, 180/pi*unwrap(angle(G_dac_adc)), 'color', colors(2,:)); +plot(f, 180/pi*unwrap(angle(squeeze(freqresp(G_delay, f, 'Hz')))), 'k--', 'DisplayName', 'Pure Delay'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); +ylim([-200, 20]) + +linkaxes([ax1,ax2],'x'); +xlim([1, 5e3]); +xticks([1e0, 1e1, 1e2, 1e3]) +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/detail_instrumentation_dac_adc_tf.pdf', 'width', 'half', 'height', 'normal'); +#+end_src + +#+name: fig:detail_instrumentation_dac +#+caption: Measure transfer function from DAC to ADC - It fits a pure "1-sample" delay (\subref{fig:fig_label_a}) +#+attr_latex: :options [htbp] +#+begin_figure +#+attr_latex: :caption \subcaption{\label{fig:detail_instrumentation_dac_output_noise}sub caption a} +#+attr_latex: :options {0.48\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.95\linewidth +[[file:figs/detail_instrumentation_dac_output_noise.png]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:detail_instrumentation_dac_adc_tf}sub caption b} +#+attr_latex: :options {0.48\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.95\linewidth +[[file:figs/detail_instrumentation_dac_adc_tf.png]] +#+end_subfigure +#+end_figure + ** Piezoelectric Voltage Amplifier -[[file:~/Cloud/work-projects/ID31-NASS/matlab/test-bench-PD200/test-bench-pd200.org][test-bench-PD200]] +# [[file:~/Cloud/work-projects/ID31-NASS/matlab/test-bench-PD200/test-bench-pd200.org][test-bench-PD200]] -*** Noise -**** PD200 - Low frequency noise measurement - -The measurement setup is shown in Figure ref:fig:noise_measure_setup_pd200. +**** Output Voltage Noise +The measurement setup is shown in Figure ref:fig:detail_instrumentation_pd200_setup. The input of the PD200 amplifier is shunted with a 50 Ohm resistor such that there in no voltage input expected the PD200 input voltage noise. The gain of the pre-amplifier is increased in order to measure a signal much larger than the quantization noise of the ADC. -#+begin_src latex :file noise_measure_setup_pd200.pdf +Two piezoelectric stacks of the APA95ML are connected to the PD200 output to have appropriate load. + +#+begin_src latex :file detail_instrumentation_pd200_setup.pdf \begin{tikzpicture} \node[block={0.6cm}{0.6cm}] (const) {$0$}; % PD200 - \node[addb, right=0.6 of const] (addnp){}; - \node[block, right=0.4 of addnp] (Gp){$G_p(s)$}; + \node[block, right=0.4 of const] (Gp){$G_p(s)$}; + \node[addb, right=0.3 of Gp] (addnp){}; % Pre Amp - \node[addb, right=1.2 of Gp] (addna) {}; - \node[block, right=0.4 of addna] (Ga) {$G_a(s)$}; + \node[addb, right=0.8 of addnp] (addna) {}; + \node[block, right=0.3 of addna] (Ga) {$G_a(s)$}; % ADC - \node[addb, right=1.2 of Ga] (addqad){}; - \node[ADC, right=0.4 of addqad] (ADC) {ADC}; + \node[addb, right=0.8 of Ga] (addqad){}; + \node[ADC, right=0.3 of addqad] (ADC) {ADC}; - \draw[->] (const.east) -- (addnp.west); - \draw[->] (addnp.east) -- (Gp.west); - \draw[->] (Gp.east) -- (addna.west); + \draw[->] (const.east) -- (Gp.west); + \draw[->] (Gp.east) -- (addnp.west); + \draw[->] (addnp.east) -- (addna.west); \draw[->] (addna.east) -- (Ga.west); \draw[->] (Ga.east) -- (addqad.west); \draw[->] (addqad.east) -- (ADC.west); - \draw[->] (ADC.east) -- node[sloped]{$/$} ++(1.0, 0) node[above left]{$n$}; + \draw[->] (ADC.east) -- node[sloped]{$/$} ++(0.8, 0) node[above left]{$n$}; - \draw[<-] (addnp.north) -- ++(0, 0.6) node[below right](np){$n_{p}$}; + \draw[<-] (addnp.north) -- ++(0, 0.6) node[below left](np){$n_{p}$}; \draw[<-] (addna.north) -- ++(0, 0.6) node[below right](na){$n_{a}$}; \draw[<-] (addqad.north) -- ++(0, 0.6) node[below right](qad){$q_{ad}$}; @@ -1235,43 +1749,35 @@ The gain of the pre-amplifier is increased in order to measure a signal much lar % PD200 \begin{scope}[on background layer] - \node[fit={(addnp.west|-bot) (Gp.east|-top)}, inner sep=10pt, draw, dashed, fill=black!20!white] (P) {}; + \node[fit={(addnp.east|-bot) (Gp.west|-top)}, inner sep=4pt, draw, dashed, fill=colorred!20!white] (P) {}; \node[above] at (P.north) {PD200}; \end{scope} % 5113 \begin{scope}[on background layer] - \node[fit={(addna.west|-bot) (Ga.east|-top)}, inner sep=10pt, draw, dashed, fill=black!20!white] (P) {}; + \node[fit={(addna.west|-bot) (Ga.east|-top)}, inner sep=4pt, draw, dashed, fill=colorgreen!20!white] (P) {}; \node[above] at (P.north) {Pre Amp}; \end{scope} % ADC \begin{scope}[on background layer] - \node[fit={(addqad.west|-bot) (ADC.east|-top)}, inner sep=10pt, draw, dashed, fill=black!20!white] (P) {}; + \node[fit={(addqad.west|-bot) (ADC.east|-top)}, inner sep=4pt, draw, dashed, fill=coloryellow!20!white] (P) {}; \node[above] at (P.north) {ADC}; \end{scope} \end{tikzpicture} #+end_src -#+name: fig:noise_measure_setup_pd200 +#+name: fig:detail_instrumentation_pd200_setup #+caption: Sources of noise in the experimental setup #+RESULTS: -[[file:figs/noise_measure_setup_pd200.png]] +[[file:figs/detail_instrumentation_pd200_setup.png]] #+begin_src matlab :exports none %% PD200 Input Voltage Noise % Load all the measurements -pd200w = {}; -for i = 1:7 - pd200w(i) = {load(['mat/noise_PD200_' num2str(i) '_3uF_warmup.mat'], 't', 'Vn', 'notes')}; -end -#+end_src - -#+begin_src matlab :exports none +pd200w = load('noise_PD200_4_3uF.mat', 't', 'Vn', 'notes'); % Take into account the pre-amplifier gain and PD200 Gain -for i = 1:7 - pd200w{i}.Vn = pd200w{i}.Vn/pd200w{i}.notes.pre_amp.gain/20; -end +pd200w.Vn = pd200w.Vn/pd200w.notes.pre_amp.gain/20; #+end_src The measured low frequency (<20Hz) *output* noise of one of the PD200 amplifiers is shown in Figure ref:fig:pd200_noise_time_lpf. @@ -1284,7 +1790,7 @@ t_max = 40; figure; hold on; -plot(pd200w{1}.t(1:t_max/Ts), 20*lsim(G_lpf, 1e3*pd200w{1}.Vn(1:t_max/Ts), pd200w{1}.t(1:t_max/Ts))) +plot(pd200w.t(1:t_max/Ts), 20*lsim(G_lpf, 1e3*pd200w.Vn(1:t_max/Ts), pd200w.t(1:t_max/Ts))) hold off; xlabel('Time [s]'); ylabel('Voltage [mV]'); @@ -1301,26 +1807,7 @@ exportFig('figs/pd200_noise_time_lpf.pdf', 'width', 'wide', 'height', 'normal'); [[file:figs/pd200_noise_time_lpf.png]] The obtained RMS and peak to peak values of the measured *output* noise are shown in Table ref:tab:rms_pkp_noise and found to be very similar to the specified ones. -#+begin_src matlab :exports none -% Compute the RMS and Peak to Peak noise for the low frequency noise -Vn_rms = zeros(7,1); % RMS value [uV rms] -Vn_pkp = zeros(7,1); % Peak to Peak Value in 20Hz bandwidth [mV] -for i = 1:7 - Vn_rms(i) = 1e6*rms(20*pd200w{i}.Vn); - Vn_lpf = 20*lsim(1/(1 + s/2/pi/20), pd200w{i}.Vn, pd200w{i}.t); - Vn_pkp(i) = 1e3*(max(Vn_lpf)-min(Vn_lpf)); -end -#+end_src -#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) -data2orgtable([[714; Vn_rms], [4.3; Vn_pkp]], {'Specification [$10\,\mu F$]', 'PD200 1', 'PD200 2', 'PD200 3', 'PD200 4', 'PD200 5', 'PD200 6', 'PD200 7'}, {'*RMS [$\mu V$]*', '*Peak to Peak [$mV$]*'}, ' %.1f '); -#+end_src - -#+name: tab:rms_pkp_noise -#+caption: RMS and Peak to Peak measured low frequency output noise (0.01Hz to 20Hz) -#+attr_latex: :environment tabularx :width 0.5\linewidth :align lcc -#+attr_latex: :center t :booktabs t :float t -#+RESULTS: | | *RMS [$\mu V$]* | *Peak to Peak [$mV$]* | |-----------------------------+-----------------+-----------------------| | Specification [$10\,\mu F$] | 714.0 | 4.3 | @@ -1332,10 +1819,6 @@ data2orgtable([[714; Vn_rms], [4.3; Vn_pkp]], {'Specification [$10\,\mu F$]', 'P | PD200 6 | 473.2 | 2.7 | | PD200 7 | 423.1 | 2.3 | -**** PD200 - High frequency noise measurement - -The measurement setup is the same as in Figure ref:fig:noise_measure_setup_pd200. - The Amplitude Spectral Density $\Gamma_n(\omega)$ of the measured signal by the ADC is computed. The Amplitude Spectral Density of the input voltage noise of the PD200 amplifier $n_p$ is then computed taking into account the gain of the pre-amplifier and the gain of the PD200 amplifier: \begin{equation} @@ -1351,130 +1834,70 @@ And we verify that we are indeed measuring the noise of the PD200 and not the no %% PD200 Input Voltage Noise % Load all the measurements pd200 = {}; -for i = 1:7 +for i = 1:6 pd200(i) = {load(['mat/noise_PD200_' num2str(i) '_10uF.mat'], 't', 'Vout', 'notes')}; end -#+end_src -#+begin_src matlab :exports none % Take into account the pre-amplifier gain and PD200 Gain -for i = 1:7 +for i = 1:6 pd200{i}.Vout = pd200{i}.Vout/pd200{i}.notes.pre_amp.gain/20; end -#+end_src -#+begin_src matlab :exports none % Sampling time / frequency Ts = (pd200{1}.t(end) - pd200{1}.t(1))/(length(pd200{1}.t) - 1); -Fs = 1/Ts; -#+end_src -#+begin_src matlab :exports none % Compute the PSD of the measured noise -win = hanning(ceil(2/Ts)); +Nfft = floor(1/Ts); +win = hanning(Nfft); +Noverlap = floor(Nfft/2); -for i = 1:7 - [pxx, f] = pwelch(pd200{i}.Vout, win, [], [], Fs); - pd200{i}.f = f; - pd200{i}.pxx = pxx; +for i = 1:6 + % Identification of the transfer function from Va to di + [pxx, f] = pwelch(pd200{i}.Vout, win, Noverlap, Nfft, 1/Ts); + pd200{i}.pxx = pxx(f<=5e3); + pd200{i}.f = f(f<=5e3); end #+end_src The Amplitude Spectral Density of the measured *input* noise is computed and shown in Figure ref:fig:asd_noise_pd200_10uF. It is verified that the contribution of the PD200 noise is much larger than the contribution of the pre-amplifier noise of the quantization noise. -#+begin_src matlab :exports none -colors = get(gca,'colororder'); +The Amplitude Spectral Density of the input noise of the PD200 amplifiers present sharp peaks. +It is not clear yet what causes such peaks and if these peaks have high influence on the total RMS noise of the amplifiers. + +#+begin_src matlab :exports none :results none +%% Measured output voltage noise of the PD200 amplifiers figure; hold on; -plot(femto.f, sqrt(femto.pxx)/20, 'DisplayName', '$\Gamma_{n_a}/|G_p|$'); +plot([1 Fs/2], [max_amp_asd, max_amp_asd], '--', 'color', colors(2,:), 'DisplayName', 'Specs') plot(pd200{1}.f, sqrt(pd200{1}.pxx), 'color', [colors(2, :), 0.5], 'DisplayName', '$\Gamma_{n_p}$'); -for i = 2:7 +for i = 2:6 plot(pd200{i}.f, sqrt(pd200{i}.pxx), 'color', [colors(2, :), 0.5], 'HandleVisibility', 'off'); end -plot([1 Fs/2], [adc.Gamma_q, adc.Gamma_q]./pd200{1}.notes.pre_amp.gain/20, 'k--', 'DisplayName', '$\Gamma_{q_{ad}}/|G_p G_a|$'); +plot(femto.f, sqrt(femto.pxx)/20, 'color', [colors(5, :)], 'DisplayName', '$\Gamma_{n_a}/|G_p|$'); +plot(adc.f, sqrt(adc.pxx)./pd200{1}.notes.pre_amp.gain/20, 'color', colors(3,:), 'DisplayName', '$\Gamma_{q_{ad}}/|G_p G_a|$') hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); xlabel('Frequency [Hz]'); ylabel('ASD [$V/\sqrt{Hz}$]'); -legend('location', 'southeast'); -xlim([1, Fs/2]); +leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; +ylim([1e-10, 4e-4]); xlim([1, 5e3]); +xticks([1e0, 1e1, 1e2, 1e3]) #+end_src #+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/asd_noise_pd200_10uF.pdf', 'width', 'wide', 'height', 'tall'); +exportFig('figs/detail_instrumentation_pd200_noise.pdf', 'width', 'wide', 'height', 'normal'); #+end_src -#+name: fig:asd_noise_pd200_10uF -#+caption: Amplitude Spectral Density of the measured input voltage noise of the PD200 amplifiers +#+name: fig:detail_instrumentation_pd200_noise +#+caption: Measured output voltage noise of the PD200 amplifiers #+RESULTS: -[[file:figs/asd_noise_pd200_10uF.png]] - -#+begin_note -The Amplitude Spectral Density of the input noise of the PD200 amplifiers present sharp peaks. -It is not clear yet what causes such peaks and if these peaks have high influence on the total RMS noise of the amplifiers. -#+end_note - -*** Bandwidth -**** Maximum Frequency/Voltage to not overload the amplifier -<> - -Then the maximum output current of the amplifier is reached, the amplifier automatically shuts down itself. -We should then make sure that the output current does not reach this maximum specified current. - -The maximum current is 1A [rms] which corresponds to 0.7A in amplitude of the sin wave. - -The impedance of the capacitance is: -\[ Z_C(\omega) = \frac{1}{jC\omega} \] - -Therefore the relation between the output current amplitude and the output voltage amplitude for sinusoidal waves of frequency $\omega$: -\[ V_{out} = \frac{1}{C\omega} I_{out} \] - -Moreover, there is a gain of 20 between the input voltage and the output voltage: -\[ 20 V_{in} = \frac{1}{C\omega} I_{out} \] - -For a specified voltage input amplitude $V_{in}$, the maximum frequency at which the output current reaches its maximum value is: -\begin{equation} -\boxed{\omega_{\text{max}} = \frac{1}{20 C V_{in}} I_{out,\text{max}}} -\end{equation} -with: -- $\omega_{\text{max}}$ the maximum input sinusoidal frequency in Radians per seconds -- $C$ the load capacitance in Farads -- $V_{in}$ the input voltage sinusoidal amplitude in Volts -- $I_{out,\text{max}}$ the specified maximum output current in Amperes - -$\omega_{\text{max}}/2\pi$ as a function of $V_{in}$ is shown in Figure ref:fig:max_frequency_voltage. - -#+begin_src matlab :exports none -Iout_max = 0.57; % Maximum output current [A] -C = 2.7e-6; % Load Capacitance [F] - -V_in = linspace(0, 5, 100); % Input Voltage [V] - -w_max = 1./(20*C*V_in) * Iout_max; % [rad/s] - -figure; -plot(V_in, w_max/2/pi); -xlabel('Input Voltage Amplitude [V]'); -ylabel('Maximum Frequency [Hz]'); -set(gca, 'yscale', 'log'); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/max_frequency_voltage.pdf', 'width', 'wide', 'height', 'normal'); -#+end_src - -#+name: fig:max_frequency_voltage -#+caption: Maximum frequency as a function of the excitation voltage amplitude -#+RESULTS: -[[file:figs/max_frequency_voltage.png]] - -When doing sweep sine excitation, we make sure not to reach this maximum excitation frequency. +[[file:figs/detail_instrumentation_pd200_noise.png]] **** Small Signal Bandwidth -<> -Here the small signal dynamics of all the 7 PD200 amplifiers are identified. +Here the small signal dynamics of all the PD200 amplifiers are identified. A (logarithmic) sweep sine excitation voltage is generated by the Speedgoat DAC with an amplitude of 0.1V and a frequency going from 1Hz up to 5kHz. @@ -1485,236 +1908,76 @@ This way, the time delay related to the ADC will not be apparent in the results. #+begin_src matlab :exports none %% Load all the measurements pd200 = {}; -for i = 1:7 +for i = 1:6 pd200(i) = {load(['tf_pd200_' num2str(i) '_10uF_small_signal.mat'], 't', 'Vin', 'Vout', 'notes')}; end -#+end_src -#+begin_src matlab :exports none -%% Compute sampling Frequency +% Compute sampling Frequency Ts = (pd200{1}.t(end) - pd200{1}.t(1))/(length(pd200{1}.t)-1); -Fs = 1/Ts; -#+end_src -#+begin_src matlab :exports none -%% Compute all the transfer functions -win = hanning(ceil(0.5*Fs)); % Hannning Windows +% Compute all the transfer functions +Nfft = floor(1.0/Ts); +win = hanning(Nfft); +Noverlap = floor(Nfft/2); for i = 1:length(pd200) - [tf_est, f] = tfestimate(pd200{i}.Vin, 20*pd200{i}.Vout, win, [], [], 1/Ts); - pd200{i}.tf = tf_est; - pd200{i}.f = f; + [tf_est, f] = tfestimate(pd200{i}.Vin, 20*pd200{i}.Vout, win, Noverlap, Nfft, 1/Ts); + pd200{i}.tf = tf_est(f<=5e3); + pd200{i}.f = f(f<=5e3); end + +% Amplified model +Gp = 20/(1 + s/2/pi/25e3); #+end_src The obtained transfer functions from $V_{in}$ to $V_{out}$ are shown in Figure ref:fig:pd200_small_signal_tf. + #+begin_src matlab :exports none figure; -tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None'); +tiledlayout(3, 1, 'TileSpacing', 'compact', 'Padding', 'None'); -ax1 = nexttile; +ax1 = nexttile([2,1]); hold on; for i = 1:length(pd200) - plot(pd200{i}.f, abs(pd200{i}.tf)) + plot(pd200{i}.f, abs(pd200{i}.tf), 'color', [colors(2,:), 0.5]) end +plot(pd200{1}.f, abs(squeeze(freqresp(Gp, pd200{1}.f, 'Hz'))), 'k--') hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('Amplitude $V_{out}/V_{in}$ [V/V]'); set(gca, 'XTickLabel',[]); hold off; -ylim([10, 30]); +ylim([1, 1e2]); ax2 = nexttile; hold on; for i = 1:length(pd200) - plot(pd200{i}.f, 180/pi*angle(pd200{i}.tf), 'DisplayName', sprintf('PD200 %i', i)) + plot(pd200{i}.f, 180/pi*unwrap(angle(pd200{i}.tf)), 'color', [colors(2,:), 0.5]) end +plot(pd200{1}.f, 180/pi*unwrap(angle(squeeze(freqresp(Gp, pd200{1}.f, 'Hz')))), 'k--') set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); hold off; -yticks(-360:2:360); -ylim([-12, 2]); -legend('location', 'southwest'); +yticks(-360:5:360); +ylim([-45, 5]); linkaxes([ax1,ax2],'x'); xlim([1, 5e3]); #+end_src #+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/pd200_small_signal_tf.pdf', 'width', 'wide', 'height', 'tall'); +exportFig('figs/detail_instrumentation_pd200_tf.pdf', 'width', 'wide', 'height', 600); #+end_src -#+name: fig:pd200_small_signal_tf +#+name: fig:detail_instrumentation_pd200_tf #+caption: Identified dynamics from input voltage to output voltage #+RESULTS: -[[file:figs/pd200_small_signal_tf.png]] +[[file:figs/detail_instrumentation_pd200_tf.png]] We can see the very well matching between all the 7 amplifiers. The amplitude is constant over a wide frequency band and the phase drop is limited to less than 1 degree up to 500Hz. -**** Model of the amplifier small signal dynamics -<> - The identified dynamics in Figure ref:fig:pd200_small_signal_tf can very well be modeled this dynamics with a first order low pass filter (even a constant could work fine). -Below is the defined transfer function $G_p(s)$. -#+begin_src matlab -Gp = 20/(1 + s/2/pi/25e3); -#+end_src - -Comparison of the model with the identified dynamics is shown in Figure ref:fig:pd200_small_signal_tf_model. -#+begin_src matlab :exports none -colors = get(gca,'colororder'); - -figure; -tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None'); - -ax1 = nexttile; -hold on; -for i = 1:length(pd200) - plot(pd200{i}.f, abs(pd200{i}.tf), 'color', [colors(1, :), 0.5]) -end -set(gca,'ColorOrderIndex',2) -plot(pd200{1}.f, abs(squeeze(freqresp(Gp, pd200{1}.f, 'Hz'))), '--') -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Amplitude $V_{out}/V_{in}$ [V/V]'); set(gca, 'XTickLabel',[]); -hold off; -ylim([1e0, 1e2]); - -ax2 = nexttile; -hold on; -plot(pd200{1}.f, 180/pi*angle(pd200{1}.tf), 'color', [colors(1, :), 0.5], ... - 'DisplayName', 'Exp. data') -for i = 2:length(pd200) - plot(pd200{i}.f, 180/pi*angle(pd200{i}.tf), 'color', [colors(1, :), 0.5], ... - 'HandleVisibility', 'off') -end -set(gca,'ColorOrderIndex',2) -plot(pd200{1}.f, 180/pi*angle(squeeze(freqresp(Gp, pd200{1}.f, 'Hz'))), '--', ... - 'DisplayName', '$|G_p|$') -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -yticks(-360:2:360); -ylim([-12, 2]); -legend('location', 'southwest'); - -linkaxes([ax1,ax2],'x'); -xlim([5, 5e3]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/pd200_small_signal_tf_model.pdf', 'width', 'wide', 'height', 'tall'); -#+end_src - -#+name: fig:pd200_small_signal_tf_model -#+caption:Bode plot of $G_d(s)$ as well as the identified transfer functions of all 7 amplifiers -#+RESULTS: -[[file:figs/pd200_small_signal_tf_model.png]] - -#+begin_src matlab :tangle no :exports none -save('matlab/mat/pd200_model.mat', 'Gp'); -#+end_src - -And finally this model is saved. -#+begin_src matlab :eval no -save('mat/pd200_model.mat', 'Gp'); -#+end_src - -**** Large Signal Bandwidth -<> - -The PD200 amplifiers will most likely not be used for large signals, but it is still nice to see how the amplifier dynamics is changing with the input voltage amplitude. - -Several identifications using sweep sin were performed with input voltage amplitude ranging from 0.1V to 4V. -The maximum excitation frequency for each amplitude was limited from the estimation in Section ref:sec:tf_meas_w_max. - -#+begin_src matlab :exports none -%% Load all the measurements -Vin_ampl = {'0_1', '0_5', '1', '2', '4'}; - -pd200 = {}; -for i = 1:length(Vin_ampl) - pd200(i) = {load(['tf_pd200_1_10uF_' Vin_ampl{i} 'V.mat'], 't', 'Vin', 'Vout', 'notes')}; -end -#+end_src - -#+begin_src matlab :exports none -%% Compute the maximum excitation frequency -Iout_max = 0.57; % Maximum output current [A] -C = 10e-6; % Load Capacitance [F] - -V_in = [0.1, 0.5, 1, 2, 4]; -f_max = 0.8*Iout_max./(20*C*V_in/sqrt(2))/2/pi; -for i = 1:length(Vin_ampl) - pd200{i}.notes.pd200.f_max = f_max(i); - pd200{i}.notes.pd200.Vin = V_in(i); -end -#+end_src - -#+begin_src matlab :exports none -%% Compute sampling Frequency -Ts = (pd200{1}.t(end) - pd200{1}.t(1))/(length(pd200{1}.t)-1); -Fs = 1/Ts; -#+end_src - -#+begin_src matlab :exports none -%% Compute all the transfer functions -win = hanning(ceil(0.5*Fs)); % Hannning Windows - -for i = 1:length(pd200) - [tf_est, f] = tfestimate(pd200{i}.Vin, 20*pd200{i}.Vout, win, [], [], 1/Ts); - pd200{i}.tf = tf_est(f < 0.99*pd200{i}.notes.pd200.f_max); - pd200{i}.f = f(f < 0.99*pd200{i}.notes.pd200.f_max); -end -#+end_src - -The obtained transfer functions for the different excitation amplitudes are shown in Figure ref:fig:pd200_large_signal_tf. -It is shown that the input voltage amplitude does not affect that much the amplifier dynamics. - -#+begin_src matlab :exports none -%% Plot the identified transfer functions -figure; -tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None'); - -ax1 = nexttile; -hold on; -for i = 1:length(pd200) - plot(pd200{i}.f, abs(pd200{i}.tf)) -end -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Amplitude $V_{out}/V_{in}$ [V/V]'); set(gca, 'XTickLabel',[]); -hold off; -ylim([1e0, 1e2]); - -ax2 = nexttile; -hold on; -for i = 1:length(pd200) - plot(pd200{i}.f, 180/pi*angle(pd200{i}.tf), 'DisplayName', sprintf('$V_{in} = %.1f [V]$', pd200{i}.notes.pd200.Vin)) -end -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -legend('location', 'southwest'); -hold off; -yticks(-360:2:360); -ylim([-12, 2]); - -linkaxes([ax1,ax2],'x'); -xlim([5, 5e3]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/pd200_large_signal_tf.pdf', 'width', 'wide', 'height', 'tall'); -#+end_src - -#+name: fig:pd200_large_signal_tf -#+caption: Amplifier dynamics for several input voltage amplitudes -#+RESULTS: -[[file:figs/pd200_large_signal_tf.png]] - - - **** Output Impedance The goal of this experimental setup is to estimate the output impedance $R_\text{out}$ of the PD200 voltage amplifiers. @@ -1722,24 +1985,24 @@ A DAC with a constant output voltage (here 0.1V) is connected to the input of th Then, the output voltage of the PD200 amplifier is measured in two conditions: - $V$ when the output is not connected to any load -- $V_p$ when a load $R = 10\,\Omega$ is connected at the output of the amplifier +- $V_p$ when a load $R_{\text{load}} = 10\,\Omega$ is connected at the output of the amplifier The load and the output impedance form a voltage divider, and thus: \[ V^\prime = \frac{R}{R + R_\text{out}} V \] From the two values of voltage, the output impedance of the amplifier can be estimated: -\[ R_\text{out} = R \frac{V - V^\prime}{V^\prime} \] +\begin{equation} + R_{\text{out}} = R_{\text{load}} \frac{V - V_p}{V} +\end{equation} -A schematic of the setup is shown in Figure ref:fig:setup_output_impedance. +From this measurement, all the PD200 amplifiers are found to have an output impedance $R_{\text{out}} \approx 1\,\Omega$. -#+name: fig:setup_output_impedance -#+caption: Schematic of the setup use to estimate the output impedance of the PD200 amplifier -[[file:figs/setup_output_impedance.png]] +With the capacitive load $C_p = 8.8\,\mu F$, the output resistor of the amplifier forms a low pass filter with a corner frequency equal to $f_0 = \frac{1}{R_{\text{out}} C_p}$. +We get a corner frequency around $10\,\text{kHz}$ which is not far from the specified $7.4\,\text{kHz}$. - -Below are defined the measured output voltages with and without the 10Ohm load: #+begin_src matlab -R = 10; % Load [Ohm] +% Estimate output impedance of PD200 amplifiers +R_load = 10; % Load [Ohm] % V Vp meas = [1.988, 1.794; % PD200 - 1 @@ -1747,216 +2010,16 @@ meas = [1.988, 1.794; % PD200 - 1 1.982, 1.795; % PD200 - 3 1.984, 1.789; % PD200 - 4 1.998, 1.810; % PD200 - 5 - 1.984, 1.799; % PD200 - 6 - 2.004, 1.812] % PD200 - 7 + 1.984, 1.799];% PD200 - 6 + +R_out = R_load * (meas(:,1) - meas(:,2))./meas(:,2); % Output impedance [Ohm] + +% Estimate corner frequency of the high pass filter +Cp = 8.8e-6; % Capacitive load of the two piezoelectric actuators +f0 = 1./(R_out*Cp) #+end_src -The output impedance of the amplifier can then be estimated using: -\begin{equation} - R_{\text{out}} = R_{\text{load}} \frac{V - V_p}{V} -\end{equation} - -#+begin_src matlab -meas(:, 3) = R * (meas(:,1) - meas(:,2))./meas(:,2) -#+end_src - -The obtained output impedances are shown in Table ref:tab:pd200_output_impedance. - -#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) -data2orgtable(meas, {'1', '2', '3', '4', '5', '6', '7'}, {'$V\ [V]$', '$V_p\ [V]$', '$R_\text{out}\ [\Omega]$'}, ' %.3f '); -#+end_src - -#+name: tab:pd200_output_impedance -#+caption: Obtained Output Impedance for the PD200 Amplifiers -#+attr_latex: :environment tabularx :width 0.4\linewidth :align Xccc -#+attr_latex: :center t :booktabs t :float t -#+RESULTS: -| PD200 | $V\ [V]$ | $V_p\ [V]$ | $R_\text{out}\ [\Omega]$ | -|-------+----------+------------+--------------------------| -| 1 | 1.988 | 1.794 | 1.081 | -| 2 | 1.99 | 1.789 | 1.124 | -| 3 | 1.982 | 1.795 | 1.042 | -| 4 | 1.984 | 1.789 | 1.09 | -| 5 | 1.998 | 1.81 | 1.039 | -| 6 | 1.984 | 1.799 | 1.028 | -| 7 | 2.004 | 1.812 | 1.06 | - -The output impedance of the PD200 Amplifier is estimated to be $\approx 1\,\Omega$. - -*** Model -**** PD200 Amplifier noise model -<> - -Let's design a transfer function $G_n(s)$ whose norm represent the Amplitude Spectral Density of the input voltage noise of the PD200 amplifier as shown in Figure [[fig:pd200-model-schematic-normalized-bis]]. - -#+name: fig:pd200-model-schematic-normalized-bis -#+caption: Model of the voltage amplifier with normalized noise input -[[file:figs/pd200-model-schematic-normalized.png]] - -A simple transfer function that allows to obtain a good fit is defined below. -#+begin_src matlab -%% Model of the PD200 Input Voltage Noise -Gn = 1e-5 * ((1 + s/2/pi/20)/(1 + s/2/pi/2))^2 /(1 + s/2/pi/5e3); -#+end_src - -The comparison between the measured ASD of the modeled ASD is done in Figure ref:fig:pd200_asd_noise_model. -#+begin_src matlab :exports none -% Plot the ASD of both the measured noise and the modelled one -freqs = logspace(-1, 4, 1000); - -figure; -hold on; -plot(pd200{1}.f, sqrt(pd200{1}.pxx), 'color', [colors(2, :), 0.5], 'DisplayName', '$\Gamma_{n_p}$'); -for i = 2:7 - plot(pd200{i}.f, sqrt(pd200{i}.pxx), 'color', [colors(2, :), 0.5], 'HandleVisibility', 'off'); -end -plot(freqs, abs(squeeze(freqresp(Gn, freqs, 'Hz'))), 'k-', 'DisplayName', '$|G_n(j\omega)|$'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('ASD [$m/\sqrt{Hz}$]'); -xlim([1, Fs/2]); -ylim([1e-8, 1e-4]); -legend('location', 'northeast'); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/pd200_asd_noise_model.pdf', 'width', 'wide', 'height', 'normal'); -#+end_src - -#+name: fig:pd200_asd_noise_model -#+caption: ASD of the measured input voltage noise and modeled noise using $G_n(s)$ -#+RESULTS: -[[file:figs/pd200_asd_noise_model.png]] - -Let's now compute the Cumulative Amplitude Spectrum corresponding to the measurement and the model and compare them. - -The integration from low to high frequency and from high to low frequency are both shown in Figure ref:fig:pd200_cas_noise_model. - -The fit between the model and the measurements is rather good considering the complex shape of the measured ASD and the simple model used. -#+begin_src matlab :exports none -% Compute the cumulative power spectrum from high to low and low to high frequencies -for i = 1:7 - pd200{i}.CPS_f = flip(-cumtrapz(flip(pd200{i}.f), flip(pd200{i}.pxx))); - pd200{i}.CPS = cumtrapz(pd200{i}.f, pd200{i}.pxx); -end - -CPS_Gn_f = flip(-cumtrapz(flip(freqs), flip(abs(squeeze(freqresp(Gn, freqs, 'Hz'))).^2))); -CPS_Gn = cumtrapz(freqs, abs(squeeze(freqresp(Gn, freqs, 'Hz'))).^2); -#+end_src - -#+begin_src matlab :exports none -figure; -hold on; -plot(pd200{1}.f, sqrt(pd200{1}.CPS), 'color', [colors(1, :), 0.5], 'DisplayName', '$CAS$'); -for i = 2:7 - plot(pd200{i}.f, sqrt(pd200{i}.CPS), 'color', [colors(1, :), 0.5], 'HandleVisibility', 'off'); -end -for i = 1:7 - plot(pd200{i}.f, sqrt(pd200{i}.CPS_f), 'color', [colors(2, :), 0.5], 'HandleVisibility', 'off'); -end - -set(gca,'ColorOrderIndex',1) -plot(freqs, sqrt(CPS_Gn), '--', 'DisplayName', 'model'); -set(gca,'ColorOrderIndex',2) -plot(freqs, sqrt(CPS_Gn_f), '--', 'HandleVisibility', 'off'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('CAS [V rms]'); -xlim([1, Fs/2]); -ylim([1e-6, 1e-4]); -legend('location', 'northeast'); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/pd200_cas_noise_model.pdf', 'width', 'wide', 'height', 'normal'); -#+end_src - -#+name: fig:pd200_cas_noise_model -#+caption: Cumulative Amplitude Spectrum of the measured input voltage noise and modeled noise using $G_n(s)$ -#+RESULTS: -[[file:figs/pd200_cas_noise_model.png]] - -The obtained RMS noise of the model is src_matlab[:exports results :results value replace]{ans = 1e6*20*sqrt(CPS_Gn(end))} {{{results(=286.74=)}}} uV RMS which is not that far from the specifications. - -#+begin_src matlab :tangle no :exports none -save('matlab/mat/pd200_model.mat', 'Gn', '-append'); -#+end_src - -Finally the model of the amplifier noise is saved. -#+begin_src matlab :eval no -save('mat/pd200_model.mat', 'Gn', '-append'); -#+end_src - -**** Voltage Amplifier Model -<> - -The Amplifier is characterized by its dynamics $G_p(s)$ from voltage inputs $V_{in}$ to voltage output $V_{out}$. -Ideally, the gain from $V_{in}$ to $V_{out}$ is constant over a wide frequency band with very small phase drop. - -It is also characterized by its *input* noise $n$. - -The objective is therefore to determine the transfer function $G_p(s)$ from the input voltage to the output voltage as well as the Power Spectral Density $S_n(\omega)$ of the amplifier input noise. - -As $G_p$ depends on the load capacitance, it should be measured when loading the amplifier with a $10\,\mu F$ capacitor. - -#+begin_src latex :file pd200-model-schematic.pdf - \begin{tikzpicture} - \node[addb] (add) at (0,0) {}; - \node[block, right=0.8 of add] (G) {$G_p(s)$}; - - \draw[<-] (add.west) -- ++(-1.2, 0) node[above right]{$V_{in}$}; - \draw[->] (add.east) -- (G.west); - \draw[<-] (add.north) -- ++(0, 0.6) node[below right](n){$n$}; - \draw[->] (G.east) -- ++(1.2, 0) node[above left]{$V_{out}$}; - - \begin{scope}[on background layer] - \node[fit={(G.south-|add.west) (n.north-|G.east)}, inner sep=8pt, draw, dashed, fill=black!20!white] (P) {}; - \node[below] at (P.north) {PD-200}; - \end{scope} - \end{tikzpicture} -#+end_src - -#+name: fig:pd200-model-schematic -#+caption: Model of the voltage amplifier -#+RESULTS: -[[file:figs/pd200-model-schematic.png]] - - -The input noise of the amplifier $n$ can be further modeled by shaping a white noise with unitary PSD $\tilde{n}$ with a transfer function $G_n(s)$ as shown in Figure ... - -The Amplitude Spectral Density $\Gamma_n$ is then: -\begin{equation} -\Gamma_n(\omega) = |G_n(j\omega)| \Gamma_{\tilde{n}}(\omega) -\end{equation} -with $\Gamma_{\tilde{n}}(\omega) = 1$. - - -#+begin_src latex :file pd200-model-schematic-normalized.pdf - \begin{tikzpicture} - \node[addb] (add) at (0,0) {}; - \node[block, above=0.5 of add] (Gn) {$G_n(s)$}; - \node[block, right=0.8 of add] (G) {$G_p(s)$}; - - \draw[<-] (add.west) -- ++(-1.2, 0) node[above right]{$V_{in}$}; - \draw[->] (add.east) -- (G.west); - \draw[->] (Gn.south) -- (add.north) node[above right]{$n$}; - \draw[<-] (Gn.north) -- ++(0, 0.6) node[below right](n){$\tilde{n}$}; - \draw[->] (G.east) -- ++(1.2, 0) node[above left]{$V_{out}$}; - - \begin{scope}[on background layer] - \node[fit={(G.south east) (n.north-|Gn.west)}, inner sep=8pt, draw, dashed, fill=black!20!white] (P) {}; - \node[below] at (P.north) {PD-200}; - \end{scope} - \end{tikzpicture} -#+end_src - -#+name: fig:pd200-model-schematic-normalized -#+caption: Model of the voltage amplifier with normalized noise input -#+RESULTS: -[[file:figs/pd200-model-schematic-normalized.png]] - - -*** Conclusion +**** Conclusion #+name: tab:table_name #+caption: Measured characteristics, Manual characterstics and specified ones @@ -1975,7 +2038,10 @@ with $\Gamma_{\tilde{n}}(\omega) = 1$. | Small Signal Bandwidth (10uF load) | | 7.4 [kHz] | > 5 [kHz] | | Large Signal Bandwidth (150V, 10uF) | | 300 [Hz] | - | -** Noise of the full setup with 16bits DAC +** Noise of the full setup with 16bits DAC :noexport: + +- [ ] Maybe not so useful + Let's now measure the noise of the full setup in Figure ref:fig:noise_meas_procedure_bis and analyze the results. #+name: fig:noise_meas_procedure_bis @@ -2061,16 +2127,7 @@ SSI2V 20bits DACs are used in the next section to verify that. ** Linear Encoders -[[file:~/Cloud/work-projects/ID31-NASS/matlab/test-bench-vionic/test-bench-vionic.org][test-bench-vionic]] - -- Section ref:sec:noise_bench: the measurement bench is described -- Section ref:sec:thermal_drifts: long measurement is performed to estimate the low frequency drifts in the measurement -- Section ref:sec:vionic_noise_time: high frequency measurements are performed to estimate the high frequency noise -- Section ref:sec:noise_asd: the Spectral density of the measurement noise is estimated -- Section ref:sec:vionic_noise_model: finally, the measured noise is modeled - -*** Test Bench -<> +# [[file:~/Cloud/work-projects/ID31-NASS/matlab/test-bench-vionic/test-bench-vionic.org][test-bench-vionic]] To measure the noise $n$ of the encoder, one can rigidly fix the head and the ruler together such that no motion should be measured. Then, the measured signal $y_m$ corresponds to the noise $n$. @@ -2088,351 +2145,37 @@ Note that the bench is then covered with a "plastic bubble sheet" in order to ke #+attr_latex: :width 0.8\linewidth [[file:figs/IMG_20210211_170607.jpg]] -*** Matlab Init :noexport:ignore: -#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) -<> -#+end_src - -#+begin_src matlab :exports none :results silent :noweb yes -<> -#+end_src - -#+begin_src matlab :tangle no -addpath('./matlab/mat/'); -addpath('./matlab/'); -#+end_src - -#+begin_src matlab :eval no -addpath('./mat/'); -#+end_src - -*** Thermal drifts -<> -Measured displacement were recording during approximately 40 hours with a sample frequency of 100Hz. -A first order low pass filter with a corner frequency of 1Hz - -#+begin_src matlab -enc_l = load('mat/noise_meas_40h_100Hz_1.mat', 't', 'x'); -#+end_src - -The measured time domain data are shown in Figure ref:fig:vionic_drifts_time. -#+begin_src matlab :exports none -enc_l.x = enc_l.x(enc_l.t > 5); % Remove first 5 seconds -enc_l.t = enc_l.t(enc_l.t > 5); % Remove first 5 seconds -enc_l.t = enc_l.t - enc_l.t(1); % Start at 0 - -enc_l.x = enc_l.x - mean(enc_l.x(enc_l.t < 1)); % Start at zero displacement -#+end_src - -#+begin_src matlab :exports none -figure; -hold on; -plot(enc_l.t/3600, 1e9*enc_l.x, '-'); -hold off; -xlabel('Time [h]'); -ylabel('Displacement [nm]'); -% xlim([0, 40]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/vionic_drifts_time.pdf', 'width', 'wide', 'height', 'normal'); -#+end_src - -#+name: fig:vionic_drifts_time -#+caption: Measured thermal drifts -#+RESULTS: -[[file:figs/vionic_drifts_time.png]] - -The measured data seems to experience a constant drift after approximately 20 hour. -Let's estimate this drift. - -#+begin_src matlab :exports none -t0 = 20*3600; % Start time [s] -x_stab = enc_l.x(enc_l.t > t0); -x_stab = x_stab - x_stab(1); -t_stab = enc_l.t(enc_l.t > t0); -t_stab = t_stab - t_stab(1); -#+end_src - -#+begin_src matlab :results value replace :exports results -sprintf('The mean drift is approximately %.1f [nm/hour] or %.1f [nm/min]', 3600*1e9*(t_stab\x_stab), 60*1e9*(t_stab\x_stab)) -#+end_src - -#+RESULTS: -: The mean drift is approximately 60.9 [nm/hour] or 1.0 [nm/min] - -Comparison between the data and the linear fit is shown in Figure ref:fig:vionic_drifts_linear_fit. -#+begin_src matlab :exports none -figure; -hold on; -plot(t_stab/3600, 1e9*x_stab, '-'); -plot(t_stab/3600, 1e9*t_stab*(t_stab\x_stab), 'k--'); -hold off; -xlabel('Time [h]'); -ylabel('Displacement [nm]'); -xlim([0, 20]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/vionic_drifts_linear_fit.pdf', 'width', 'wide', 'height', 'normal'); -#+end_src - -#+name: fig:vionic_drifts_linear_fit -#+caption: Measured drift and linear fit -#+RESULTS: -[[file:figs/vionic_drifts_linear_fit.png]] - -Let's now estimate the Power Spectral Density of the measured displacement. -The obtained low frequency ASD is shown in Figure ref:fig:vionic_noise_asd_low_freq. -#+begin_src matlab :exports none -% Compute sampling Frequency -Ts = (enc_l.t(end) - enc_l.t(1))/(length(enc_l.t)-1); -Fs = 1/Ts; - -% Hannning Windows -win = hanning(ceil(60*10/Ts)); - -[pxx_l, f_l] = pwelch(x_stab, win, [], [], Fs); -#+end_src - -#+begin_src matlab :exports none -figure; -hold on; -plot(f_l, sqrt(pxx_l)) -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('ASD [$m/\sqrt{Hz}$]'); -xlim([1e-2, 1e0]); -ylim([1e-11, 1e-8]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/vionic_noise_asd_low_freq.pdf', 'width', 'side', 'height', 'normal'); -#+end_src - -#+name: fig:vionic_noise_asd_low_freq -#+caption: Amplitude Spectral density of the measured displacement -#+RESULTS: -[[file:figs/vionic_noise_asd_low_freq.png]] - -*** Time Domain signals -<> - Then, and for all the 7 encoders, we record the measured motion during 100s with a sampling frequency of 20kHz. #+begin_src matlab :exports none %% Load all the measurements enc = {}; -for i = 1:7 +for i = 1:6 enc(i) = {load(['mat/noise_meas_100s_20kHz_' num2str(i) '.mat'], 't', 'x')}; end -#+end_src -#+begin_src matlab :exports none -%% Remove initial offset -for i = 1:7 - enc{i}.x = enc{i}.x - mean(enc{i}.x(1:1000)); -end -#+end_src - -The raw measured data as well as the low pass filtered data (using a first order low pass filter with a cut-off at 10Hz) are shown in Figure ref:fig:vionic_noise_raw_lpf. -#+begin_src matlab :exports none -figure; -hold on; -plot(enc{1}.t, 1e9*enc{1}.x, '.', 'DisplayName', 'Enc 1 - Raw'); -plot(enc{1}.t, 1e9*lsim(1/(1 + s/2/pi/10), enc{1}.x, enc{1}.t), '-', 'DisplayName', 'Enc 1 - LPF'); -hold off; -xlabel('Time [s]'); -ylabel('Displacement [nm]'); -legend('location', 'northwest'); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/vionic_noise_raw_lpf.pdf', 'width', 'wide', 'height', 'normal'); -#+end_src - -#+name: fig:vionic_noise_raw_lpf -#+caption: Time domain measurement (raw data and low pass filtered data with first order 10Hz LPF) -#+RESULTS: -[[file:figs/vionic_noise_raw_lpf.png]] - -The time domain data for all the encoders are compared in Figure ref:fig:vionic_noise_time. - -We can see some drifts that are in the order of few nm to 20nm per minute. -As shown in Section ref:sec:thermal_drifts, these drifts should diminish over time down to 1nm/min. -#+begin_src matlab :exports none -figure; -hold on; -for i=1:7 - plot(enc{i}.t, 1e9*lsim(1/(1 + s/2/pi/10), enc{i}.x, enc{i}.t), '.', ... - 'DisplayName', sprintf('Enc %i', i)); -end -hold off; -xlabel('Time [s]'); -ylabel('Displacement [nm]'); -legend('location', 'northwest'); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/vionic_noise_time.pdf', 'width', 'wide', 'height', 'normal'); -#+end_src - -#+name: fig:vionic_noise_time -#+caption: Comparison of the time domain measurement -#+RESULTS: -[[file:figs/vionic_noise_time.png]] - -*** Noise Spectral Density -<> - -The amplitude spectral densities for all the encoder are computed and shown in Figure ref:fig:vionic_noise_asd. -#+begin_src matlab :exports none % Compute sampling Frequency Ts = (enc{1}.t(end) - enc{1}.t(1))/(length(enc{1}.t)-1); -Fs = 1/Ts; +Nfft = floor(1.0/Ts); +win = hanning(Nfft); +Noverlap = floor(Nfft/2); -% Hannning Windows -win = hanning(ceil(0.5/Ts)); - -[pxx, f] = pwelch(enc{1}.x, win, [], [], Fs); -enc{1}.pxx = pxx; - -for i=2:7 - [pxx, ~] = pwelch(enc{i}.x, win, [], [], Fs); - enc{i}.pxx = pxx; +for i = 1:length(enc) + [pxx, f] = pwelch(detrend(enc{i}.x, 1), win, Noverlap, Nfft, 1/Ts); + enc{i}.pxx = pxx(f<=5e3); + enc{i}.f = f(f<=5e3); end #+end_src #+begin_src matlab :exports none figure; hold on; -for i=1:7 - plot(f, sqrt(enc{i}.pxx), ... - 'DisplayName', sprintf('Enc %i', i)); +for i = 1:length(enc) + plot(f, sqrt(enc{i}.pxx), 'color', [colors(4,:), 0.5]); end set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); xlabel('Frequency [Hz]'); ylabel('ASD [$m/\sqrt{Hz}$]'); -xlim([10, Fs/2]); -ylim([1e-11, 1e-9]); -legend('location', 'northeast'); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/vionic_noise_asd.pdf', 'width', 'wide', 'height', 'normal'); -#+end_src - -#+name: fig:vionic_noise_asd -#+caption: Amplitude Spectral Density of the measured signal -#+RESULTS: -[[file:figs/vionic_noise_asd.png]] - -We can combine these measurements with the low frequency noise computed in Section ref:sec:thermal_drifts. -The obtained ASD is shown in Figure ref:fig:vionic_noise_asd_combined. -#+begin_src matlab :exports none -[pxx_h, f_h] = pwelch(enc{2}.x, hanning(ceil(10/Ts)), [], [], Fs); - -figure; -hold on; -plot(f_h(f_h>0.6), sqrt(pxx_h(f_h>0.6)), 'k-'); -plot(f_l(f_l<1), sqrt(pxx_l(f_l<1)), 'k-') -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('ASD [$m/\sqrt{Hz}$]'); -xlim([1e-2, Fs/2]); -ylim([1e-12, 1e-8]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/vionic_noise_asd_combined.pdf', 'width', 'wide', 'height', 'normal'); -#+end_src - -#+name: fig:vionic_noise_asd_combined -#+caption: Combined low frequency and high frequency noise measurements -#+RESULTS: -[[file:figs/vionic_noise_asd_combined.png]] - -*** Noise Model -<> - -Let's create a transfer function that approximate the measured noise of the encoder. -#+begin_src matlab -Gn_e = 1.8e-11/(1 + s/2/pi/1e4); -#+end_src - -The amplitude of the transfer function and the measured ASD are shown in Figure ref:fig:vionic_noise_asd_model. - -#+begin_src matlab :exports none -figure; -hold on; -plot(f, sqrt(enc{1}.pxx), 'color', [0, 0, 0, 0.5], 'DisplayName', '$\Gamma_n(\omega)$'); -for i=2:7 - plot(f, sqrt(enc{i}.pxx), 'color', [0, 0, 0, 0.5], ... - 'HandleVisibility', 'off'); -end -plot(f, abs(squeeze(freqresp(Gn_e, f, 'Hz'))), 'r-', 'DisplayName', '$|G_n(j\omega)|$'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('ASD [$m/\sqrt{Hz}$]'); -xlim([10, Fs/2]); -ylim([1e-11, 1e-10]); -legend('location', 'northeast'); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/vionic_noise_asd_model.pdf', 'width', 'wide', 'height', 'normal'); -#+end_src - -#+name: fig:vionic_noise_asd_model -#+caption: Measured ASD of the noise and modeled one -#+RESULTS: -[[file:figs/vionic_noise_asd_model.png]] - -The cumulative amplitude spectrum is now computed and shown in Figure ref:fig:vionic_noise_cas_model. - -We can see that the Root Mean Square value of the measurement noise is $\approx 1.6 \, nm$ as advertise in the datasheet. - -#+begin_src matlab :exports none -for i = 1:7 - enc{i}.CPS = flip(-cumtrapz(flip(f), flip(enc{i}.pxx))); -end - -CAS_Gn = flip(-cumtrapz(flip(f), flip(abs(squeeze(freqresp(Gn_e, f, 'Hz'))).^2))); -#+end_src - -#+begin_src matlab :exports none -figure; -hold on; -plot(f, sqrt(enc{1}.CPS), 'color', [0, 0, 0, 0.5], 'DisplayName', '$CAS_n(\omega)$'); -for i=2:7 - plot(f, sqrt(enc{i}.CPS), 'color', [0, 0, 0, 0.5], 'HandleVisibility', 'off'); -end -plot(f, sqrt(CAS_Gn), 'r-', 'DisplayName', 'model'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('CPS [$m$]'); -xlim([10, Fs/2]); -ylim([1e-10, 1e-8]); -legend('location', 'northeast'); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/vionic_noise_cas_model.pdf', 'width', 'wide', 'height', 'normal'); -#+end_src - -#+name: fig:vionic_noise_cas_model -#+caption: Meassured CAS of the noise and modeled one -#+RESULTS: -[[file:figs/vionic_noise_cas_model.png]] - -*** Automatic Gain Control -#+begin_src matlab -agc = load('noise_meas_80h_100Hz_1.mat', 't', 'x'); -no_agc = load('noise_meas_100Hz_without_AGC.mat', 't', 'x'); -#+end_src - -#+begin_src matlab -figure; -hold on; -plot(agc.t/3600, 1e9*agc.x) -plot(no_agc.t/3600, 1e9*no_agc.x) +xlim([1, 5e3]); ylim([1e-12, 1e-8]); #+end_src ** External Metrology @@ -2446,6 +2189,48 @@ Different options: For the final tests, QuDIS were used. +** Conclusion + +#+begin_src matlab +f = dac.f; + +length(dac.pxx) +length(adc.pxx) +length(pd200{1}.pxx) +length(enc{1}.pxx) + +psd_z_dac = 6*(abs(squeeze(freqresp(Gd('z', 'nda1' ), f, 'Hz'))).^2).*dac.pxx; +psd_z_adc = 6*(abs(squeeze(freqresp(Gd('z', 'nad1' ), f, 'Hz'))).^2).*adc.pxx; +psd_z_amp = 6*(abs(squeeze(freqresp(Gd('z', 'namp1'), f, 'Hz'))).^2).*pd200{1}.pxx; +psd_z_enc = 6*(abs(squeeze(freqresp(Gd('z', 'ddL1' ), f, 'Hz'))).^2).*enc{1}.pxx; +psd_z_tot = psd_z_dac + psd_z_adc + psd_z_amp + psd_z_enc; + +rms_z_tot = sqrt(trapz(f, psd_z_tot)); +#+end_src + +- [ ] Compare with measurement noise? or effect of measurement noise => higher so it's OK? +- [ ] Or compare with specifications? + +From all the measured noises, compute the obtained PSD error in Y and Z (show PSD of individual + Sum + Cumulative?) + +#+begin_src matlab :exports none :results none +%% Measured output voltage noise of the PD200 amplifiers +figure; +hold on; +plot(f, sqrt(psd_z_tot), 'k-', 'linewidth', 2, 'DisplayName', sprintf('Total: %.1f nm RMS', 1e9*rms_z_tot)); +plot(f, sqrt(psd_z_amp), 'color', colors(2, :), 'DisplayName', 'PD200'); +plot(f, sqrt(psd_z_dac), 'color', colors(1,:), 'DisplayName', 'DAC') +plot(f, sqrt(psd_z_adc), 'color', colors(3,:), 'DisplayName', 'ADC') +plot(f, sqrt(psd_z_enc), 'color', colors(5,:), 'DisplayName', 'ENC') +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('ASD [$m/\sqrt{Hz}$]'); +leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; +xlim([1, 5e3]); +xticks([1e0, 1e1, 1e2, 1e3]) +#+end_src + * Conclusion :PROPERTIES: :UNNUMBERED: t @@ -2580,3 +2365,7 @@ function [nano_hexapod] = initializeSimplifiedNanoHexapod(args) end end #+end_src + +* Footnotes + +[fn:detail_instrumentation_1] The manufacturer proposed to remove the $50\,\Omega$ output resistor to improve to small signal bandwidth above $10\,kHz$ diff --git a/nass-instrumentation.pdf b/nass-instrumentation.pdf index f863c97..9d6a328 100644 Binary files a/nass-instrumentation.pdf and b/nass-instrumentation.pdf differ diff --git a/nass-instrumentation.tex b/nass-instrumentation.tex index 39696a0..c40236e 100644 --- a/nass-instrumentation.tex +++ b/nass-instrumentation.tex @@ -1,4 +1,4 @@ -% Created 2025-02-27 Thu 14:29 +% Created 2025-03-14 Fri 22:33 % Intended LaTeX compiler: pdflatex \documentclass[a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc]{scrreprt} @@ -32,6 +32,10 @@ The required instrumentation are then selected based on obtained noise specifica The received instrumentation are characterized in Section \ref{sec:detail_instrumentation_characterization}. +\begin{itemize} +\item Say the the real time controller is a Speedgoat machine, as it is the standard real time controller used at the ESRF +\end{itemize} + \begin{figure}[htbp] \centering \includegraphics[scale=1]{figs/detail_instrumentation_plant.png} @@ -40,42 +44,108 @@ The received instrumentation are characterized in Section \ref{sec:detail_instru \chapter{Dynamic Error Budgeting} \label{sec:detail_instrumentation_dynamic_error_budgeting} -\textbf{Goal}: get maximum noise of instrumentation +\textbf{Goal}: +\begin{itemize} +\item Write specifications regarding the maximum noise of instrumentation (ADC, DAC and voltage amplifier) +such that it induces acceptable vibrations levels +\end{itemize} \textbf{Procedure}: \begin{itemize} -\item Get closed-loop transfer functions from noises to positioning error (only vertical?) -Need the multi-body model with controllers -Or maybe simplified 1DoF ? -\item Suppose a maximum error ASD. -Suppose flat ASD, bandwidth of \textasciitilde{}200Hz (\textbf{should we really consider 200Hz? and not 10kHz? makes use differences}), maximum RMS of \textasciitilde{}10nmRMS => x nm/sqrt(Hz) -\item Deduce the maximum ASD of the noise sources +\item Get closed-loop transfer functions from disturbance sources (noise of ADC, DAC and amplifier noise) to positioning error +This is done using the multi-body model, with 2DoF APA model (having voltage input and outputs) +\item Focus is made on the vertical direction, as it is the direction with the most stringent requirements. +If horizontal directions are considered, requirements are just less stringent than for the vertical direction. +\item Deduce the maximum acceptable ASD of the noise sources \end{itemize} -Have a look at his report: \href{file:///home/thomas/Cloud/work-projects/ID31-NASS/matlab/nass-simscape/org/noise\_budgeting.org}{file:\textasciitilde{}/Cloud/work-projects/ID31-NASS/matlab/nass-simscape/org/noise\_budgeting.org} -\section{Closed-Loop transfer functions} - +As the voltage amplifier gain will impact how the DAC noise will be amplified, some assumption are made: \begin{itemize} -\item Most stringent requirement: vertical vibrations below 15nm RMS -\item Because of system symmetry, only one strut is considered -It is suppose that the vibrations induced by each strut is uncorrelated -combination of 6 actuators with uncorrelated noise => x2.5 -\item Therefore, each actuator should induce less than 15/2.5=6nm RMS of vibration in the vertical direction +\item we want to apply -20 to 150V to the stacks +\item Typical ADC are +/-10V +\item Assumption of voltage amplifier with gain 20 +\end{itemize} +\section{Closed-Loop Sensitivity to Instrumentation Disturbances} + +The following noise sources are considered (Figure \ref{fig:detail_instrumentation_plant}): +\begin{itemize} +\item \(n_{da}\): output voltage noise of the DAC +\item \(n_{amp}\): output voltage noise of the voltage amplifier +\item \(n_{ad}\): voltage noise of the ADC measuring the force sensor stacks \end{itemize} -The following noise sources are considered: -\begin{itemize} -\item from noise of the actuator voltage to error -\item from force sensor noise to error -\item from measurement noise to error -\end{itemize} +Encoder noise, only used to estimate \(R_z\) is found to have little impact on the vertical sample error and is therefore ommited from this analysis for clarity. + +The transfer function from these three noise sources (for one strut) to the vertical error of the sample are estimated from the multi-body model, including the APA300ML and the designed flexible joints (Figure \ref{fig:detail_instrumentation_noise_sensitivities}). + +The lateral error was also considered, but the specifications are less stringent than vertical error and the sensitivity to disturbances is smaller. + +\begin{figure}[htbp] +\centering +\includegraphics[scale=1]{figs/detail_instrumentation_noise_sensitivities.png} +\caption{\label{fig:detail_instrumentation_noise_sensitivities}Transfer function from noise sources to vertical motion errors} +\end{figure} \section{Estimation of maximum instrumentation noise} +From previous analysis, we know how the noise of the instrumentation will affect the vertical error of the sample. +Now, we want to determine specifications for each instrumentation such that the effect on the vertical error of the sample is within specifications. + +Most stringent requirement: \begin{itemize} -\item Output the maximum instrumentation noise ASD in \texttt{.mat} files (that will be used to compare with the obtained instrumentation) +\item vertical vibrations less than the smallest expected beam size of 100nm +\item This corresponds to a maximum allowed vibration of 15nm RMS \end{itemize} +Assumption on the noise: +\begin{itemize} +\item uncorrelated, which is reasonable. +This means that the PSD of the different noise sources adds up. +\end{itemize} + +Use of system symmetry to simplify the analysis: +\begin{itemize} +\item the effect of all the struts on the vertical errors are identical (verify from the extracted sensitivity curves). +Therefore only one strut can be considered for this analysis, and the total effect of the six struts is just six times the effect of one strut (in terms of power, but in terms of RMS value it's only sqrt(6)=2.5) +\end{itemize} + +In order to have specifications for the noise of the instrumentation, assumptions: +\begin{itemize} +\item flat noise, which is quite typical +\end{itemize} + +The noise specification is computed such that if all the instrumentation have this maximum noise, the specification in terms of vertical error is still respected. +This is a pessimistic choice, but it gives a rough idea of the specifications. + +Obtained maximum noise are: +\begin{itemize} +\item DAC maximum output noise ASD \(14\,\mu V/\sqrt{Hz}\). +\item Voltage amplifier maximum output voltage noise ASD \(280\,\mu V/\sqrt{Hz}\) +\item ADC maximum measurement noise ASD \(11\,\mu V/\sqrt{Hz}\). +\end{itemize} + +In terms of RMS noise, +\begin{itemize} +\item DAC: <1 mV RMS +\item Voltage amplifier: < 20 mV RMS +\item ADC: < 0.8 mV RMS +\end{itemize} + +\begin{table}[htbp] +\caption{\label{tab:detail_instrumentation_specification_noise}Obtained specification in terms of noise} +\centering +\begin{tabularx}{0.7\linewidth}{Xccc} +\toprule + & ADC & DAC & Amplifier\\ +\midrule +Maximum ASD & \(11\,\mu V/\sqrt{Hz}\) & \(14\,\mu V/\sqrt{Hz}\) & \(280\,\mu V/\sqrt{Hz}\)\\ +RMS Noise & \(0.8\,mV\,\text{RMS}\) & \(1\,mV\,\text{RMS}\) & \(20\,mV\,\text{RMS}\)\\ +\bottomrule +\end{tabularx} +\end{table} + +If the Amplitude Spectral Density of the noise of the ADC, DAC and voltage amplifiers are all below the specified maximum noises, then the induced vertical error will be below 15nmRMS. + \chapter{Choice of Instrumentation} \label{sec:detail_instrumentation_choice} In previous section: noise characteristics. @@ -86,149 +156,163 @@ ADC, DAC, Voltage amplifier, Encoder \textbf{Model of each instrument} (transfer function + noise source). In this section, also tell which instrumentation has been bought, and different options. -\section{Piezoelectric Voltage Amplifier} -Low pass Filter \begin{itemize} -\item Capacitance of the piezoelectric actuator -\item Output impedance of the voltage amplifier +\item[{$\square$}] block diagram of the model of the amplifier \end{itemize} +\section{Piezoelectric Voltage Amplifier} +There are several characteristics of the piezoelectric voltage amplifiers that should be considered. +To be able to use the full stroke of the piezoelectric actuator, the voltage output should be between -20 and 150V. +It should accept an analog input voltage, preferably between -10 and 10V. -Noise: \cite{spengen20_high_voltag_amplif} -Bandwidth: \cite{spengen16_high_voltag_amplif} +\paragraph{Small signal Bandwidth and Output Impedance} -A picture of the PD200 amplifier is shown in Figure \ref{fig:amplifier_PD200}. +There are two bandwidth that should be considered for a piezoelectric voltage amplifier: large signal bandwidth and small signal bandwidth. +Large signal bandwidth are linked to the output current capacities of the amplifier and will be discussed next. + +Small signal bandwidth of the voltage amplifier is very important for feedback applications as it can limit the bandwidth of the complete feedback system. + +A simplified electrical model of a voltage amplifier connected to a piezoelectric stack is shown in Figure \ref{fig:detail_instrumentation_amp_output_impedance}. +This model is only valid for small signals, but it well models the small signal bandwidth limitation \cite[, chap. 14]{fleming14_desig_model_contr_nanop_system}. +\(R_o\) corresponds to the output impedance of the amplifier. +With the piezoelectric load that corresponds to a capacitance \(C_p\), it forms a first order low pass filter \eqref{eq:detail_instrumentation_amp_output_impedance}. + +\begin{equation}\label{eq:detail_instrumentation_amp_output_impedance} + \frac{V_a}{V_i}(s) = \frac{1}{1 + \frac{s}{\omega_0}}, \quad \omega_0 = \frac{1}{R_o C_p} +\end{equation} \begin{figure}[htbp] \centering -\includegraphics[scale=1,width=0.7\linewidth]{figs/amplifier_PD200.png} -\caption{\label{fig:amplifier_PD200}Picture of the PD200 Voltage Amplifier} +\includegraphics[scale=1]{figs/detail_instrumentation_amp_output_impedance.png} +\caption{\label{fig:detail_instrumentation_amp_output_impedance}Electrical model of a voltage amplifier with output impedance \(R_0\) connected to a piezoelectric stack with capacitance \(C_p\)} \end{figure} +Therefore, the small signal bandwidth is load dependent. +As the capacitance load of the two piezoelectric stacks correspond to a capacitance \(C_p = 8.8\,\mu F\). +If a small signal bandwidth of \(f_0 = \frac{\omega_0}{2\pi} = 5\,kHz\) is wanted, it corresponds to a maximum output impedance of \(R_0 = 3.6\,\Omega\). + +\paragraph{Large signal Bandwidth} + +Large signal bandwidth are linked to the maximum output capabilities of the amplifiers in terms of amplitude as a function of frequency \cite{spengen16_high_voltag_amplif}. + +As the primary objective of the NASS is to stabilize the position and not to perform scans, this specification is not as important as the small signal bandwidth. + +However, let's take into account scanning capabilities. +In the worst case: constant velocity scan (i.e. triangular reference signal) with a repetition rate of \(f_r = 100\,\text{Hz}\) and using full voltage capabilities of the piezoelectric actuator \(V_{pp} = 170\,V\). + +There are two things to consider: +\begin{itemize} +\item Slew rate that should be above \(2 \cdot V_{pp} \cdot f_r = 34\,V/ms\) +This specification is easily achieved +\item Current output capabilities: as the capacitance impedance decreases the the inverse of the frequency, it can reach very low values at high frequency +In order to reach high voltage at high frequency, the required current that the voltage amplifier needs to provide may reach very large values. +\(I_{\text{max}} = 2 \cdot V_{pp} \cdot f \cdot C_p = 0.3\,A\) +\end{itemize} + +\paragraph{Output voltage noise} + +As discussed in Section \ref{sec:detail_instrumentation_dynamic_error_budgeting}, the output noise of the voltage amplifier should be smaller than \(20\,mV\,\text{RMS}\). + +As explained in \cite{spengen20_high_voltag_amplif}, the load capacitance of the piezoelectric stack filters the output noise of the amplifier (low pass filter of Figure \ref{fig:detail_instrumentation_amp_output_impedance}). +Therefore, when comparing noise of different voltage amplifiers, it should be noted what capacitance of the load is considered (i.e. the low signal bandwidth considered). + +Here, the output noise should be smaller than 20mVRMS for a load of 8.8uF. + +\paragraph{Choice of voltage amplifier} + The specifications as well as the amplifier characteristics as shown in the datasheet are summarized in Table \ref{tab:pd200_characteristics}. +The most important characteristics are the (small signal) bandwidth > 5 [kHz] and the output voltage noise (< 20 [mV RMS]). + + +\begin{itemize} +\item Issue for the selection: manufacturers are not specifying the output noise as a function of frequency (i.e. the ASD of the noise), but only the RMS value (i.e. the integrated value over all frequency). +It does not take into account the frequency dependency of the noise, that is very important to perform error budgets +Also, the load the estimate the bandwidth and noise is often not mentioned (or no load for the bandwidth, and high capacitive load for the noise). +\item Explain why the PD200 was selected: +\begin{itemize} +\item fulfill the specification +\item clear documentation, especially about noise and bandwidth (Figure \ref{fig:detail_instrumentation_pd200_specs}) +\end{itemize} +\end{itemize} + \begin{table}[htbp] \caption{\label{tab:pd200_characteristics}Characteristics of the PD200 compared with the specifications} \centering -\begin{tabularx}{0.7\linewidth}{lcc} +\begin{tabularx}{\linewidth}{Xcccc} \toprule -\textbf{Characteristics} & \textbf{Manual} & \textbf{Specification}\\ +\textbf{Specification} & \textbf{PD200} & WMA-200 & LA75B & E-505\\ \midrule -Input Voltage Range & +/- 10 [V] & +/- 10 [V]\\ -Output Voltage Range & -50/150 [V] & -20/150 [V]\\ -Gain & 20 [V/V] & \\ -Maximum RMS current & 0.9 [A] & > 50 [mA]\\ -Maximum Pulse current & 10 [A] & \\ -Slew Rate & 150 [V/us] & \\ -Noise (10uF load) & 0.7 [mV RMS] & < 2 [mV rms]\\ -Small Signal Bandwidth (10uF load) & 7.4 [kHz] & > 5 [kHz]\\ -Large Signal Bandwidth (150V, 10uF) & 300 [Hz] & > 1 [Hz]\\ +Input Voltage Range: \(\pm 10\,V\) & \(\pm 10\,V\) & \(\pm8.75\,V\) & \(-1/7.5\,V\) & \\ +Output Voltage Range: \(-20/150\,V\) & \(-50/150\,V\) & \(\pm 175\,V\) & \(-20/150\,V\) & -30/130\\ +Gain & 20 & 20 & 20 & 10\\ +Output Current \(> 50\,mA\) & \(900\,mA\) & \(150\,mA\) & \(360\,mA\) & \(215\,mA\)\\ +Slew Rate \(> 34\,V/ms\) & \(150\,V/\mu s\) & \(80\,V/\mu s\) & n/a & n/a\\ +Output noise (10uF load) \(< 20\,mV\ \text{RMS}\) & \(0.7\,mV\,\text{RMS}\) (\(10\,\mu F\) load) & \(0.05\,mV\) (\(10\,\mu F\) load) & \(3.4\,mV\) & \(0.6\,mV\)\\ +Small Signal Bandwidth (\(10\,\mu F\) load): \(> 5\,kHz\) & \(6.4\,kHz\) (\(10\,\mu F\) load) & \(300\,Hz\)\footnotemark & \(30\,kHz\) (unloaded) & n/a\\ +Output Impedance: \(< 3.6\,\Omega\) & n/a & \(50\,\Omega\)\textsuperscript{\ref{org9c934eb}} & n/a & n/a\\ \bottomrule \end{tabularx} -\end{table} - -The most important characteristics are the large (small signal) bandwidth > 5 [kHz] and the small noise (< 2 [mV RMS]). - -For a load capacitance of \(10\,\mu F\), the expected \(-3\,dB\) bandwidth is \(6.4\,kHz\) (Figure \ref{fig:pd200_expected_small_signal_bandwidth}) and the low frequency noise is \(650\,\mu V\,\text{rms}\) (Figure \ref{fig:pd200_expected_noise}). - -These two characteristics are respectively measured in Section \ref{sec:tf_meas} and Section \ref{sec:noise_meas}. +\end{table}\footnotetext[1]{\label{org9c934eb}The manufacturer proposed to remove the \(50\,\Omega\) output resistor to improve to small signal bandwidth above \(10\,kHz\)} \begin{figure}[htbp] -\centering -\includegraphics[scale=1,width=0.7\linewidth]{./figs/pd200_expected_small_signal_bandwidth.png} -\caption{\label{fig:pd200_expected_small_signal_bandwidth}Expected small signal bandwidth} +\begin{subfigure}{0.48\textwidth} +\begin{center} +\includegraphics[scale=1,width=0.95\linewidth]{figs/detail_instrumentation_pd200_specs_bandwidth.png} +\end{center} +\subcaption{\label{fig:detail_instrumentation_pd200_specs_bandwidth}sub caption a} +\end{subfigure} +\begin{subfigure}{0.48\textwidth} +\begin{center} +\includegraphics[scale=1,width=0.95\linewidth]{figs/detail_instrumentation_pd200_specs_noise.png} +\end{center} +\subcaption{\label{fig:detail_instrumentation_pd200_specs_noise}sub caption b} +\end{subfigure} +\caption{\label{fig:detail_instrumentation_pd200_specs}Caption with reference to sub figure (\subref{fig:detail_instrumentation_pd200_specs_bandwidth})} \end{figure} -\begin{figure}[htbp] -\centering -\includegraphics[scale=1,width=0.7\linewidth]{figs/pd200_expected_noise.png} -\caption{\label{fig:pd200_expected_noise}Expected Low frequency noise from 0.03Hz to 20Hz} -\end{figure} +\section{ADC and DAC} +\paragraph{Synchronicity and Jitter} -\section{ADC} - -Talk about input impedance, \ldots{} -Add resistor, reading of the force sensor: ADC + \href{file:///home/thomas/Cloud/work-projects/ID31-NASS/matlab/test-bench-force-sensor/test-bench-force-sensor.org}{test-bench-force-sensor} - -\section{DAC} - -ADC and DAC need to be sample synchronously with the control system, with low jitter. -\cite{abramovitch22_pract_method_real_world_contr_system} -\cite{abramovitch23_tutor_real_time_comput_issues_contr_system} - -\section{Relative Displacement Sensors} +For control systems, it is very important that the inputs and outputs are sampled synchronously with the controller and with low jitter \cite{abramovitch22_pract_method_real_world_contr_system,abramovitch23_tutor_real_time_comput_issues_contr_system}. +Therefore, the ADC and DAC: \begin{itemize} -\item Encoders -\item Capacitive Sensors -\item Eddy current sensors - -\item[{$\square$}] Speak about slip-ring issue +\item Needs to be well interfaced with the Speedgoat +\item Sampling frequency of 10kHz +\item Synchronous with the Speedgoat \end{itemize} -Specifications: +\paragraph{Sampling Frequency, Bandwidth and delays} + +Several requirements that may appear the same but are different: \begin{itemize} -\item used for relative positioning -\item vertical errors of 15nmRMS => 6nmRMS for each strut -\item Stroke > 100um +\item Sampling frequency: defines the interval between two sampled points, also determines the Nyquist frequency +\item Bandwidth: defines the maximum frequency of a measured signal (typically specified as the -3dB point), usually limited by implemented anti-aliasing filters +\item Delay/latency: delay between the analog signal at the input of the ADC to the digital information transferred to the control system \end{itemize} -The Vionic encoder is shown in Figure \ref{fig:encoder_vionic}. +Sigma-Delta ADC can have extremely good noise characteristics, high bandwidth and sampling frequency but very poor latency. +Typically, the latency can reach 20 times the sampling period \cite[, chapt. 8.4]{schmidt20_desig_high_perfor_mechat_third_revis_edition}. -\begin{figure}[htbp] -\centering -\includegraphics[scale=1,width=0.6\linewidth]{figs/encoder_vionic.png} -\caption{\label{fig:encoder_vionic}Picture of the Vionic Encoder} -\end{figure} +Therefore, Sigma-Delta ADC are very well used for signal acquisition, but has limited use for real-time control where latency is critical. +Therefore, for real time control applications, SAR-ADC (Successive approximation ADCs) is still the mostly applied type because of its single sample latency. -From the Renishaw \href{https://www.renishaw.com/en/how-optical-encoders-work--36979}{website}: -\begin{quote} -The VIONiC encoder features the third generation of Renishaw's unique filtering optics that average the contributions from many scale periods and effectively filter out non-periodic features such as dirt. -The nominally square-wave scale pattern is also filtered to leave a pure sinusoidal fringe field at the detector. -Here, a multiple finger structure is employed, fine enough to produce photocurrents in the form of four symmetrically phased signals. -These are combined to remove DC components and produce sine and cosine signal outputs with high spectral purity and low offset while maintaining \textbf{bandwidth to beyond 500 kHz}. +\paragraph{ADC Noise} -Fully integrated advanced dynamic signal conditioning, Auto Gain , Auto Balance and Auto Offset Controls combine to ensure \textbf{ultra-low Sub-Divisional Error (SDE) of typically} \(<\pm 15\, nm\). +From the dynamical error budget in Section \ref{sec:detail_instrumentation_dynamic_error_budgeting} +Measurement noise ASD should be bellow 11uV/sqrt(Hz), 0.8mV RMS -This evolution of filtering optics, combined with carefully-selected electronics, provide incremental signals with wide bandwidth achieving a maximum speed of 12 m/s with the lowest positional jitter (noise) of any encoder in its class. -Interpolation is within the readhead, with fine resolution versions being further augmented by additional noise-reducing electronics to achieve \textbf{jitter of just 1.6 nm RMS}. -\end{quote} +Linearity is not a concerned as it is not used for positioning but only for active damping +So the accuracy of the measurement is not a concern -The expected interpolation errors (non-linearity) is shown in Figure \ref{fig:vionic_expected_noise}. +ADC are affected by various noise sources +One of them is quantization noise, and is linked to the fact that input/output values can only take a finite number of values. +Let's first find the number of bits such that the quantization noise is fulfilling the requirements. -\begin{figure}[htbp] -\centering -\includegraphics[scale=1,width=\linewidth]{./figs/vionic_expected_noise.png} -\caption{\label{fig:vionic_expected_noise}Expected interpolation errors for the Vionic Encoder} -\end{figure} - -The characteristics as advertise in the manual as well as our specifications are shown in Table \ref{tab:vionic_characteristics}. - -\begin{table}[htbp] -\caption{\label{tab:vionic_characteristics}Characteristics of the Vionic compared with the specifications} -\centering -\begin{tabularx}{0.6\linewidth}{lcc} -\toprule -\textbf{Characteristics} & \textbf{Specification} & \textbf{Manual}\\ -\midrule -Time Delay & < 0.5 ms & < 10 ns\\ -Bandwidth & > 5 kHz & > 500 kHz\\ -Noise & < 50 nm rms & < 1.6 nm rms\\ -Linearity & & < +/- 15 nm\\ -Range & > 200 um & Ruler length\\ -\bottomrule -\end{tabularx} -\end{table} - -\chapter{Characterization of Instrumentation} -\label{sec:detail_instrumentation_characterization} -For each element, make a table with the specifications, and the measured performances for comparison. -\section{Analog to Digital Converters} - -\href{file:///home/thomas/Cloud/work-projects/ID31-NASS/matlab/test-bench-PD200/test-bench-pd200.org}{Quantization Noise of the ADC} - -\paragraph{Quantization Noise} +Let's first suppose that the ADC is ideal and the only noise comes from the quantization error. +Interestingly, the noise amplitude is uniformly distributed. Let's note: \begin{itemize} @@ -238,16 +322,13 @@ Let's note: \item \(f_s\) is the sample frequency in [Hz] \end{itemize} -Let's suppose that the ADC is ideal and the only noise comes from the quantization error. -Interestingly, the noise amplitude is uniformly distributed. - The quantization noise can take a value between \(\pm q/2\), and the probability density function is constant in this range (i.e., it’s a uniform distribution). -Since the integral of the probability density function is equal to one, its value will be \(1/q\) for \(-q/2 < e < q/2\) (Fig. \ref{fig:probability_density_function_adc}). +Since the integral of the probability density function is equal to one, its value will be \(1/q\) for \(-q/2 < e < q/2\) (Fig. \ref{fig:detail_instrumentation_adc_quantization}). \begin{figure}[htbp] \centering -\includegraphics[scale=1]{figs/probability_density_function_adc.png} -\caption{\label{fig:probability_density_function_adc}Probability density function \(p(e)\) of the ADC error \(e\)} +\includegraphics[scale=1]{figs/detail_instrumentation_adc_quantization.png} +\caption{\label{fig:detail_instrumentation_adc_quantization}Probability density function \(p(e)\) of the ADC error \(e\)} \end{figure} Now, we can calculate the time average power of the quantization noise as @@ -259,7 +340,7 @@ The other important parameter of a noise source is the power spectral density (P To find the power spectral density, we need to calculate the Fourier transform of the autocorrelation function of the noise. Assuming that the noise samples are not correlated with one another, we can approximate the autocorrelation function with a delta function in the time domain. -Since the Fourier transform of a delta function is equal to one, the \textbf{power spectral density will be frequency independent}. +Since the Fourier transform of a delta function is equal to one, the power spectral density will be frequency independent (i.e. white noise). Therefore, the quantization noise is white noise with total power equal to \(P_q = \frac{q^2}{12}\). Thus, the two-sided PSD (from \(\frac{-f_s}{2}\) to \(\frac{f_s}{2}\)), we should divide the noise power \(P_q\) by \(f_s\): @@ -271,58 +352,256 @@ Finally, the Power Spectral Density of the quantization noise of an ADC is equal \begin{equation} \begin{aligned} \Gamma &= \frac{q^2}{12 f_s} \\ - &= \frac{\left(\frac{\Delta V}{2^n}\right)^2}{12 f_s} \text{ in } \left[ \frac{V^2}{Hz} \right] + &= \frac{\left(\frac{\Delta V}{2^n}\right)^2}{12 f_s} \quad \text{in} \quad \left[ \frac{V^2}{Hz} \right] \end{aligned} \end{equation} -Let's take a 16bits ADC with a range of +/-10V and a sample frequency of 10kHz. - -The quantization is: -\[ q = \frac{20}{2^{16}} \approx 0.3\,mV \] - -\[ \Gamma_Q = \frac{q^2}{12 f_N} = 7.5 \cdot 10^{-13} \quad [V^2/Hz] \] - -ASD: -\[ 0.88\,\mu V/\sqrt{Hz} \] - - -\paragraph{Speedgoat - IO131 board} - -Internally uses the AD7609 ADC from Analog Devices. -200kSPS -16 bits -+/-10V - -\textbf{oversampling}: \href{../../../../brain/analog_to_digital_converters.org}{Analog to Digital Converters} - -\cite{lab13_improv_adc} - -To have additional \(w\) bits of resolution, the oversampling frequency \(f_{os}\) should be: +The minimum number of bits so that the quantization noise is above some define values can be computed using: \begin{equation} -f_{os} = 4^w \cdot f_s + n_{\text{min}} = \text{log}_2 \left( \frac{\Delta V}{\sqrt{12 Fs} \Phi_{\text{max}}} \right) \end{equation} -\cite{hauser91_princ_overs_conver} +With a sampling frequency \(F_s = 10\,kHz\), a full range of \(\Delta V = 20\,V\) and a maximum allowed ASD \(\Phi_{\text{max}} = 11\,\mu V/\sqrt{Hz}\), the minimum number of bits is \(n_{\text{min}} = 12.4\), which is easily satisfied. -\begin{quote} -Key points to consider are: +\paragraph{DAC Output voltage noise} + +Similarly, the DAC output voltage noise ASD should be below \(14\,\mu V/\sqrt{Hz}\), 1mV RMS. +This corresponds to a 13bits +/-10V DAC. + +\paragraph{Choice of the ADC and DAC Board} + +Based on the above analysis, the choice of ADC and DAC is quite simple. + +Integrated in Speedgoat for best synchronicity. +Chosen model: IO131: \begin{itemize} -\item The noise must approximate \textbf{white noise} with uniform power spectral density over the frequency band of interest. -\item The \textbf{noise amplitude must be sufficient} to cause the input signal to change randomly from sample to sample by amounts comparable to at least the distance between two adjacent codes (i.e., 1 LSB). -\item The input signal can be represented as a random variable that has equal probability of existing at any value between two adjacent ADC codes. +\item 16 analog inputs, based on the AD7609 +\begin{itemize} +\item 16 bits, +/- 10V +\item Maximum sampling rate of 200kSPS +\item Simultaneous sampling +\item Differential inputs: can use shielded twisted pairs for high noise immunity \end{itemize} -\end{quote} +\item 8 analog outputs, based on the AD5754R +\begin{itemize} +\item 16 bits, +/- 10V +\item Conversion time 10us +\item Simultaneous update +\end{itemize} +\end{itemize} + +Noise is not specified, but as it has 16 bits resolution, it should be well below the requirements. +It will be experimentally measured in Section \ref{sec:detail_instrumentation_characterization}. + +\section{Relative Displacement Sensors} + +Specifications: +\begin{itemize} +\item used for relative positioning +\item Small enough to be integrated in each strut +\item vertical errors of 15nmRMS => 6nmRMS for each strut => maximum 6nmRMS sensor noise +\item Stroke > 100um +\end{itemize} + +There are many different sensors that can fulfil the requirements \cite{fleming13_review_nanom_resol_posit_sensor}: +\begin{itemize} +\item Encoders +\item Capacitive Sensors +\item Eddy current sensors +\end{itemize} + +\begin{figure}[htbp] +\begin{subfigure}{0.33\textwidth} +\begin{center} +\includegraphics[scale=1,width=0.9\linewidth]{figs/detail_instrumentation_sensor_encoder.jpg} +\end{center} +\subcaption{\label{fig:detail_instrumentation_sensor_encoder}Optical Linear Encoder} +\end{subfigure} +\begin{subfigure}{0.33\textwidth} +\begin{center} +\includegraphics[scale=1,width=0.9\linewidth]{figs/detail_instrumentation_sensor_eddy_current.png} +\end{center} +\subcaption{\label{fig:detail_instrumentation_sensor_eddy_current}Eddy Current Sensor} +\end{subfigure} +\begin{subfigure}{0.33\textwidth} +\begin{center} +\includegraphics[scale=1,width=0.9\linewidth]{figs/detail_instrumentation_sensor_capacitive.jpg} +\end{center} +\subcaption{\label{fig:detail_instrumentation_sensor_capacitive}Capacitive Sensor} +\end{subfigure} +\caption{\label{fig:detail_instrumentation_sensor_examples}Measurement of strut flexible modes} +\end{figure} + +The implementation: +\begin{itemize} +\item slight advantage to capacitive or eddy current sensors as they can measure in line with the APA (Figure \ref{fig:detail_instrumentation_capacitive_implementation}) +\item for the encoder, the measurement has to be ``offset'' from the strut ``action line'', and therefore relative rotations between the two ends of the APA induces measurement errors (Figure \ref{fig:detail_instrumentation_encoder_implementation}). +\end{itemize} + +\begin{figure}[htbp] +\begin{subfigure}{0.48\textwidth} +\begin{center} +\includegraphics[scale=1,scale=1]{figs/detail_instrumentation_encoder_implementation.png} +\end{center} +\subcaption{\label{fig:detail_instrumentation_encoder_implementation}Optical Encoder} +\end{subfigure} +\begin{subfigure}{0.48\textwidth} +\begin{center} +\includegraphics[scale=1,scale=1]{figs/detail_instrumentation_capacitive_implementation.png} +\end{center} +\subcaption{\label{fig:detail_instrumentation_capacitive_implementation}Capacitive Sensor} +\end{subfigure} +\caption{\label{fig:detail_instrumentation_sensor_implementation}Caption with reference to sub figure} +\end{figure} + +One major issue is the fact that the sensor signals have to pass through an electrical slip-ring (because of the continuous spindle rotation). +Some measurements were performed on the slip-ring integrated in the micro-station, and the cross-talk between different slip-ring channels were found to be quite high. +It was preferred to use a sensor that transmit the measured displacement digitally, such that it is much less sensitive to noise and cross-talk. +For that reason, an optical encoder with digital output was preferred (i.e. the interpolation is performed directly in the head). + +The specifications are summarized in Table \ref{tab:detail_instrumentation_sensor_specs}. + +\begin{table}[htbp] +\caption{\label{tab:detail_instrumentation_sensor_specs}Characteristics of the Vionic compared with the specifications} +\centering +\begin{tabularx}{0.6\linewidth}{Xccc} +\toprule +\textbf{Specification} & \textbf{Renishaw Vionic} & LION CPL190 & Cedrat ECP500\\ +\midrule +Bandwidth \(> 5\,\text{kHz}\) & > 500 kHz & 10kHz & 20kHz\\ +Noise \(< 6\,nm\,\text{RMS}\) & 1.6 nm rms & 4 nm rms & 15 nm rms\\ +Range \(> 100\,\mu m\) & Ruler length & 250 um & 500um\\ +In line measurement & & \(\times\) & \(\checkmark\)\\ +Digital Output & \(\times\) & & \\ +\bottomrule +\end{tabularx} +\end{table} + +\chapter{Characterization of Instrumentation} +\label{sec:detail_instrumentation_characterization} +All the instrumentation was then procured and tested individually to verify whether is fulfils the specifications or not. \begin{itemize} -\item[{$\boxtimes$}] Check noise and compare with quantization noise -\item[{$\square$}] See is oversampling increase performances, and how much compared to the prediction -Seems to increase the perf too much +\item[{$\square$}] Code couleur: +\begin{center} +\begin{tabular}{ll} +Yellow & ADC\\ +Rouge & PD200\\ +Vert & Femto\\ +blue & DAC\\ +\end{tabular} +\end{center} +\item[{$\square$}] Make sure that at some point I talk about twisted pairs etc.. Maybe use the nice schematic? \end{itemize} +\section{Analog to Digital Converters} +Internally uses the AD7609 ADC from Analog Devices. +200kSPS, 16 bits, +/-10V \paragraph{Measured Noise} +The ADC noise of the IO131 was simply measured by short-circuiting its input with a 50 Ohm resistor. +Results are shown in Figure \ref{fig:detail_instrumentation_adc_noise_measured}. +The ADC noise is a white noise with an amplitude spectral density of \(5.6\,\mu V/\sqrt{Hz}\). + +\begin{figure}[htbp] +\centering +\includegraphics[scale=1]{figs/detail_instrumentation_adc_noise_measured.png} +\caption{\label{fig:detail_instrumentation_adc_noise_measured}Measured ADC noise (IO318)} +\end{figure} + +If required, it is possible to apply some oversampling to lower the obtained noise \cite{lab13_improv_adc}. +To have additional \(w\) bits of resolution, the oversampling frequency \(f_{os}\) should be: +\begin{equation} + f_{os} = 4^w \cdot f_s +\end{equation} + +As the ADC can work at 200kSPS, and we only need 10kSPS, we can have an oversampling factor of 16 and have two more bits of resolution (i.e. reducing the noise by a factor 4). +This works because the noise can be approximated by a white noise and the amplitude is larger than 1 LSB (0.3 mV) \cite{hauser91_princ_overs_conver}. + + +\paragraph{Reading of piezoelectric force sensor} + +There are few other things to consider when measuring the voltage generated by a piezoelectric stack. + +The setup is shown in Figure \ref{fig:detail_instrumentation_force_sensor_adc_setup} where two stacks are used as actuator (in parallel) and one stack is used as sensor. +The voltage amplifier used has a gain of 20 [V/V]. + +\begin{figure}[htbp] +\centering +\includegraphics[scale=1]{figs/detail_instrumentation_force_sensor_adc_setup.png} +\caption{\label{fig:detail_instrumentation_force_sensor_adc_setup}Schematic of the setup} +\end{figure} + +The excitation signal (steps) and measured voltage across the sensor stack are shown in Figure \ref{fig:detail_instrumentation_step_response_force_sensor}. +The measured voltage shows an exponential decay which indicates that the charge across the capacitor formed by the stack is discharging into a resistor. +This corresponds to an RC circuit with a time constant \(\tau = R_i C_p\). +Therefore, first order high filter, with corner frequency \(1/\tau\). + +The exponential curves are fitted and a value of \(\tau = 6.5\,s\) and an offset voltage of \(2.26\,V\) are found. + +With the capacitance being \(C_p = 4.4 \mu F\), the internal impedance of the Speedgoat ADC can be computed as follows \(R_i = \frac{\tau}{C_p} = 1.5\,M\Omega\). + +It is close to the specified value of \(1\,M\Omega\) found in the datasheet + +\begin{minipage}[b]{0.48\linewidth} +\begin{center} +\includegraphics[scale=1,scale=1]{figs/detail_instrumentation_step_response_force_sensor.png} +\captionof{figure}{\label{fig:detail_instrumentation_step_response_force_sensor}Translation Stage} +\end{center} +\end{minipage} +\hfill +\begin{minipage}[b]{0.48\linewidth} +\begin{center} +\includegraphics[scale=1,width=0.95\linewidth]{figs/detail_instrumentation_force_sensor_adc.png} +\captionof{figure}{\label{fig:detail_instrumentation_force_sensor_adc}Tilt Stage} +\end{center} +\end{minipage} + +As shown in Figure \ref{fig:detail_instrumentation_step_response_force_sensor}, the voltage across the Piezoelectric sensor stack shows a constant voltage offset. +This can be explained by looking at the electrical model shown in Figure \ref{fig:detail_instrumentation_force_sensor_adc} (taken from \cite{reza06_piezoel_trans_vibrat_contr_dampin}). + +The differential amplifier in the Speedgoat has some input bias current \(i_n\) that induces a voltage offset \(V_{\text{off}}\) across its own internal resistance \(R_i\). +Note that the impedance of the piezoelectric stack is much larger that that at DC. + +Therefore, the input bias current \(i_n\) is estimated from \(i_n = V_{\text{off}}/R_i = 1.5\,\mu A\). + +In order to reduce the input voltage offset and to increase the corner frequency of the high pass filter, a resistor is added in parallel to the force sensor. + +\begin{itemize} +\item Reduction of input voltage offset: +\[ V_{off} = \frac{R_a R_{in}}{R_a + R_{in}} i_n \] +\item Increase the high pass corner frequency \(f_c\) +\[ C_p \frac{R_{in}R_a}{R_{in} + R_a} = \tau_c = \frac{1}{f_c} \] +\[ R_a = \frac{R_i}{f_c C_p R_i - 1} \] +\end{itemize} + + +The resistor is chosen such that the high pass corner frequency is equal to 3Hz. +This corresponds to a resistor of \(R_p = 80\,k\Omega\). + +With this parallel resistance value, the voltage offset would be \(V_{\text{off}} = 0.11\,V\), which is much more acceptable. + +To validate this, a resistor \(R_p \approx 82\,k\Omega\) is then added in parallel with the force sensor as shown in Figure \ref{fig:detail_instrumentation_force_sensor_adc_R}. +After the resistor is added, the same steps response is performed. +And indeed, we obtain a much smaller offset voltage (\(V_{\text{off}} = 0.15\,V\)) and a much faster time constant (\(\tau = 0.45\,s\)). +This validates the model of the ADC and the effectiveness of the added resistor. + +\begin{minipage}[b]{0.48\linewidth} +\begin{center} +\includegraphics[scale=1,scale=1]{figs/detail_instrumentation_step_response_force_sensor_R.png} +\captionof{figure}{\label{fig:detail_instrumentation_step_response_force_sensor_R}Translation Stage} +\end{center} +\end{minipage} +\hfill +\begin{minipage}[b]{0.48\linewidth} +\begin{center} +\includegraphics[scale=1,width=0.95\linewidth]{figs/detail_instrumentation_force_sensor_adc_R.png} +\captionof{figure}{\label{fig:detail_instrumentation_force_sensor_adc_R}Tilt Stage} +\end{center} +\end{minipage} + \section{Instrumentation Amplifier} -Because the ADC noise may be too large to measure noise of other instruments, a low noise instrumentation amplifier may be used. +Because the ADC noise may be too large to measure noise of other instruments (anything below \(5.6\,\mu V/\sqrt{Hz}\) cannot be distinguish from the noise of the ADC itself), a low noise instrumentation amplifier can be used. Different instrumentation amplifiers were used: \begin{itemize} @@ -332,21 +611,38 @@ Different instrumentation amplifiers were used: \end{itemize} Here, the Femto amplifier is used. -To measure its noise, the gain is set to xxdB, \ldots{} -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/noise_measure_setup_preamp.png} -\caption{\label{fig:noise_measure_setup_preamp}Sources of noise in the experimental setup} -\end{figure} +But first, the input noise of the amplifier is characterized. +\begin{itemize} +\item Footnote: for variable gain amplifiers, it is more convenient to refer to the input noise rather than the output noise. +\end{itemize} + +Its input is short circuited, and the output voltage is measured by the ADC. +The maximum amplifier gain of 80dB (i.e. 10000) is used. + +The measured voltage is then divided by 10000 to obtain the equivalent noise at the input of the voltage amplifier. +In that case, the noise of the ADC is negligible, thanks to the high gain used. + +\begin{minipage}[b]{0.48\linewidth} +\begin{center} +\includegraphics[scale=1,scale=1]{figs/detail_instrumentation_femto_meas_setup.png} +\captionof{figure}{\label{fig:detail_instrumentation_femto_meas_setup}Translation Stage} +\end{center} +\end{minipage} +\hfill +\begin{minipage}[b]{0.48\linewidth} +\begin{center} +\includegraphics[scale=1,scale=1]{figs/detail_instrumentation_femto_input_noise.png} +\captionof{figure}{\label{fig:detail_instrumentation_femto_input_noise}Tilt Stage} +\end{center} +\end{minipage} \section{Digital to Analog Converters} \paragraph{Noise Measurement} -\href{file:///home/thomas/Cloud/work-projects/ID31-NASS/matlab/test-bench-PD200/test-bench-pd200.org}{16bits DAC noise measurement} In order not to have any quantization noise and only measure the output voltage noise of the DAC, we ``ask'' the DAC to output a zero voltage. -The measurement setup is schematically represented in Figure \ref{fig:noise_measure_setup_dac}. +The measurement setup is schematically represented in Figure \ref{fig:detail_instrumentation_dac_setup}. The gain of the pre-amplifier is adjusted such that the measured amplified noise is much larger than the quantization noise of the ADC. The Amplitude Spectral Density \(\Gamma_n(\omega)\) of the measured signal is computed. @@ -362,40 +658,48 @@ And it is verified that the Amplitude Spectral Density of \(n_{da}\) is much lar \begin{figure}[htbp] \centering -\includegraphics[scale=1]{figs/noise_measure_setup_dac.png} -\caption{\label{fig:noise_measure_setup_dac}Sources of noise in the experimental setup} +\includegraphics[scale=1]{figs/detail_instrumentation_dac_setup.png} +\caption{\label{fig:detail_instrumentation_dac_setup}Figure caption} \end{figure} -The obtained Amplitude Spectral Density of the DAC's output voltage is shown in Figure \ref{fig:asd_noise_dac}. - -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/asd_noise_dac.png} -\caption{\label{fig:asd_noise_dac}Amplitude Spectral Density of the measured output voltage noise of the 16bits DAC} -\end{figure} - -\paragraph{Bandwidth} +The obtained Amplitude Spectral Density of the DAC's output voltage is shown in Figure \ref{fig:detail_instrumentation_dac_output_noise}. +It is almost white noise with an ASD of 0.6uV/sqrt(Hz). +There is a little bit of 50Hz, and some low frequency noise (thermal noise?) which are not foreseen to be an issue as it will be inside the bandwidth. DAC is directly wired to the ADC. The transfer function from DAC to ADC is computed. +It corresponds to 1 sample delay (Figure \ref{fig:detail_instrumentation_dac_adc_tf}). -It corresponds to 1 sample delay. +\begin{figure}[htbp] +\begin{subfigure}{0.48\textwidth} +\begin{center} +\includegraphics[scale=1,width=0.95\linewidth]{figs/detail_instrumentation_dac_output_noise.png} +\end{center} +\subcaption{\label{fig:detail_instrumentation_dac_output_noise}sub caption a} +\end{subfigure} +\begin{subfigure}{0.48\textwidth} +\begin{center} +\includegraphics[scale=1,width=0.95\linewidth]{figs/detail_instrumentation_dac_adc_tf.png} +\end{center} +\subcaption{\label{fig:detail_instrumentation_dac_adc_tf}sub caption b} +\end{subfigure} +\caption{\label{fig:detail_instrumentation_dac}Measure transfer function from DAC to ADC - It fits a pure ``1-sample'' delay (\subref{fig:fig_label_a})} +\end{figure} \section{Piezoelectric Voltage Amplifier} -\href{file:///home/thomas/Cloud/work-projects/ID31-NASS/matlab/test-bench-PD200/test-bench-pd200.org}{test-bench-PD200} -\subsection{Noise} -\paragraph{PD200 - Low frequency noise measurement} - -The measurement setup is shown in Figure \ref{fig:noise_measure_setup_pd200}. +\paragraph{Output Voltage Noise} +The measurement setup is shown in Figure \ref{fig:detail_instrumentation_pd200_setup}. The input of the PD200 amplifier is shunted with a 50 Ohm resistor such that there in no voltage input expected the PD200 input voltage noise. The gain of the pre-amplifier is increased in order to measure a signal much larger than the quantization noise of the ADC. +Two piezoelectric stacks of the APA95ML are connected to the PD200 output to have appropriate load. + \begin{figure}[htbp] \centering -\includegraphics[scale=1]{figs/noise_measure_setup_pd200.png} -\caption{\label{fig:noise_measure_setup_pd200}Sources of noise in the experimental setup} +\includegraphics[scale=1]{figs/detail_instrumentation_pd200_setup.png} +\caption{\label{fig:detail_instrumentation_pd200_setup}Sources of noise in the experimental setup} \end{figure} The measured low frequency (<20Hz) \textbf{output} noise of one of the PD200 amplifiers is shown in Figure \ref{fig:pd200_noise_time_lpf}. @@ -408,13 +712,11 @@ It is very similar to the one specified in the datasheet in Figure \ref{fig:pd20 \end{figure} The obtained RMS and peak to peak values of the measured \textbf{output} noise are shown in Table \ref{tab:rms_pkp_noise} and found to be very similar to the specified ones. -\begin{table}[htbp] -\caption{\label{tab:rms_pkp_noise}RMS and Peak to Peak measured low frequency output noise (0.01Hz to 20Hz)} -\centering -\begin{tabularx}{0.5\linewidth}{lcc} -\toprule + +\begin{center} +\begin{tabular}{lrr} & \textbf{RMS [\(\mu V\)]} & \textbf{Peak to Peak [\(mV\)]}\\ -\midrule +\hline Specification [\(10\,\mu F\)] & 714.0 & 4.3\\ PD200 1 & 565.1 & 3.7\\ PD200 2 & 767.6 & 3.5\\ @@ -423,13 +725,8 @@ PD200 4 & 615.7 & 3.5\\ PD200 5 & 651.0 & 2.4\\ PD200 6 & 473.2 & 2.7\\ PD200 7 & 423.1 & 2.3\\ -\bottomrule -\end{tabularx} -\end{table} - -\paragraph{PD200 - High frequency noise measurement} - -The measurement setup is the same as in Figure \ref{fig:noise_measure_setup_pd200}. +\end{tabular} +\end{center} The Amplitude Spectral Density \(\Gamma_n(\omega)\) of the measured signal by the ADC is computed. The Amplitude Spectral Density of the input voltage noise of the PD200 amplifier \(n_p\) is then computed taking into account the gain of the pre-amplifier and the gain of the PD200 amplifier: @@ -445,61 +742,19 @@ And we verify that we are indeed measuring the noise of the PD200 and not the no The Amplitude Spectral Density of the measured \textbf{input} noise is computed and shown in Figure \ref{fig:asd_noise_pd200_10uF}. It is verified that the contribution of the PD200 noise is much larger than the contribution of the pre-amplifier noise of the quantization noise. -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/asd_noise_pd200_10uF.png} -\caption{\label{fig:asd_noise_pd200_10uF}Amplitude Spectral Density of the measured input voltage noise of the PD200 amplifiers} -\end{figure} -\begin{note} The Amplitude Spectral Density of the input noise of the PD200 amplifiers present sharp peaks. It is not clear yet what causes such peaks and if these peaks have high influence on the total RMS noise of the amplifiers. -\end{note} - -\subsection{Bandwidth} -\paragraph{Maximum Frequency/Voltage to not overload the amplifier} -\label{sec:tf_meas_w_max} - -Then the maximum output current of the amplifier is reached, the amplifier automatically shuts down itself. -We should then make sure that the output current does not reach this maximum specified current. - -The maximum current is 1A [rms] which corresponds to 0.7A in amplitude of the sin wave. - -The impedance of the capacitance is: -\[ Z_C(\omega) = \frac{1}{jC\omega} \] - -Therefore the relation between the output current amplitude and the output voltage amplitude for sinusoidal waves of frequency \(\omega\): -\[ V_{out} = \frac{1}{C\omega} I_{out} \] - -Moreover, there is a gain of 20 between the input voltage and the output voltage: -\[ 20 V_{in} = \frac{1}{C\omega} I_{out} \] - -For a specified voltage input amplitude \(V_{in}\), the maximum frequency at which the output current reaches its maximum value is: -\begin{equation} -\boxed{\omega_{\text{max}} = \frac{1}{20 C V_{in}} I_{out,\text{max}}} -\end{equation} -with: -\begin{itemize} -\item \(\omega_{\text{max}}\) the maximum input sinusoidal frequency in Radians per seconds -\item \(C\) the load capacitance in Farads -\item \(V_{in}\) the input voltage sinusoidal amplitude in Volts -\item \(I_{out,\text{max}}\) the specified maximum output current in Amperes -\end{itemize} - -\(\omega_{\text{max}}/2\pi\) as a function of \(V_{in}\) is shown in Figure \ref{fig:max_frequency_voltage}. \begin{figure}[htbp] \centering -\includegraphics[scale=1]{figs/max_frequency_voltage.png} -\caption{\label{fig:max_frequency_voltage}Maximum frequency as a function of the excitation voltage amplitude} +\includegraphics[scale=1]{figs/detail_instrumentation_pd200_noise.png} +\caption{\label{fig:detail_instrumentation_pd200_noise}Measured output voltage noise of the PD200 amplifiers} \end{figure} -When doing sweep sine excitation, we make sure not to reach this maximum excitation frequency. - \paragraph{Small Signal Bandwidth} -\label{sec:meas_small_signal_bandwidth} -Here the small signal dynamics of all the 7 PD200 amplifiers are identified. +Here the small signal dynamics of all the PD200 amplifiers are identified. A (logarithmic) sweep sine excitation voltage is generated by the Speedgoat DAC with an amplitude of 0.1V and a frequency going from 1Hz up to 5kHz. @@ -508,6 +763,7 @@ The input voltage of the PD200 amplifier (the generated voltage by the DAC) is m This way, the time delay related to the ADC will not be apparent in the results. The obtained transfer functions from \(V_{in}\) to \(V_{out}\) are shown in Figure \ref{fig:pd200_small_signal_tf}. + \begin{figure}[htbp] \centering \includegraphics[scale=1]{figs/pd200_small_signal_tf.png} @@ -517,39 +773,8 @@ The obtained transfer functions from \(V_{in}\) to \(V_{out}\) are shown in Figu We can see the very well matching between all the 7 amplifiers. The amplitude is constant over a wide frequency band and the phase drop is limited to less than 1 degree up to 500Hz. -\paragraph{Model of the amplifier small signal dynamics} -\label{sec:model_small_signal_bandwidth} - The identified dynamics in Figure \ref{fig:pd200_small_signal_tf} can very well be modeled this dynamics with a first order low pass filter (even a constant could work fine). -Below is the defined transfer function \(G_p(s)\). -Comparison of the model with the identified dynamics is shown in Figure \ref{fig:pd200_small_signal_tf_model}. -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/pd200_small_signal_tf_model.png} -\caption{\label{fig:pd200_small_signal_tf_model}Bode plot of \(G_d(s)\) as well as the identified transfer functions of all 7 amplifiers} -\end{figure} - -And finally this model is saved. -\paragraph{Large Signal Bandwidth} -\label{sec:bandwidth_amplitude} - -The PD200 amplifiers will most likely not be used for large signals, but it is still nice to see how the amplifier dynamics is changing with the input voltage amplitude. - -Several identifications using sweep sin were performed with input voltage amplitude ranging from 0.1V to 4V. -The maximum excitation frequency for each amplitude was limited from the estimation in Section \ref{sec:tf_meas_w_max}. - -The obtained transfer functions for the different excitation amplitudes are shown in Figure \ref{fig:pd200_large_signal_tf}. -It is shown that the input voltage amplitude does not affect that much the amplifier dynamics. - -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/pd200_large_signal_tf.png} -\caption{\label{fig:pd200_large_signal_tf}Amplifier dynamics for several input voltage amplitudes} -\end{figure} - - - \paragraph{Output Impedance} The goal of this experimental setup is to estimate the output impedance \(R_\text{out}\) of the PD200 voltage amplifiers. @@ -558,122 +783,23 @@ A DAC with a constant output voltage (here 0.1V) is connected to the input of th Then, the output voltage of the PD200 amplifier is measured in two conditions: \begin{itemize} \item \(V\) when the output is not connected to any load -\item \(V_p\) when a load \(R = 10\,\Omega\) is connected at the output of the amplifier +\item \(V_p\) when a load \(R_{\text{load}} = 10\,\Omega\) is connected at the output of the amplifier \end{itemize} The load and the output impedance form a voltage divider, and thus: \[ V^\prime = \frac{R}{R + R_\text{out}} V \] From the two values of voltage, the output impedance of the amplifier can be estimated: -\[ R_\text{out} = R \frac{V - V^\prime}{V^\prime} \] - -A schematic of the setup is shown in Figure \ref{fig:setup_output_impedance}. - -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/setup_output_impedance.png} -\caption{\label{fig:setup_output_impedance}Schematic of the setup use to estimate the output impedance of the PD200 amplifier} -\end{figure} - - -Below are defined the measured output voltages with and without the 10Ohm load: -The output impedance of the amplifier can then be estimated using: \begin{equation} R_{\text{out}} = R_{\text{load}} \frac{V - V_p}{V} \end{equation} -The obtained output impedances are shown in Table \ref{tab:pd200_output_impedance}. +From this measurement, all the PD200 amplifiers are found to have an output impedance \(R_{\text{out}} \approx 1\,\Omega\). -\begin{table}[htbp] -\caption{\label{tab:pd200_output_impedance}Obtained Output Impedance for the PD200 Amplifiers} -\centering -\begin{tabularx}{0.4\linewidth}{Xccc} -\toprule -PD200 & \(V\ [V]\) & \(V_p\ [V]\) & \(R_\text{out}\ [\Omega]\)\\ -\midrule -1 & 1.988 & 1.794 & 1.081\\ -2 & 1.99 & 1.789 & 1.124\\ -3 & 1.982 & 1.795 & 1.042\\ -4 & 1.984 & 1.789 & 1.09\\ -5 & 1.998 & 1.81 & 1.039\\ -6 & 1.984 & 1.799 & 1.028\\ -7 & 2.004 & 1.812 & 1.06\\ -\bottomrule -\end{tabularx} -\end{table} +With the capacitive load \(C_p = 8.8\,\mu F\), the output resistor of the amplifier forms a low pass filter with a corner frequency equal to \(f_0 = \frac{1}{R_{\text{out}} C_p}\). +We get a corner frequency around \(10\,\text{kHz}\) which is not far from the specified \(7.4\,\text{kHz}\). -The output impedance of the PD200 Amplifier is estimated to be \(\approx 1\,\Omega\). - -\subsection{Model} -\paragraph{PD200 Amplifier noise model} -\label{sec:pd200_noise_model} - -Let's design a transfer function \(G_n(s)\) whose norm represent the Amplitude Spectral Density of the input voltage noise of the PD200 amplifier as shown in Figure \ref{fig:pd200-model-schematic-normalized-bis}. - -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/pd200-model-schematic-normalized.png} -\caption{\label{fig:pd200-model-schematic-normalized-bis}Model of the voltage amplifier with normalized noise input} -\end{figure} - -A simple transfer function that allows to obtain a good fit is defined below. -The comparison between the measured ASD of the modeled ASD is done in Figure \ref{fig:pd200_asd_noise_model}. -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/pd200_asd_noise_model.png} -\caption{\label{fig:pd200_asd_noise_model}ASD of the measured input voltage noise and modeled noise using \(G_n(s)\)} -\end{figure} - -Let's now compute the Cumulative Amplitude Spectrum corresponding to the measurement and the model and compare them. - -The integration from low to high frequency and from high to low frequency are both shown in Figure \ref{fig:pd200_cas_noise_model}. - -The fit between the model and the measurements is rather good considering the complex shape of the measured ASD and the simple model used. -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/pd200_cas_noise_model.png} -\caption{\label{fig:pd200_cas_noise_model}Cumulative Amplitude Spectrum of the measured input voltage noise and modeled noise using \(G_n(s)\)} -\end{figure} - -The obtained RMS noise of the model is \texttt{286.74} uV RMS which is not that far from the specifications. - -Finally the model of the amplifier noise is saved. -\paragraph{Voltage Amplifier Model} -\label{sec:amplifier_model} - -The Amplifier is characterized by its dynamics \(G_p(s)\) from voltage inputs \(V_{in}\) to voltage output \(V_{out}\). -Ideally, the gain from \(V_{in}\) to \(V_{out}\) is constant over a wide frequency band with very small phase drop. - -It is also characterized by its \textbf{input} noise \(n\). - -The objective is therefore to determine the transfer function \(G_p(s)\) from the input voltage to the output voltage as well as the Power Spectral Density \(S_n(\omega)\) of the amplifier input noise. - -As \(G_p\) depends on the load capacitance, it should be measured when loading the amplifier with a \(10\,\mu F\) capacitor. - -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/pd200-model-schematic.png} -\caption{\label{fig:pd200-model-schematic}Model of the voltage amplifier} -\end{figure} - - -The input noise of the amplifier \(n\) can be further modeled by shaping a white noise with unitary PSD \(\tilde{n}\) with a transfer function \(G_n(s)\) as shown in Figure \ldots{} - -The Amplitude Spectral Density \(\Gamma_n\) is then: -\begin{equation} -\Gamma_n(\omega) = |G_n(j\omega)| \Gamma_{\tilde{n}}(\omega) -\end{equation} -with \(\Gamma_{\tilde{n}}(\omega) = 1\). - - -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/pd200-model-schematic-normalized.png} -\caption{\label{fig:pd200-model-schematic-normalized}Model of the voltage amplifier with normalized noise input} -\end{figure} - - -\subsection{Conclusion} +\paragraph{Conclusion} \begin{table}[htbp] \caption{\label{tab:table_name}Measured characteristics, Manual characterstics and specified ones} @@ -695,46 +821,8 @@ Large Signal Bandwidth (150V, 10uF) & & 300 [Hz] & -\\ \end{tabularx} \end{table} -\section{Noise of the full setup with 16bits DAC} -Let's now measure the noise of the full setup in Figure \ref{fig:noise_meas_procedure_bis} and analyze the results. - -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/noise_meas_procedure.png} -\caption{\label{fig:noise_meas_procedure_bis}Sources of noise in the experimental setup} -\end{figure} - -The Amplitude Spectral Density of the measured noise is computed and the shown in Figure \ref{fig:asd_noise_tot}. - -We can very well see that to total measured noise is the sum of the DAC noise and the PD200 noise. -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/asd_noise_tot.png} -\caption{\label{fig:asd_noise_tot}Amplitude Spectral Density of the measured noise and of the individual sources of noise} -\end{figure} - -\begin{important} -The input noise of the PD200 amplifier is limited by the output voltage noise of the DAC. -Having a DAC with lower output voltage noise could lower the overall noise of the setup. -SSI2V 20bits DACs are used in the next section to verify that. -\end{important} - - \section{Linear Encoders} -\href{file:///home/thomas/Cloud/work-projects/ID31-NASS/matlab/test-bench-vionic/test-bench-vionic.org}{test-bench-vionic} - -\begin{itemize} -\item Section \ref{sec:noise_bench}: the measurement bench is described -\item Section \ref{sec:thermal_drifts}: long measurement is performed to estimate the low frequency drifts in the measurement -\item Section \ref{sec:vionic_noise_time}: high frequency measurements are performed to estimate the high frequency noise -\item Section \ref{sec:noise_asd}: the Spectral density of the measurement noise is estimated -\item Section \ref{sec:vionic_noise_model}: finally, the measured noise is modeled -\end{itemize} - -\subsection{Test Bench} -\label{sec:noise_bench} - To measure the noise \(n\) of the encoder, one can rigidly fix the head and the ruler together such that no motion should be measured. Then, the measured signal \(y_m\) corresponds to the noise \(n\). @@ -753,104 +841,8 @@ Note that the bench is then covered with a ``plastic bubble sheet'' in order to \caption{\label{fig:meas_bench_side_view}Side view picture of the measurement bench} \end{figure} -\subsection{Thermal drifts} -\label{sec:thermal_drifts} -Measured displacement were recording during approximately 40 hours with a sample frequency of 100Hz. -A first order low pass filter with a corner frequency of 1Hz - -The measured time domain data are shown in Figure \ref{fig:vionic_drifts_time}. -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/vionic_drifts_time.png} -\caption{\label{fig:vionic_drifts_time}Measured thermal drifts} -\end{figure} - -The measured data seems to experience a constant drift after approximately 20 hour. -Let's estimate this drift. - -\begin{verbatim} -The mean drift is approximately 60.9 [nm/hour] or 1.0 [nm/min] -\end{verbatim} - - -Comparison between the data and the linear fit is shown in Figure \ref{fig:vionic_drifts_linear_fit}. -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/vionic_drifts_linear_fit.png} -\caption{\label{fig:vionic_drifts_linear_fit}Measured drift and linear fit} -\end{figure} - -Let's now estimate the Power Spectral Density of the measured displacement. -The obtained low frequency ASD is shown in Figure \ref{fig:vionic_noise_asd_low_freq}. -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/vionic_noise_asd_low_freq.png} -\caption{\label{fig:vionic_noise_asd_low_freq}Amplitude Spectral density of the measured displacement} -\end{figure} - -\subsection{Time Domain signals} -\label{sec:vionic_noise_time} - Then, and for all the 7 encoders, we record the measured motion during 100s with a sampling frequency of 20kHz. -The raw measured data as well as the low pass filtered data (using a first order low pass filter with a cut-off at 10Hz) are shown in Figure \ref{fig:vionic_noise_raw_lpf}. -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/vionic_noise_raw_lpf.png} -\caption{\label{fig:vionic_noise_raw_lpf}Time domain measurement (raw data and low pass filtered data with first order 10Hz LPF)} -\end{figure} - -The time domain data for all the encoders are compared in Figure \ref{fig:vionic_noise_time}. - -We can see some drifts that are in the order of few nm to 20nm per minute. -As shown in Section \ref{sec:thermal_drifts}, these drifts should diminish over time down to 1nm/min. -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/vionic_noise_time.png} -\caption{\label{fig:vionic_noise_time}Comparison of the time domain measurement} -\end{figure} - -\subsection{Noise Spectral Density} -\label{sec:noise_asd} - -The amplitude spectral densities for all the encoder are computed and shown in Figure \ref{fig:vionic_noise_asd}. -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/vionic_noise_asd.png} -\caption{\label{fig:vionic_noise_asd}Amplitude Spectral Density of the measured signal} -\end{figure} - -We can combine these measurements with the low frequency noise computed in Section \ref{sec:thermal_drifts}. -The obtained ASD is shown in Figure \ref{fig:vionic_noise_asd_combined}. -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/vionic_noise_asd_combined.png} -\caption{\label{fig:vionic_noise_asd_combined}Combined low frequency and high frequency noise measurements} -\end{figure} - -\subsection{Noise Model} -\label{sec:vionic_noise_model} - -Let's create a transfer function that approximate the measured noise of the encoder. -The amplitude of the transfer function and the measured ASD are shown in Figure \ref{fig:vionic_noise_asd_model}. - -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/vionic_noise_asd_model.png} -\caption{\label{fig:vionic_noise_asd_model}Measured ASD of the noise and modeled one} -\end{figure} - -The cumulative amplitude spectrum is now computed and shown in Figure \ref{fig:vionic_noise_cas_model}. - -We can see that the Root Mean Square value of the measurement noise is \(\approx 1.6 \, nm\) as advertise in the datasheet. - -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/vionic_noise_cas_model.png} -\caption{\label{fig:vionic_noise_cas_model}Meassured CAS of the noise and modeled one} -\end{figure} - -\subsection{Automatic Gain Control} \section{External Metrology} \href{file:///home/thomas/Cloud/work-projects/ID31-NASS/matlab/test-bench-attocube/test-bench-attocube.org}{test-bench-attocube} @@ -864,6 +856,10 @@ Different options: For the final tests, QuDIS were used. +\section{Conclusion} + +From all the measured noises, compute the obtained PSD error in Y and Z (show PSD of individual + Sum + Cumulative?) + \chapter*{Conclusion} \label{sec:detail_instrumentation_conclusion}