Initial Commit
							
								
								
									
										49
									
								
								css/custom.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,49 @@
 | 
			
		||||
.figure p{
 | 
			
		||||
    text-align: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.figure img{
 | 
			
		||||
    max-width:100%;
 | 
			
		||||
    display: block;
 | 
			
		||||
    margin: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
table {
 | 
			
		||||
    margin-left: auto;
 | 
			
		||||
    margin-right: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.org-src-container > pre.src:before {
 | 
			
		||||
  display: inline;
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  color: #808080;
 | 
			
		||||
  background-color: white;
 | 
			
		||||
  top: -10px;
 | 
			
		||||
  left: 10px;
 | 
			
		||||
  padding: 0px 4px;
 | 
			
		||||
  border: 1px solid #d0d0d0;
 | 
			
		||||
  font-size: 80%;
 | 
			
		||||
}
 | 
			
		||||
.org-src-container > pre {
 | 
			
		||||
  margin-top: 1.5em;
 | 
			
		||||
  position: relative;
 | 
			
		||||
  overflow: visible;
 | 
			
		||||
}
 | 
			
		||||
.org-src-container > pre > code.src:before {
 | 
			
		||||
  display: inline;
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  color: #808080;
 | 
			
		||||
  background-color: white;
 | 
			
		||||
  top: -10px;
 | 
			
		||||
  left: 10px;
 | 
			
		||||
  padding: 0px 4px;
 | 
			
		||||
  border: 1px solid #d0d0d0;
 | 
			
		||||
  font-size: 80%;
 | 
			
		||||
}
 | 
			
		||||
.org-src-container > pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
 | 
			
		||||
.org-src-container > pre.src-elisp:before { content: 'Emacs Lisp'; }
 | 
			
		||||
.org-src-container > pre.src-sh:before { content: 'shell'; }
 | 
			
		||||
.org-src-container > pre.src-bash:before { content: 'bash'; }
 | 
			
		||||
.org-src-container > pre.src-org:before { content: 'Org mode'; }
 | 
			
		||||
.org-src-container > pre.src-python:before { content: 'Python'; }
 | 
			
		||||
.org-src-container > pre.src-matlab:before { content: 'Matlab'; }
 | 
			
		||||
							
								
								
									
										145
									
								
								css/htmlize.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,145 @@
 | 
			
		||||
.org-bold { /* bold */ font-weight: bold; }
 | 
			
		||||
.org-bold-italic { /* bold-italic */ font-weight: bold; font-style: italic; }
 | 
			
		||||
.org-buffer-menu-buffer { /* buffer-menu-buffer */ font-weight: bold; }
 | 
			
		||||
.org-builtin { /* font-lock-builtin-face */ color: #7a378b; }
 | 
			
		||||
.org-button { /* button */ text-decoration: underline; }
 | 
			
		||||
.org-calendar-today { /* calendar-today */ text-decoration: underline; }
 | 
			
		||||
.org-change-log-acknowledgement { /* change-log-acknowledgement */ color: #b22222; }
 | 
			
		||||
.org-change-log-conditionals { /* change-log-conditionals */ color: #a0522d; }
 | 
			
		||||
.org-change-log-date { /* change-log-date */ color: #8b2252; }
 | 
			
		||||
.org-change-log-email { /* change-log-email */ color: #a0522d; }
 | 
			
		||||
.org-change-log-file { /* change-log-file */ color: #0000ff; }
 | 
			
		||||
.org-change-log-function { /* change-log-function */ color: #a0522d; }
 | 
			
		||||
.org-change-log-list { /* change-log-list */ color: #a020f0; }
 | 
			
		||||
.org-change-log-name { /* change-log-name */ color: #008b8b; }
 | 
			
		||||
.org-comint-highlight-input { /* comint-highlight-input */ font-weight: bold; }
 | 
			
		||||
.org-comint-highlight-prompt { /* comint-highlight-prompt */ color: #00008b; }
 | 
			
		||||
.org-comment { /* font-lock-comment-face */ color: #999988; font-style: italic; }
 | 
			
		||||
.org-comment-delimiter { /* font-lock-comment-delimiter-face */ color: #999988; font-style: italic; }
 | 
			
		||||
.org-completions-annotations { /* completions-annotations */ font-style: italic; }
 | 
			
		||||
.org-completions-common-part { /* completions-common-part */ color: #000000; background-color: #ffffff; }
 | 
			
		||||
.org-completions-first-difference { /* completions-first-difference */ font-weight: bold; }
 | 
			
		||||
.org-constant { /* font-lock-constant-face */ color: #008b8b; }
 | 
			
		||||
.org-diary { /* diary */ color: #ff0000; }
 | 
			
		||||
.org-diff-context { /* diff-context */ color: #7f7f7f; }
 | 
			
		||||
.org-diff-file-header { /* diff-file-header */ background-color: #b3b3b3; font-weight: bold; }
 | 
			
		||||
.org-diff-function { /* diff-function */ background-color: #cccccc; }
 | 
			
		||||
.org-diff-header { /* diff-header */ background-color: #cccccc; }
 | 
			
		||||
.org-diff-hunk-header { /* diff-hunk-header */ background-color: #cccccc; }
 | 
			
		||||
.org-diff-index { /* diff-index */ background-color: #b3b3b3; font-weight: bold; }
 | 
			
		||||
.org-diff-nonexistent { /* diff-nonexistent */ background-color: #b3b3b3; font-weight: bold; }
 | 
			
		||||
.org-diff-refine-change { /* diff-refine-change */ background-color: #d9d9d9; }
 | 
			
		||||
.org-dired-directory { /* dired-directory */ color: #0000ff; }
 | 
			
		||||
.org-dired-flagged { /* dired-flagged */ color: #ff0000; font-weight: bold; }
 | 
			
		||||
.org-dired-header { /* dired-header */ color: #228b22; }
 | 
			
		||||
.org-dired-ignored { /* dired-ignored */ color: #7f7f7f; }
 | 
			
		||||
.org-dired-mark { /* dired-mark */ color: #008b8b; }
 | 
			
		||||
.org-dired-marked { /* dired-marked */ color: #ff0000; font-weight: bold; }
 | 
			
		||||
.org-dired-perm-write { /* dired-perm-write */ color: #b22222; }
 | 
			
		||||
.org-dired-symlink { /* dired-symlink */ color: #a020f0; }
 | 
			
		||||
.org-dired-warning { /* dired-warning */ color: #ff0000; font-weight: bold; }
 | 
			
		||||
.org-doc { /* font-lock-doc-face */ color: #8b2252; }
 | 
			
		||||
.org-escape-glyph { /* escape-glyph */ color: #a52a2a; }
 | 
			
		||||
.org-file-name-shadow { /* file-name-shadow */ color: #7f7f7f; }
 | 
			
		||||
.org-flyspell-duplicate { /* flyspell-duplicate */ color: #cdad00; font-weight: bold; text-decoration: underline; }
 | 
			
		||||
.org-flyspell-incorrect { /* flyspell-incorrect */ color: #ff4500; font-weight: bold; text-decoration: underline; }
 | 
			
		||||
.org-fringe { /* fringe */ background-color: #f2f2f2; }
 | 
			
		||||
.org-function-name { /* font-lock-function-name-face */ color: teal; }
 | 
			
		||||
.org-header-line { /* header-line */ color: #333333; background-color: #e5e5e5; }
 | 
			
		||||
.org-help-argument-name { /* help-argument-name */ font-style: italic; }
 | 
			
		||||
.org-highlight { /* highlight */ background-color: #b4eeb4; }
 | 
			
		||||
.org-holiday { /* holiday */ background-color: #ffc0cb; }
 | 
			
		||||
.org-isearch { /* isearch */ color: #b0e2ff; background-color: #cd00cd; }
 | 
			
		||||
.org-isearch-fail { /* isearch-fail */ background-color: #ffc1c1; }
 | 
			
		||||
.org-italic { /* italic */ font-style: italic; }
 | 
			
		||||
.org-keyword { /* font-lock-keyword-face */ color: #0086b3; }
 | 
			
		||||
.org-lazy-highlight { /* lazy-highlight */ background-color: #afeeee; }
 | 
			
		||||
.org-link { /* link */ color: #0000ff; text-decoration: underline; }
 | 
			
		||||
.org-link-visited { /* link-visited */ color: #8b008b; text-decoration: underline; }
 | 
			
		||||
.org-log-edit-header { /* log-edit-header */ color: #a020f0; }
 | 
			
		||||
.org-log-edit-summary { /* log-edit-summary */ color: #0000ff; }
 | 
			
		||||
.org-log-edit-unknown-header { /* log-edit-unknown-header */ color: #b22222; }
 | 
			
		||||
.org-match { /* match */ background-color: #ffff00; }
 | 
			
		||||
.org-next-error { /* next-error */ background-color: #eedc82; }
 | 
			
		||||
.org-nobreak-space { /* nobreak-space */ color: #a52a2a; text-decoration: underline; }
 | 
			
		||||
.org-org-archived { /* org-archived */ color: #7f7f7f; }
 | 
			
		||||
.org-org-block { /* org-block */ color: #7f7f7f; }
 | 
			
		||||
.org-org-block-begin-line { /* org-block-begin-line */ color: #b22222; }
 | 
			
		||||
.org-org-block-end-line { /* org-block-end-line */ color: #b22222; }
 | 
			
		||||
.org-org-checkbox { /* org-checkbox */ font-weight: bold; }
 | 
			
		||||
.org-org-checkbox-statistics-done { /* org-checkbox-statistics-done */ color: #228b22; font-weight: bold; }
 | 
			
		||||
.org-org-checkbox-statistics-todo { /* org-checkbox-statistics-todo */ color: #ff0000; font-weight: bold; }
 | 
			
		||||
.org-org-clock-overlay { /* org-clock-overlay */ background-color: #ffff00; }
 | 
			
		||||
.org-org-code { /* org-code */ color: #7f7f7f; }
 | 
			
		||||
.org-org-column { /* org-column */ background-color: #e5e5e5; }
 | 
			
		||||
.org-org-column-title { /* org-column-title */ background-color: #e5e5e5; font-weight: bold; text-decoration: underline; }
 | 
			
		||||
.org-org-date { /* org-date */ color: #a020f0; text-decoration: underline; }
 | 
			
		||||
.org-org-document-info { /* org-document-info */ color: #191970; }
 | 
			
		||||
.org-org-document-info-keyword { /* org-document-info-keyword */ color: #7f7f7f; }
 | 
			
		||||
.org-org-document-title { /* org-document-title */ color: #191970; font-size: 144%; font-weight: bold; }
 | 
			
		||||
.org-org-done { /* org-done */ color: #228b22; font-weight: bold; }
 | 
			
		||||
.org-org-drawer { /* org-drawer */ color: #0000ff; }
 | 
			
		||||
.org-org-ellipsis { /* org-ellipsis */ color: #b8860b; text-decoration: underline; }
 | 
			
		||||
.org-org-footnote { /* org-footnote */ color: #a020f0; text-decoration: underline; }
 | 
			
		||||
.org-org-formula { /* org-formula */ color: #b22222; }
 | 
			
		||||
.org-org-headline-done { /* org-headline-done */ color: #bc8f8f; }
 | 
			
		||||
.org-org-hide { /* org-hide */ color: #ffffff; }
 | 
			
		||||
.org-org-latex-and-export-specials { /* org-latex-and-export-specials */ color: #8b4513; }
 | 
			
		||||
.org-org-level-1 { /* org-level-1 */ color: #0000ff; }
 | 
			
		||||
.org-org-level-2 { /* org-level-2 */ color: #a0522d; }
 | 
			
		||||
.org-org-level-3 { /* org-level-3 */ color: #a020f0; }
 | 
			
		||||
.org-org-level-4 { /* org-level-4 */ color: #b22222; }
 | 
			
		||||
.org-org-level-5 { /* org-level-5 */ color: #228b22; }
 | 
			
		||||
.org-org-level-6 { /* org-level-6 */ color: #008b8b; }
 | 
			
		||||
.org-org-level-7 { /* org-level-7 */ color: #7a378b; }
 | 
			
		||||
.org-org-level-8 { /* org-level-8 */ color: #8b2252; }
 | 
			
		||||
.org-org-link { /* org-link */ color: #0000ff; text-decoration: underline; }
 | 
			
		||||
.org-org-meta-line { /* org-meta-line */ color: #b22222; }
 | 
			
		||||
.org-org-mode-line-clock { /* org-mode-line-clock */ color: #000000; background-color: #bfbfbf; }
 | 
			
		||||
.org-org-mode-line-clock-overrun { /* org-mode-line-clock-overrun */ color: #000000; background-color: #ff0000; }
 | 
			
		||||
.org-org-quote { /* org-quote */ color: #7f7f7f; }
 | 
			
		||||
.org-org-scheduled { /* org-scheduled */ color: #006400; }
 | 
			
		||||
.org-org-scheduled-previously { /* org-scheduled-previously */ color: #b22222; }
 | 
			
		||||
.org-org-scheduled-today { /* org-scheduled-today */ color: #006400; }
 | 
			
		||||
.org-org-sexp-date { /* org-sexp-date */ color: #a020f0; }
 | 
			
		||||
.org-org-special-keyword { /* org-special-keyword */ color: #a020f0; }
 | 
			
		||||
.org-org-table { /* org-table */ color: #0000ff; }
 | 
			
		||||
.org-org-tag { /* org-tag */ font-weight: bold; }
 | 
			
		||||
.org-org-target { /* org-target */ text-decoration: underline; }
 | 
			
		||||
.org-org-time-grid { /* org-time-grid */ color: #b8860b; }
 | 
			
		||||
.org-org-todo { /* org-todo */ color: #ff0000; font-weight: bold; }
 | 
			
		||||
.org-org-upcoming-deadline { /* org-upcoming-deadline */ color: #b22222; }
 | 
			
		||||
.org-org-verbatim { /* org-verbatim */ color: #7f7f7f; }
 | 
			
		||||
.org-org-verse { /* org-verse */ color: #7f7f7f; }
 | 
			
		||||
.org-org-warning { /* org-warning */ color: #ff0000; font-weight: bold; }
 | 
			
		||||
.org-outline-1 { /* outline-1 */ color: #0000ff; }
 | 
			
		||||
.org-outline-2 { /* outline-2 */ color: #a0522d; }
 | 
			
		||||
.org-outline-3 { /* outline-3 */ color: #a020f0; }
 | 
			
		||||
.org-outline-4 { /* outline-4 */ color: #b22222; }
 | 
			
		||||
.org-outline-5 { /* outline-5 */ color: #228b22; }
 | 
			
		||||
.org-outline-6 { /* outline-6 */ color: #008b8b; }
 | 
			
		||||
.org-outline-7 { /* outline-7 */ color: #7a378b; }
 | 
			
		||||
.org-outline-8 { /* outline-8 */ color: #8b2252; }
 | 
			
		||||
.org-preprocessor { /* font-lock-preprocessor-face */ color: #7a378b; }
 | 
			
		||||
.org-query-replace { /* query-replace */ color: #b0e2ff; background-color: #cd00cd; }
 | 
			
		||||
.org-regexp-grouping-backslash { /* font-lock-regexp-grouping-backslash */ font-weight: bold; }
 | 
			
		||||
.org-regexp-grouping-construct { /* font-lock-regexp-grouping-construct */ font-weight: bold; }
 | 
			
		||||
.org-region { /* region */ background-color: #eedc82; }
 | 
			
		||||
.org-secondary-selection { /* secondary-selection */ background-color: #ffff00; }
 | 
			
		||||
.org-shadow { /* shadow */ color: #7f7f7f; }
 | 
			
		||||
.org-show-paren-match { /* show-paren-match */ background-color: #40e0d0; }
 | 
			
		||||
.org-show-paren-mismatch { /* show-paren-mismatch */ color: #ffffff; background-color: #a020f0; }
 | 
			
		||||
.org-string { /* font-lock-string-face */ color: #dd1144; }
 | 
			
		||||
.org-tool-bar { /* tool-bar */ color: #000000; background-color: #bfbfbf; }
 | 
			
		||||
.org-tooltip { /* tooltip */ color: #000000; background-color: #ffffe0; }
 | 
			
		||||
.org-trailing-whitespace { /* trailing-whitespace */ background-color: #ff0000; }
 | 
			
		||||
.org-type { /* font-lock-type-face */ color: #228b22; }
 | 
			
		||||
.org-underline { /* underline */ text-decoration: underline; }
 | 
			
		||||
.org-variable-name { /* font-lock-variable-name-face */ color: teal; }
 | 
			
		||||
.org-warning { /* font-lock-warning-face */ color: #ff0000; font-weight: bold; }
 | 
			
		||||
.org-widget-button { /* widget-button */ font-weight: bold; }
 | 
			
		||||
.org-widget-button-pressed { /* widget-button-pressed */ color: #ff0000; }
 | 
			
		||||
.org-widget-documentation { /* widget-documentation */ color: #006400; }
 | 
			
		||||
.org-widget-field { /* widget-field */ background-color: #d9d9d9; }
 | 
			
		||||
.org-widget-inactive { /* widget-inactive */ color: #7f7f7f; }
 | 
			
		||||
.org-widget-single-line-field { /* widget-single-line-field */ background-color: #d9d9d9; }
 | 
			
		||||
							
								
								
									
										1108
									
								
								css/readtheorg.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								figs/IMG_20201023_153905.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.7 MiB  | 
							
								
								
									
										
											BIN
										
									
								
								figs/IMG_20201023_153914.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.9 MiB  | 
							
								
								
									
										
											BIN
										
									
								
								figs/exp_setup_schematic.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								figs/exp_setup_schematic.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 76 KiB  | 
							
								
								
									
										3969
									
								
								figs/exp_setup_schematic.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 225 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								figs/force_sen_steps_time_domain.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								figs/force_sen_steps_time_domain.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 37 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								figs/force_sen_steps_time_domain_par_R.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								figs/force_sen_steps_time_domain_par_R.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 37 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								figs/force_sensor_linear_relation.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								figs/force_sensor_linear_relation.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 39 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								figs/force_sensor_model_electronics.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 12 KiB  | 
							
								
								
									
										1400
									
								
								figs/force_sensor_model_electronics.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 132 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								figs/force_sensor_model_electronics_without_R.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 16 KiB  | 
							
								
								
									
										1353
									
								
								figs/force_sensor_model_electronics_without_R.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 130 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								figs/force_sensor_setup.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								figs/force_sensor_setup.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 37 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								figs/force_sensor_sin_charge.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								figs/force_sensor_sin_charge.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 41 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								figs/force_sensor_sin_encoder.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								figs/force_sensor_sin_encoder.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 39 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								figs/force_sensor_sin_stack.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								figs/force_sensor_sin_stack.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 40 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								figs/force_sensor_sin_u.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								figs/force_sensor_sin_u.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 41 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								figs/stiffness_force_sensor_bode.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								figs/stiffness_force_sensor_bode.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 134 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								figs/stiffness_force_sensor_bode_zoom.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								figs/stiffness_force_sensor_bode_zoom.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 92 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								figs/stiffness_force_sensor_coherence.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								figs/stiffness_force_sensor_coherence.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 56 KiB  | 
							
								
								
									
										637
									
								
								index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,637 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 | 
			
		||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 | 
			
		||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
<!-- 2020-11-10 mar. 12:55 -->
 | 
			
		||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 | 
			
		||||
<title>Piezoelectric Force Sensor - Test Bench</title>
 | 
			
		||||
<meta name="generator" content="Org mode" />
 | 
			
		||||
<meta name="author" content="Dehaeze Thomas" />
 | 
			
		||||
<link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
 | 
			
		||||
<link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
 | 
			
		||||
<link rel="stylesheet" type="text/css" href="./css/custom.css"/>
 | 
			
		||||
<script type="text/javascript" src="./js/jquery.min.js"></script>
 | 
			
		||||
<script type="text/javascript" src="./js/bootstrap.min.js"></script>
 | 
			
		||||
<script type="text/javascript" src="./js/readtheorg.js"></script>
 | 
			
		||||
<script>MathJax = {
 | 
			
		||||
          tex: {
 | 
			
		||||
            tags: 'ams',
 | 
			
		||||
            macros: {bm: ["\\boldsymbol{#1}",1],}
 | 
			
		||||
            }
 | 
			
		||||
          };
 | 
			
		||||
          </script>
 | 
			
		||||
          <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
<div id="org-div-home-and-up">
 | 
			
		||||
 <a accesskey="h" href="../index.html"> UP </a>
 | 
			
		||||
 |
 | 
			
		||||
 <a accesskey="H" href="../index.html"> HOME </a>
 | 
			
		||||
</div><div id="content">
 | 
			
		||||
<h1 class="title">Piezoelectric Force Sensor - Test Bench</h1>
 | 
			
		||||
<div id="table-of-contents">
 | 
			
		||||
<h2>Table of Contents</h2>
 | 
			
		||||
<div id="text-table-of-contents">
 | 
			
		||||
<ul>
 | 
			
		||||
<li><a href="#orga1465ad">1. Change of Stiffness due to Sensors stack being open/closed circuit</a>
 | 
			
		||||
<ul>
 | 
			
		||||
<li><a href="#orgd924c73">1.1. Load Data</a></li>
 | 
			
		||||
<li><a href="#org59cc20a">1.2. Transfer Functions</a></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</li>
 | 
			
		||||
<li><a href="#org76a1832">2. Generated Number of Charge / Voltage</a>
 | 
			
		||||
<ul>
 | 
			
		||||
<li><a href="#org1fa991d">2.1. Steps</a></li>
 | 
			
		||||
<li><a href="#org5e9eb44">2.2. Add Parallel Resistor</a></li>
 | 
			
		||||
<li><a href="#org15676e1">2.3. Sinus</a></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</li>
 | 
			
		||||
</ul>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
In this document is studied how a piezoelectric stack can be used to measured the force.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<ul class="org-ul">
 | 
			
		||||
<li>Section <a href="#org887b61a">1</a>: the effect of the input impedance of the electronics connected to the force sensor stack on the stiffness of the stack is studied</li>
 | 
			
		||||
<li>Section <a href="#org2b5f630">2</a>:</li>
 | 
			
		||||
</ul>
 | 
			
		||||
 | 
			
		||||
<div id="outline-container-orga1465ad" class="outline-2">
 | 
			
		||||
<h2 id="orga1465ad"><span class="section-number-2">1</span> Change of Stiffness due to Sensors stack being open/closed circuit</h2>
 | 
			
		||||
<div class="outline-text-2" id="text-1">
 | 
			
		||||
<p>
 | 
			
		||||
<a id="org887b61a"></a>
 | 
			
		||||
</p>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="outline-container-orgd924c73" class="outline-3">
 | 
			
		||||
<h3 id="orgd924c73"><span class="section-number-3">1.1</span> Load Data</h3>
 | 
			
		||||
<div class="outline-text-3" id="text-1-1">
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">oc = load(<span class="org-string">'identification_open_circuit.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>);
 | 
			
		||||
sc = load(<span class="org-string">'identification_short_circuit.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>);
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="outline-container-org59cc20a" class="outline-3">
 | 
			
		||||
<h3 id="org59cc20a"><span class="section-number-3">1.2</span> Transfer Functions</h3>
 | 
			
		||||
<div class="outline-text-3" id="text-1-2">
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">Ts = 1e<span class="org-type">-</span>4; <span class="org-comment">% Sampling Time [s]</span>
 | 
			
		||||
win = hann(ceil(10<span class="org-type">/</span>Ts));
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">[tf_oc_est, f] = tfestimate(oc.u, oc.encoder, win, [], [], 1<span class="org-type">/</span>Ts);
 | 
			
		||||
[co_oc_est, <span class="org-type">~</span>] = mscohere(  oc.u, oc.encoder, win, [], [], 1<span class="org-type">/</span>Ts);
 | 
			
		||||
 | 
			
		||||
[tf_sc_est, <span class="org-type">~</span>] = tfestimate(sc.u, sc.encoder, win, [], [], 1<span class="org-type">/</span>Ts);
 | 
			
		||||
[co_sc_est, <span class="org-type">~</span>] = mscohere(  sc.u, sc.encoder, win, [], [], 1<span class="org-type">/</span>Ts);
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<div id="org3c75143" class="figure">
 | 
			
		||||
<p><img src="figs/stiffness_force_sensor_coherence.png" alt="stiffness_force_sensor_coherence.png" />
 | 
			
		||||
</p>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<div id="org4424b1c" class="figure">
 | 
			
		||||
<p><img src="figs/stiffness_force_sensor_bode.png" alt="stiffness_force_sensor_bode.png" />
 | 
			
		||||
</p>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<div id="org216fcc3" class="figure">
 | 
			
		||||
<p><img src="figs/stiffness_force_sensor_bode_zoom.png" alt="stiffness_force_sensor_bode_zoom.png" />
 | 
			
		||||
</p>
 | 
			
		||||
<p><span class="figure-number">Figure 3: </span>Zoom on the change of resonance</p>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div class="important" id="org9ea3712">
 | 
			
		||||
<p>
 | 
			
		||||
The change of resonance frequency / stiffness is very small and is not important here.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="outline-container-org76a1832" class="outline-2">
 | 
			
		||||
<h2 id="org76a1832"><span class="section-number-2">2</span> Generated Number of Charge / Voltage</h2>
 | 
			
		||||
<div class="outline-text-2" id="text-2">
 | 
			
		||||
<p>
 | 
			
		||||
<a id="org2b5f630"></a>
 | 
			
		||||
</p>
 | 
			
		||||
<p>
 | 
			
		||||
Two stacks are used as actuator (in parallel) and one stack is used as sensor.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The amplifier gain is 20V/V (Cedrat LA75B).
 | 
			
		||||
</p>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="outline-container-org1fa991d" class="outline-3">
 | 
			
		||||
<h3 id="org1fa991d"><span class="section-number-3">2.1</span> Steps</h3>
 | 
			
		||||
<div class="outline-text-3" id="text-2-1">
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">load(<span class="org-string">'force_sensor_steps.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>, <span class="org-string">'v'</span>);
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab"><span class="org-type">figure</span>;
 | 
			
		||||
tiledlayout(2, 1, <span class="org-string">'TileSpacing'</span>, <span class="org-string">'None'</span>, <span class="org-string">'Padding'</span>, <span class="org-string">'None'</span>);
 | 
			
		||||
nexttile;
 | 
			
		||||
plot(t, v);
 | 
			
		||||
xlabel(<span class="org-string">'Time [s]'</span>); ylabel(<span class="org-string">'Measured voltage [V]'</span>);
 | 
			
		||||
nexttile;
 | 
			
		||||
plot(t, u);
 | 
			
		||||
xlabel(<span class="org-string">'Time [s]'</span>); ylabel(<span class="org-string">'Actuator Voltage [V]'</span>);
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<div id="orgf889803" class="figure">
 | 
			
		||||
<p><img src="figs/force_sen_steps_time_domain.png" alt="force_sen_steps_time_domain.png" />
 | 
			
		||||
</p>
 | 
			
		||||
<p><span class="figure-number">Figure 4: </span>Time domain signal during the 3 actuator voltage steps</p>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
Three steps are performed at the following time intervals:
 | 
			
		||||
</p>
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">t_s = [ 2.5, 23;
 | 
			
		||||
       23.8, 35;
 | 
			
		||||
       35.8, 50];
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
Fit function:
 | 
			
		||||
</p>
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">f = @(b,x) b(1)<span class="org-type">.*</span>exp(b(2)<span class="org-type">.*</span>x) <span class="org-type">+</span> b(3);
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
We are interested by the <code>b(2)</code> term, which is the time constant of the exponential.
 | 
			
		||||
</p>
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">tau = zeros(size(t_s, 1),1);
 | 
			
		||||
V0  = zeros(size(t_s, 1),1);
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab"><span class="org-keyword">for</span> <span class="org-variable-name">t_i</span> = <span class="org-constant">1:size(t_s, 1)</span>
 | 
			
		||||
    t_cur = t(t_s(t_i, 1) <span class="org-type"><</span> t <span class="org-type">&</span> t <span class="org-type"><</span> t_s(t_i, 2));
 | 
			
		||||
    t_cur = t_cur <span class="org-type">-</span> t_cur(1);
 | 
			
		||||
    y_cur = v(t_s(t_i, 1) <span class="org-type"><</span> t <span class="org-type">&</span> t <span class="org-type"><</span> t_s(t_i, 2));
 | 
			
		||||
 | 
			
		||||
    nrmrsd = @(b) norm(y_cur <span class="org-type">-</span> f(b,t_cur)); <span class="org-comment">% Residual Norm Cost Function</span>
 | 
			
		||||
    B0 = [0.5, <span class="org-type">-</span>0.15, 2.2];                        <span class="org-comment">% Choose Appropriate Initial Estimates</span>
 | 
			
		||||
    [B,rnrm] = fminsearch(nrmrsd, B0);     <span class="org-comment">% Estimate Parameters ‘B’</span>
 | 
			
		||||
 | 
			
		||||
    tau(t_i) = 1<span class="org-type">/</span>B(2);
 | 
			
		||||
    V0(t_i)  = B(3);
 | 
			
		||||
<span class="org-keyword">end</span>
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<colgroup>
 | 
			
		||||
<col  class="org-right" />
 | 
			
		||||
 | 
			
		||||
<col  class="org-right" />
 | 
			
		||||
</colgroup>
 | 
			
		||||
<thead>
 | 
			
		||||
<tr>
 | 
			
		||||
<th scope="col" class="org-right">\(tau\) [s]</th>
 | 
			
		||||
<th scope="col" class="org-right">\(V_0\) [V]</th>
 | 
			
		||||
</tr>
 | 
			
		||||
</thead>
 | 
			
		||||
<tbody>
 | 
			
		||||
<tr>
 | 
			
		||||
<td class="org-right">6.47</td>
 | 
			
		||||
<td class="org-right">2.26</td>
 | 
			
		||||
</tr>
 | 
			
		||||
 | 
			
		||||
<tr>
 | 
			
		||||
<td class="org-right">6.76</td>
 | 
			
		||||
<td class="org-right">2.26</td>
 | 
			
		||||
</tr>
 | 
			
		||||
 | 
			
		||||
<tr>
 | 
			
		||||
<td class="org-right">6.49</td>
 | 
			
		||||
<td class="org-right">2.25</td>
 | 
			
		||||
</tr>
 | 
			
		||||
</tbody>
 | 
			
		||||
</table>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
With the capacitance being \(C = 4.4 \mu F\), the internal impedance of the Speedgoat ADC can be computed as follows:
 | 
			
		||||
</p>
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">Cp = 4.4e<span class="org-type">-</span>6; <span class="org-comment">% [F]</span>
 | 
			
		||||
Rin = abs(mean(tau))<span class="org-type">/</span>Cp;
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<pre class="example">
 | 
			
		||||
1494100.0
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The input impedance of the Speedgoat’s ADC should then be close to \(1.5\,M\Omega\) (specified at \(1\,M\Omega\)).
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<div class="important" id="org572654b">
 | 
			
		||||
<p>
 | 
			
		||||
How can we explain the voltage offset?
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
As shown in Figure <a href="#org7c2c57f">5</a> (taken from (<a href="#citeproc_bib_item_1">Reza and Andrew 2006</a>)), an input voltage offset is due to the input bias current \(i_n\).
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<div id="org7c2c57f" class="figure">
 | 
			
		||||
<p><img src="figs/force_sensor_model_electronics.png" alt="force_sensor_model_electronics.png" />
 | 
			
		||||
</p>
 | 
			
		||||
<p><span class="figure-number">Figure 5: </span>Model of a piezoelectric transducer (left) and instrumentation amplifier (right)</p>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The estimated input bias current is then:
 | 
			
		||||
</p>
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">in = mean(V0)<span class="org-type">/</span>Rin;
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<pre class="example">
 | 
			
		||||
1.5119e-06
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
An additional resistor in parallel with \(R_{in}\) would have two effects:
 | 
			
		||||
</p>
 | 
			
		||||
<ul class="org-ul">
 | 
			
		||||
<li>reduce the input voltage offset
 | 
			
		||||
\[ V_{off} = \frac{R_a R_{in}}{R_a + R_{in}} i_n \]</li>
 | 
			
		||||
<li>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} \]</li>
 | 
			
		||||
</ul>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
If we allow the high pass corner frequency to be equals to 3Hz:
 | 
			
		||||
</p>
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">fc = 3;
 | 
			
		||||
Ra = Rin<span class="org-type">/</span>(fc<span class="org-type">*</span>Cp<span class="org-type">*</span>Rin <span class="org-type">-</span> 1);
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<pre class="example">
 | 
			
		||||
79804
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
With this parallel resistance value, the voltage offset would be:
 | 
			
		||||
</p>
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">V_offset = Ra<span class="org-type">*</span>Rin<span class="org-type">/</span>(Ra <span class="org-type">+</span> Rin) <span class="org-type">*</span> in;
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<pre class="example">
 | 
			
		||||
0.11454
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
Which is much more acceptable.
 | 
			
		||||
</p>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="outline-container-org5e9eb44" class="outline-3">
 | 
			
		||||
<h3 id="org5e9eb44"><span class="section-number-3">2.2</span> Add Parallel Resistor</h3>
 | 
			
		||||
<div class="outline-text-3" id="text-2-2">
 | 
			
		||||
<p>
 | 
			
		||||
A resistor \(R_p \approx 100\,k\Omega\) is added in parallel with the force sensor as shown in Figure <a href="#org1fac5a7">6</a>.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<div id="org1fac5a7" class="figure">
 | 
			
		||||
<p><img src="figs/force_sensor_model_electronics_without_R.png" alt="force_sensor_model_electronics_without_R.png" />
 | 
			
		||||
</p>
 | 
			
		||||
<p><span class="figure-number">Figure 6: </span>Model of a piezoelectric transducer (left) and instrumentation amplifier (right) with added resistor \(R_p\)</p>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">load(<span class="org-string">'force_sensor_steps_R_82k7.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>, <span class="org-string">'v'</span>);
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab"><span class="org-type">figure</span>;
 | 
			
		||||
tiledlayout(2, 1, <span class="org-string">'TileSpacing'</span>, <span class="org-string">'None'</span>, <span class="org-string">'Padding'</span>, <span class="org-string">'None'</span>);
 | 
			
		||||
nexttile;
 | 
			
		||||
plot(t, v);
 | 
			
		||||
xlabel(<span class="org-string">'Time [s]'</span>); ylabel(<span class="org-string">'Measured voltage [V]'</span>);
 | 
			
		||||
nexttile;
 | 
			
		||||
plot(t, u);
 | 
			
		||||
xlabel(<span class="org-string">'Time [s]'</span>); ylabel(<span class="org-string">'Actuator Voltage [V]'</span>);
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<div id="org29964b5" class="figure">
 | 
			
		||||
<p><img src="figs/force_sen_steps_time_domain_par_R.png" alt="force_sen_steps_time_domain_par_R.png" />
 | 
			
		||||
</p>
 | 
			
		||||
<p><span class="figure-number">Figure 7: </span>Time domain signal during the actuator voltage steps</p>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
Three steps are performed at the following time intervals:
 | 
			
		||||
</p>
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">t_s = [1.9,  6;
 | 
			
		||||
       8.5, 13;
 | 
			
		||||
      15.5, 21;
 | 
			
		||||
      22.6, 26;
 | 
			
		||||
      30.0, 36;
 | 
			
		||||
      37.5, 41;
 | 
			
		||||
      46.2, 49.5]
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
Fit function:
 | 
			
		||||
</p>
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">f = @(b,x) b(1)<span class="org-type">.*</span>exp(b(2)<span class="org-type">.*</span>x) <span class="org-type">+</span> b(3);
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
We are interested by the <code>b(2)</code> term, which is the time constant of the exponential.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">tau = zeros(size(t_s, 1),1);
 | 
			
		||||
V0  = zeros(size(t_s, 1),1);
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab"><span class="org-keyword">for</span> <span class="org-variable-name">t_i</span> = <span class="org-constant">1:size(t_s, 1)</span>
 | 
			
		||||
    t_cur = t(t_s(t_i, 1) <span class="org-type"><</span> t <span class="org-type">&</span> t <span class="org-type"><</span> t_s(t_i, 2));
 | 
			
		||||
    t_cur = t_cur <span class="org-type">-</span> t_cur(1);
 | 
			
		||||
    y_cur = v(t_s(t_i, 1) <span class="org-type"><</span> t <span class="org-type">&</span> t <span class="org-type"><</span> t_s(t_i, 2));
 | 
			
		||||
 | 
			
		||||
    nrmrsd = @(b) norm(y_cur <span class="org-type">-</span> f(b,t_cur)); <span class="org-comment">% Residual Norm Cost Function</span>
 | 
			
		||||
    B0 = [0.5, <span class="org-type">-</span>0.2, 0.2];                        <span class="org-comment">% Choose Appropriate Initial Estimates</span>
 | 
			
		||||
    [B,rnrm] = fminsearch(nrmrsd, B0);     <span class="org-comment">% Estimate Parameters ‘B’</span>
 | 
			
		||||
 | 
			
		||||
    tau(t_i) = 1<span class="org-type">/</span>B(2);
 | 
			
		||||
    V0(t_i)  = B(3);
 | 
			
		||||
<span class="org-keyword">end</span>
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
And indeed, we obtain a much smaller offset voltage and a much faster time constant.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<colgroup>
 | 
			
		||||
<col  class="org-right" />
 | 
			
		||||
 | 
			
		||||
<col  class="org-right" />
 | 
			
		||||
</colgroup>
 | 
			
		||||
<thead>
 | 
			
		||||
<tr>
 | 
			
		||||
<th scope="col" class="org-right">\(tau\) [s]</th>
 | 
			
		||||
<th scope="col" class="org-right">\(V_0\) [V]</th>
 | 
			
		||||
</tr>
 | 
			
		||||
</thead>
 | 
			
		||||
<tbody>
 | 
			
		||||
<tr>
 | 
			
		||||
<td class="org-right">0.43</td>
 | 
			
		||||
<td class="org-right">0.15</td>
 | 
			
		||||
</tr>
 | 
			
		||||
 | 
			
		||||
<tr>
 | 
			
		||||
<td class="org-right">0.45</td>
 | 
			
		||||
<td class="org-right">0.16</td>
 | 
			
		||||
</tr>
 | 
			
		||||
 | 
			
		||||
<tr>
 | 
			
		||||
<td class="org-right">0.43</td>
 | 
			
		||||
<td class="org-right">0.15</td>
 | 
			
		||||
</tr>
 | 
			
		||||
 | 
			
		||||
<tr>
 | 
			
		||||
<td class="org-right">0.43</td>
 | 
			
		||||
<td class="org-right">0.15</td>
 | 
			
		||||
</tr>
 | 
			
		||||
 | 
			
		||||
<tr>
 | 
			
		||||
<td class="org-right">0.45</td>
 | 
			
		||||
<td class="org-right">0.15</td>
 | 
			
		||||
</tr>
 | 
			
		||||
 | 
			
		||||
<tr>
 | 
			
		||||
<td class="org-right">0.46</td>
 | 
			
		||||
<td class="org-right">0.16</td>
 | 
			
		||||
</tr>
 | 
			
		||||
 | 
			
		||||
<tr>
 | 
			
		||||
<td class="org-right">0.48</td>
 | 
			
		||||
<td class="org-right">0.16</td>
 | 
			
		||||
</tr>
 | 
			
		||||
</tbody>
 | 
			
		||||
</table>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
Knowing the capacitance value, we can estimate the value of the added resistor (neglecting the input impedance of \(\approx 1\,M\Omega\)):
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">Cp = 4.4e<span class="org-type">-</span>6; <span class="org-comment">% [F]</span>
 | 
			
		||||
Rin = abs(mean(tau))<span class="org-type">/</span>Cp;
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<pre class="example">
 | 
			
		||||
101200.0
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
And we can verify that the bias current estimation stays the same:
 | 
			
		||||
</p>
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">in = mean(V0)<span class="org-type">/</span>Rin;
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<pre class="example">
 | 
			
		||||
1.5305e-06
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
This validates the model of the ADC and the effectiveness of the added resistor.
 | 
			
		||||
</p>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="outline-container-org15676e1" class="outline-3">
 | 
			
		||||
<h3 id="org15676e1"><span class="section-number-3">2.3</span> Sinus</h3>
 | 
			
		||||
<div class="outline-text-3" id="text-2-3">
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">load(<span class="org-string">'force_sensor_sin.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>, <span class="org-string">'v'</span>);
 | 
			
		||||
 | 
			
		||||
u       = u(t<span class="org-type">></span>25);
 | 
			
		||||
v       = v(t<span class="org-type">></span>25);
 | 
			
		||||
encoder = encoder(t<span class="org-type">></span>25) <span class="org-type">-</span> mean(encoder(t<span class="org-type">></span>25));
 | 
			
		||||
t       = t(t<span class="org-type">></span>25);
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The driving voltage is a sinus at 0.5Hz centered on 3V and with an amplitude of 3V (Figure <a href="#org1fbf89d">8</a>).
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<div id="org1fbf89d" class="figure">
 | 
			
		||||
<p><img src="figs/force_sensor_sin_u.png" alt="force_sensor_sin_u.png" />
 | 
			
		||||
</p>
 | 
			
		||||
<p><span class="figure-number">Figure 8: </span>Driving Voltage</p>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The full stroke as measured by the encoder is:
 | 
			
		||||
</p>
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">max(encoder)<span class="org-type">-</span>min(encoder)
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<pre class="example">
 | 
			
		||||
5.005e-05
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
Its signal is shown in Figure <a href="#org1d74efa">9</a>.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<div id="org1d74efa" class="figure">
 | 
			
		||||
<p><img src="figs/force_sensor_sin_encoder.png" alt="force_sensor_sin_encoder.png" />
 | 
			
		||||
</p>
 | 
			
		||||
<p><span class="figure-number">Figure 9: </span>Encoder measurement</p>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The generated voltage by the stack is shown in Figure
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<div id="org077a6d7" class="figure">
 | 
			
		||||
<p><img src="figs/force_sensor_sin_stack.png" alt="force_sensor_sin_stack.png" />
 | 
			
		||||
</p>
 | 
			
		||||
<p><span class="figure-number">Figure 10: </span>Voltage measured on the stack used as a sensor</p>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The capacitance of the stack is
 | 
			
		||||
</p>
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">Cp = 4.4e<span class="org-type">-</span>6; <span class="org-comment">% [F]</span>
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The corresponding generated charge is then shown in Figure <a href="#org4baf062">11</a>.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<div id="org4baf062" class="figure">
 | 
			
		||||
<p><img src="figs/force_sensor_sin_charge.png" alt="force_sensor_sin_charge.png" />
 | 
			
		||||
</p>
 | 
			
		||||
<p><span class="figure-number">Figure 11: </span>Generated Charge</p>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The relation between the generated voltage and the measured displacement is almost linear as shown in Figure <a href="#org8b9df34">12</a>.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">b1 = encoder<span class="org-type">\</span>(v<span class="org-type">-</span>mean(v));
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<div id="org8b9df34" class="figure">
 | 
			
		||||
<p><img src="figs/force_sensor_linear_relation.png" alt="force_sensor_linear_relation.png" />
 | 
			
		||||
</p>
 | 
			
		||||
<p><span class="figure-number">Figure 12: </span>Almost linear relation between the relative displacement and the generated voltage</p>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
With a 16bits ADC, the resolution will then be equals to (in [nm]):
 | 
			
		||||
</p>
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">abs((20<span class="org-type">/</span>2<span class="org-type">^</span>16)<span class="org-type">/</span>(b1<span class="org-type">/</span>1e9))
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<pre class="example">
 | 
			
		||||
3.9838
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<style>.csl-entry{text-indent: -1.5em; margin-left: 1.5em;}</style><h2 class='citeproc-org-bib-h2'>Bibliography</h2>
 | 
			
		||||
<div class="csl-bib-body">
 | 
			
		||||
  <div class="csl-entry"><a name="citeproc_bib_item_1"></a>Reza, Moheimani, and Fleming Andrew. 2006. <i>Piezoelectric Transducers for Vibration Control and Damping</i>. London: Springer.</div>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
<div id="postamble" class="status">
 | 
			
		||||
<p class="author">Author: Dehaeze Thomas</p>
 | 
			
		||||
<p class="date">Created: 2020-11-10 mar. 12:55</p>
 | 
			
		||||
</div>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										568
									
								
								index.org
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,568 @@
 | 
			
		||||
#+TITLE: Piezoelectric Force Sensor - Test Bench
 | 
			
		||||
:DRAWER:
 | 
			
		||||
#+LANGUAGE: en
 | 
			
		||||
#+EMAIL: dehaeze.thomas@gmail.com
 | 
			
		||||
#+AUTHOR: Dehaeze Thomas
 | 
			
		||||
 | 
			
		||||
#+HTML_LINK_HOME: ../index.html
 | 
			
		||||
#+HTML_LINK_UP:   ../index.html
 | 
			
		||||
 | 
			
		||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
 | 
			
		||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
 | 
			
		||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/custom.css"/>
 | 
			
		||||
#+HTML_HEAD: <script type="text/javascript" src="./js/jquery.min.js"></script>
 | 
			
		||||
#+HTML_HEAD: <script type="text/javascript" src="./js/bootstrap.min.js"></script>
 | 
			
		||||
#+HTML_HEAD: <script type="text/javascript" src="./js/readtheorg.js"></script>
 | 
			
		||||
 | 
			
		||||
#+PROPERTY: header-args:latex  :headers '("\\usepackage{tikz}" "\\usepackage{import}" "\\import{$HOME/Cloud/tikz/org/}{config.tex}")
 | 
			
		||||
#+PROPERTY: header-args:latex+ :imagemagick t :fit yes
 | 
			
		||||
#+PROPERTY: header-args:latex+ :iminoptions -scale 100% -density 150
 | 
			
		||||
#+PROPERTY: header-args:latex+ :imoutoptions -quality 100
 | 
			
		||||
#+PROPERTY: header-args:latex+ :results raw replace :buffer no
 | 
			
		||||
#+PROPERTY: header-args:latex+ :eval no-export
 | 
			
		||||
#+PROPERTY: header-args:latex+ :exports both
 | 
			
		||||
#+PROPERTY: header-args:latex+ :mkdirp yes
 | 
			
		||||
#+PROPERTY: header-args:latex+ :output-dir figs
 | 
			
		||||
#+PROPERTY: header-args:latex+ :post pdf2svg(file=*this*, ext="png")
 | 
			
		||||
 | 
			
		||||
#+PROPERTY: header-args:matlab  :session *MATLAB*
 | 
			
		||||
#+PROPERTY: header-args:matlab+ :comments org
 | 
			
		||||
#+PROPERTY: header-args:matlab+ :exports both
 | 
			
		||||
#+PROPERTY: header-args:matlab+ :results none
 | 
			
		||||
#+PROPERTY: header-args:matlab+ :eval no-export
 | 
			
		||||
#+PROPERTY: header-args:matlab+ :noweb yes
 | 
			
		||||
#+PROPERTY: header-args:matlab+ :mkdirp yes
 | 
			
		||||
#+PROPERTY: header-args:matlab+ :output-dir figs
 | 
			
		||||
:END:
 | 
			
		||||
 | 
			
		||||
* Introduction                                                        :ignore:
 | 
			
		||||
In this document is studied how a piezoelectric stack can be used to measured the force.
 | 
			
		||||
 | 
			
		||||
- Section [[sec:open_closed_circuit]]: the effect of the input impedance of the electronics connected to the force sensor stack on the stiffness of the stack is studied
 | 
			
		||||
- Section [[sec:charge_voltage_estimation]]:
 | 
			
		||||
 | 
			
		||||
* Change of Stiffness due to Sensors stack being open/closed circuit
 | 
			
		||||
:PROPERTIES:
 | 
			
		||||
:header-args:matlab+: :tangle matlab/open_closed_circuit.m
 | 
			
		||||
:END:
 | 
			
		||||
<<sec:open_closed_circuit>>
 | 
			
		||||
 | 
			
		||||
** Introduction                                                      :ignore:
 | 
			
		||||
 | 
			
		||||
** Matlab Init                                             :noexport:ignore:
 | 
			
		||||
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
 | 
			
		||||
  <<matlab-dir>>
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none :results silent :noweb yes
 | 
			
		||||
  <<matlab-init>>
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :tangle no
 | 
			
		||||
  addpath('./matlab/mat/');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :eval no
 | 
			
		||||
  addpath('./mat/');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
** Load Data
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  oc = load('identification_open_circuit.mat', 't', 'encoder', 'u');
 | 
			
		||||
  sc = load('identification_short_circuit.mat', 't', 'encoder', 'u');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
** Transfer Functions
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  Ts = 1e-4; % Sampling Time [s]
 | 
			
		||||
  win = hann(ceil(10/Ts));
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  [tf_oc_est, f] = tfestimate(oc.u, oc.encoder, win, [], [], 1/Ts);
 | 
			
		||||
  [co_oc_est, ~] = mscohere(  oc.u, oc.encoder, win, [], [], 1/Ts);
 | 
			
		||||
 | 
			
		||||
  [tf_sc_est, ~] = tfestimate(sc.u, sc.encoder, win, [], [], 1/Ts);
 | 
			
		||||
  [co_sc_est, ~] = mscohere(  sc.u, sc.encoder, win, [], [], 1/Ts);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
  figure;
 | 
			
		||||
  hold on;
 | 
			
		||||
  plot(f, co_oc_est, '-')
 | 
			
		||||
  plot(f, co_sc_est, '-')
 | 
			
		||||
  set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
 | 
			
		||||
  ylabel('Coherence'); xlabel('Frequency [Hz]');
 | 
			
		||||
  hold off;
 | 
			
		||||
  xlim([0.5, 5e3]);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :tangle no :exports results :results file replace
 | 
			
		||||
  exportFig('figs/stiffness_force_sensor_coherence.pdf', 'width', 'wide', 'height', 'normal');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+name: fig:stiffness_force_sensor_coherence
 | 
			
		||||
#+caption:
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
[[file:figs/stiffness_force_sensor_coherence.png]]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
  figure;
 | 
			
		||||
  tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
 | 
			
		||||
 | 
			
		||||
  ax1 = nexttile;
 | 
			
		||||
  hold on;
 | 
			
		||||
  plot(f, abs(tf_oc_est), '-', 'DisplayName', 'Open-Circuit')
 | 
			
		||||
  plot(f, abs(tf_sc_est), '-', 'DisplayName', 'Short-Circuit')
 | 
			
		||||
  set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
 | 
			
		||||
  ylabel('Amplitude'); set(gca, 'XTickLabel',[]);
 | 
			
		||||
  hold off;
 | 
			
		||||
  ylim([1e-7, 3e-4]);
 | 
			
		||||
  legend('location', 'southwest');
 | 
			
		||||
 | 
			
		||||
  ax2 = nexttile;
 | 
			
		||||
  hold on;
 | 
			
		||||
  plot(f, 180/pi*angle(tf_oc_est), '-')
 | 
			
		||||
  plot(f, 180/pi*angle(tf_sc_est), '-')
 | 
			
		||||
  set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
 | 
			
		||||
  ylabel('Phase'); xlabel('Frequency [Hz]');
 | 
			
		||||
  hold off;
 | 
			
		||||
  yticks(-360:90:360);
 | 
			
		||||
  axis padded 'auto x'
 | 
			
		||||
 | 
			
		||||
  linkaxes([ax1,ax2], 'x');
 | 
			
		||||
  xlim([0.5, 5e3]);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :tangle no :exports results :results file replace
 | 
			
		||||
  exportFig('figs/stiffness_force_sensor_bode.pdf', 'width', 'wide', 'height', 'tall');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+name: fig:stiffness_force_sensor_bode
 | 
			
		||||
#+caption:
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
[[file:figs/stiffness_force_sensor_bode.png]]
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :tangle no :exports results :results file replace
 | 
			
		||||
  xlim([180, 280]);
 | 
			
		||||
  exportFig('figs/stiffness_force_sensor_bode_zoom.pdf', 'width', 'small', 'height', 'tall');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+name: fig:stiffness_force_sensor_bode_zoom
 | 
			
		||||
#+caption: Zoom on the change of resonance
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
[[file:figs/stiffness_force_sensor_bode_zoom.png]]
 | 
			
		||||
 | 
			
		||||
#+begin_important
 | 
			
		||||
  The change of resonance frequency / stiffness is very small and is not important here.
 | 
			
		||||
#+end_important
 | 
			
		||||
 | 
			
		||||
* Generated Number of Charge / Voltage
 | 
			
		||||
:PROPERTIES:
 | 
			
		||||
:header-args:matlab+: :tangle matlab/charge_voltage_estimation.m
 | 
			
		||||
:END:
 | 
			
		||||
<<sec:charge_voltage_estimation>>
 | 
			
		||||
 | 
			
		||||
** Introduction                                                      :ignore:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Two stacks are used as actuator (in parallel) and one stack is used as sensor.
 | 
			
		||||
 | 
			
		||||
The amplifier gain is 20V/V (Cedrat LA75B).
 | 
			
		||||
 | 
			
		||||
** Matlab Init                                            :noexport:ignore:
 | 
			
		||||
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
 | 
			
		||||
  <<matlab-dir>>
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none :results silent :noweb yes
 | 
			
		||||
  <<matlab-init>>
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :tangle no
 | 
			
		||||
  addpath('./matlab/mat/');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :eval no
 | 
			
		||||
  addpath('./mat/');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
** Steps
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  load('force_sensor_steps.mat', 't', 'encoder', 'u', 'v');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  figure;
 | 
			
		||||
  tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
 | 
			
		||||
  nexttile;
 | 
			
		||||
  plot(t, v);
 | 
			
		||||
  xlabel('Time [s]'); ylabel('Measured voltage [V]');
 | 
			
		||||
  nexttile;
 | 
			
		||||
  plot(t, u);
 | 
			
		||||
  xlabel('Time [s]'); ylabel('Actuator Voltage [V]');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :tangle no :exports results :results file replace
 | 
			
		||||
  exportFig('figs/force_sen_steps_time_domain.pdf', 'width', 'wide', 'height', 'tall');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+name: fig:force_sen_steps_time_domain
 | 
			
		||||
#+caption: Time domain signal during the 3 actuator voltage steps
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
[[file:figs/force_sen_steps_time_domain.png]]
 | 
			
		||||
 | 
			
		||||
Three steps are performed at the following time intervals:
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  t_s = [ 2.5, 23;
 | 
			
		||||
         23.8, 35;
 | 
			
		||||
         35.8, 50];
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
Fit function:
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  f = @(b,x) b(1).*exp(b(2).*x) + b(3);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
We are interested by the =b(2)= term, which is the time constant of the exponential.
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  tau = zeros(size(t_s, 1),1);
 | 
			
		||||
  V0  = zeros(size(t_s, 1),1);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  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(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’
 | 
			
		||||
 | 
			
		||||
      tau(t_i) = 1/B(2);
 | 
			
		||||
      V0(t_i)  = B(3);
 | 
			
		||||
  end
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
 | 
			
		||||
  data2orgtable([abs(tau), V0], {}, {'$tau$ [s]', '$V_0$ [V]'}, ' %.2f ');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
| $tau$ [s] | $V_0$ [V] |
 | 
			
		||||
|-----------+-----------|
 | 
			
		||||
|      6.47 |      2.26 |
 | 
			
		||||
|      6.76 |      2.26 |
 | 
			
		||||
|      6.49 |      2.25 |
 | 
			
		||||
 | 
			
		||||
With the capacitance being $C = 4.4 \mu F$, the internal impedance of the Speedgoat ADC can be computed as follows:
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  Cp = 4.4e-6; % [F]
 | 
			
		||||
  Rin = abs(mean(tau))/Cp;
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :results value replace :exports results
 | 
			
		||||
  ans = Rin
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
: 1494100.0
 | 
			
		||||
 | 
			
		||||
The input impedance of the Speedgoat's ADC should then be close to $1.5\,M\Omega$ (specified at $1\,M\Omega$).
 | 
			
		||||
 | 
			
		||||
#+begin_important
 | 
			
		||||
  How can we explain the voltage offset?
 | 
			
		||||
#+end_important
 | 
			
		||||
 | 
			
		||||
As shown in Figure [[fig:force_sensor_model_electronics]] (taken from cite:reza06_piezoel_trans_vibrat_contr_dampin), an input voltage offset is due to the input bias current $i_n$.
 | 
			
		||||
 | 
			
		||||
#+name: fig:force_sensor_model_electronics
 | 
			
		||||
#+caption: Model of a piezoelectric transducer (left) and instrumentation amplifier (right)
 | 
			
		||||
[[file:figs/force_sensor_model_electronics.png]]
 | 
			
		||||
 | 
			
		||||
The estimated input bias current is then:
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  in = mean(V0)/Rin;
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :results value replace :exports results
 | 
			
		||||
   ans = in
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
: 1.5119e-06
 | 
			
		||||
 | 
			
		||||
An additional resistor in parallel with $R_{in}$ would have two effects:
 | 
			
		||||
- reduce the 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} \]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
If we allow the high pass corner frequency to be equals to 3Hz:
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  fc = 3;
 | 
			
		||||
  Ra = Rin/(fc*Cp*Rin - 1);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :results value replace :exports results
 | 
			
		||||
  ans = Ra
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
: 79804
 | 
			
		||||
 | 
			
		||||
With this parallel resistance value, the voltage offset would be:
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  V_offset = Ra*Rin/(Ra + Rin) * in;
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :results value replace :exports results
 | 
			
		||||
  ans = V_offset
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
: 0.11454
 | 
			
		||||
 | 
			
		||||
Which is much more acceptable.
 | 
			
		||||
 | 
			
		||||
** Add Parallel Resistor
 | 
			
		||||
A resistor $R_p \approx 100\,k\Omega$ is added in parallel with the force sensor as shown in Figure [[fig:force_sensor_model_electronics_without_R]].
 | 
			
		||||
 | 
			
		||||
#+name: fig:force_sensor_model_electronics_without_R
 | 
			
		||||
#+caption: Model of a piezoelectric transducer (left) and instrumentation amplifier (right) with added resistor $R_p$
 | 
			
		||||
[[file:figs/force_sensor_model_electronics_without_R.png]]
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  load('force_sensor_steps_R_82k7.mat', 't', 'encoder', 'u', 'v');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  figure;
 | 
			
		||||
  tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
 | 
			
		||||
  nexttile;
 | 
			
		||||
  plot(t, v);
 | 
			
		||||
  xlabel('Time [s]'); ylabel('Measured voltage [V]');
 | 
			
		||||
  nexttile;
 | 
			
		||||
  plot(t, u);
 | 
			
		||||
  xlabel('Time [s]'); ylabel('Actuator Voltage [V]');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :tangle no :exports results :results file replace
 | 
			
		||||
  exportFig('figs/force_sen_steps_time_domain_par_R.pdf', 'width', 'wide', 'height', 'tall');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+name: fig:force_sen_steps_time_domain_par_R
 | 
			
		||||
#+caption: Time domain signal during the actuator voltage steps
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
[[file:figs/force_sen_steps_time_domain_par_R.png]]
 | 
			
		||||
 | 
			
		||||
Three steps are performed at the following time intervals:
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  t_s = [1.9,  6;
 | 
			
		||||
         8.5, 13;
 | 
			
		||||
        15.5, 21;
 | 
			
		||||
        22.6, 26;
 | 
			
		||||
        30.0, 36;
 | 
			
		||||
        37.5, 41;
 | 
			
		||||
        46.2, 49.5]
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
Fit function:
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  f = @(b,x) b(1).*exp(b(2).*x) + b(3);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
We are interested by the =b(2)= term, which is the time constant of the exponential.
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  tau = zeros(size(t_s, 1),1);
 | 
			
		||||
  V0  = zeros(size(t_s, 1),1);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  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(b,t_cur)); % Residual Norm Cost Function
 | 
			
		||||
      B0 = [0.5, -0.2, 0.2];                        % Choose Appropriate Initial Estimates
 | 
			
		||||
      [B,rnrm] = fminsearch(nrmrsd, B0);     % Estimate Parameters ‘B’
 | 
			
		||||
 | 
			
		||||
      tau(t_i) = 1/B(2);
 | 
			
		||||
      V0(t_i)  = B(3);
 | 
			
		||||
  end
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
And indeed, we obtain a much smaller offset voltage and a much faster time constant.
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
 | 
			
		||||
  data2orgtable([abs(tau), V0], {}, {'$tau$ [s]', '$V_0$ [V]'}, ' %.2f ');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
| $tau$ [s] | $V_0$ [V] |
 | 
			
		||||
|-----------+-----------|
 | 
			
		||||
|      0.43 |      0.15 |
 | 
			
		||||
|      0.45 |      0.16 |
 | 
			
		||||
|      0.43 |      0.15 |
 | 
			
		||||
|      0.43 |      0.15 |
 | 
			
		||||
|      0.45 |      0.15 |
 | 
			
		||||
|      0.46 |      0.16 |
 | 
			
		||||
|      0.48 |      0.16 |
 | 
			
		||||
 | 
			
		||||
Knowing the capacitance value, we can estimate the value of the added resistor (neglecting the input impedance of $\approx 1\,M\Omega$):
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  Cp = 4.4e-6; % [F]
 | 
			
		||||
  Rin = abs(mean(tau))/Cp;
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :results value replace :exports results
 | 
			
		||||
  ans = Rin
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
: 101200.0
 | 
			
		||||
 | 
			
		||||
And we can verify that the bias current estimation stays the same:
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  in = mean(V0)/Rin;
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :results value replace :exports results
 | 
			
		||||
   ans = in
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
: 1.5305e-06
 | 
			
		||||
 | 
			
		||||
This validates the model of the ADC and the effectiveness of the added resistor.
 | 
			
		||||
 | 
			
		||||
** Sinus
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  load('force_sensor_sin.mat', 't', 'encoder', 'u', 'v');
 | 
			
		||||
 | 
			
		||||
  u       = u(t>25);
 | 
			
		||||
  v       = v(t>25);
 | 
			
		||||
  encoder = encoder(t>25) - mean(encoder(t>25));
 | 
			
		||||
  t       = t(t>25);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
The driving voltage is a sinus at 0.5Hz centered on 3V and with an amplitude of 3V (Figure [[fig:force_sensor_sin_u]]).
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
  figure;
 | 
			
		||||
  plot(t, u)
 | 
			
		||||
  xlabel('Time [s]'); ylabel('Control Voltage [V]');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :tangle no :exports results :results file replace
 | 
			
		||||
  exportFig('figs/force_sensor_sin_u.pdf', 'width', 'normal', 'height', 'small');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+name: fig:force_sensor_sin_u
 | 
			
		||||
#+caption: Driving Voltage
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
[[file:figs/force_sensor_sin_u.png]]
 | 
			
		||||
 | 
			
		||||
The full stroke as measured by the encoder is:
 | 
			
		||||
#+begin_src matlab :results value replace
 | 
			
		||||
  max(encoder)-min(encoder)
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
: 5.005e-05
 | 
			
		||||
 | 
			
		||||
Its signal is shown in Figure [[fig:force_sensor_sin_encoder]].
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
  figure;
 | 
			
		||||
  plot(t, encoder)
 | 
			
		||||
  xlabel('Time [s]'); ylabel('Encoder [m]');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :tangle no :exports results :results file replace
 | 
			
		||||
  exportFig('figs/force_sensor_sin_encoder.pdf', 'width', 'normal', 'height', 'small');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+name: fig:force_sensor_sin_encoder
 | 
			
		||||
#+caption: Encoder measurement
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
[[file:figs/force_sensor_sin_encoder.png]]
 | 
			
		||||
 | 
			
		||||
The generated voltage by the stack is shown in Figure
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
  figure;
 | 
			
		||||
  plot(t, v)
 | 
			
		||||
  xlabel('Time [s]'); ylabel('Force Sensor Output [V]');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :tangle no :exports results :results file replace
 | 
			
		||||
  exportFig('figs/force_sensor_sin_stack.pdf', 'width', 'normal', 'height', 'small');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+name: fig:force_sensor_sin_stack
 | 
			
		||||
#+caption: Voltage measured on the stack used as a sensor
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
[[file:figs/force_sensor_sin_stack.png]]
 | 
			
		||||
 | 
			
		||||
The capacitance of the stack is
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  Cp = 4.4e-6; % [F]
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
The corresponding generated charge is then shown in Figure [[fig:force_sensor_sin_charge]].
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
  figure;
 | 
			
		||||
  plot(t, 1e6*Cp*(v-mean(v)))
 | 
			
		||||
  xlabel('Time [s]'); ylabel('Generated Charge [$\mu C$]');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :tangle no :exports results :results file replace
 | 
			
		||||
  exportFig('figs/force_sensor_sin_charge.pdf', 'width', 'normal', 'height', 'small');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+name: fig:force_sensor_sin_charge
 | 
			
		||||
#+caption: Generated Charge
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
[[file:figs/force_sensor_sin_charge.png]]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
The relation between the generated voltage and the measured displacement is almost linear as shown in Figure [[fig:force_sensor_linear_relation]].
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  b1 = encoder\(v-mean(v));
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
  figure;
 | 
			
		||||
  hold on;
 | 
			
		||||
  plot(encoder, v-mean(v), 'DisplayName', 'Measured Voltage');
 | 
			
		||||
  plot(encoder, encoder*b1, 'DisplayName', sprintf('Linear Fit: $U_s \\approx %.3f [V/\\mu m] \\cdot d$', 1e-6*abs(b1)));
 | 
			
		||||
  hold off;
 | 
			
		||||
  xlabel('Measured Displacement [m]'); ylabel('Generated Voltage [V]');
 | 
			
		||||
  legend();
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :tangle no :exports results :results file replace
 | 
			
		||||
  exportFig('figs/force_sensor_linear_relation.pdf', 'width', 'normal', 'height', 'small');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+name: fig:force_sensor_linear_relation
 | 
			
		||||
#+caption: Almost linear relation between the relative displacement and the generated voltage
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
[[file:figs/force_sensor_linear_relation.png]]
 | 
			
		||||
 | 
			
		||||
With a 16bits ADC, the resolution will then be equals to (in [nm]):
 | 
			
		||||
#+begin_src matlab :results value replace
 | 
			
		||||
  abs((20/2^16)/(b1/1e9))
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
: 3.9838
 | 
			
		||||
							
								
								
									
										7
									
								
								js/bootstrap.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										4
									
								
								js/jquery.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										87
									
								
								js/readtheorg.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,87 @@
 | 
			
		||||
$(function() {
 | 
			
		||||
    $('.note').before("<p class='admonition-title note'>Note</p>");
 | 
			
		||||
    $('.seealso').before("<p class='admonition-title seealso'>See also</p>");
 | 
			
		||||
    $('.warning').before("<p class='admonition-title warning'>Warning</p>");
 | 
			
		||||
    $('.caution').before("<p class='admonition-title caution'>Caution</p>");
 | 
			
		||||
    $('.attention').before("<p class='admonition-title attention'>Attention</p>");
 | 
			
		||||
    $('.tip').before("<p class='admonition-title tip'>Tip</p>");
 | 
			
		||||
    $('.important').before("<p class='admonition-title important'>Important</p>");
 | 
			
		||||
    $('.hint').before("<p class='admonition-title hint'>Hint</p>");
 | 
			
		||||
    $('.error').before("<p class='admonition-title error'>Error</p>");
 | 
			
		||||
    $('.danger').before("<p class='admonition-title danger'>Danger</p>");
 | 
			
		||||
    $('.question').before("<p class='admonition-title question'>Question</p>");
 | 
			
		||||
    $('.summary').before("<p class='admonition-title hint'>Summary</p>");
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
$( document ).ready(function() {
 | 
			
		||||
 | 
			
		||||
    // Shift nav in mobile when clicking the menu.
 | 
			
		||||
    $(document).on('click', "[data-toggle='wy-nav-top']", function() {
 | 
			
		||||
      $("[data-toggle='wy-nav-shift']").toggleClass("shift");
 | 
			
		||||
      $("[data-toggle='rst-versions']").toggleClass("shift");
 | 
			
		||||
    });
 | 
			
		||||
    // Close menu when you click a link.
 | 
			
		||||
    $(document).on('click', ".wy-menu-vertical .current ul li a", function() {
 | 
			
		||||
      $("[data-toggle='wy-nav-shift']").removeClass("shift");
 | 
			
		||||
      $("[data-toggle='rst-versions']").toggleClass("shift");
 | 
			
		||||
    });
 | 
			
		||||
    $(document).on('click', "[data-toggle='rst-current-version']", function() {
 | 
			
		||||
      $("[data-toggle='rst-versions']").toggleClass("shift-up");
 | 
			
		||||
    });
 | 
			
		||||
    // Make tables responsive
 | 
			
		||||
    $("table.docutils:not(.field-list)").wrap("<div class='wy-table-responsive'></div>");
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
$( document ).ready(function() {
 | 
			
		||||
    $('#text-table-of-contents ul').first().addClass('nav');
 | 
			
		||||
                                        // ScrollSpy also requires that we use
 | 
			
		||||
                                        // a Bootstrap nav component.
 | 
			
		||||
    $('body').scrollspy({target: '#text-table-of-contents'});
 | 
			
		||||
 | 
			
		||||
    // add sticky table headers
 | 
			
		||||
    $('table').stickyTableHeaders();
 | 
			
		||||
 | 
			
		||||
    // set the height of tableOfContents
 | 
			
		||||
    var $postamble = $('#postamble');
 | 
			
		||||
    var $tableOfContents = $('#table-of-contents');
 | 
			
		||||
    $tableOfContents.css({paddingBottom: $postamble.outerHeight()});
 | 
			
		||||
 | 
			
		||||
    // add TOC button
 | 
			
		||||
    var toggleSidebar = $('<div id="toggle-sidebar"><a href="#table-of-contents"><h2>Table of Contents</h2></a></div>');
 | 
			
		||||
    $('#content').prepend(toggleSidebar);
 | 
			
		||||
 | 
			
		||||
    // add close button when sidebar showed in mobile screen
 | 
			
		||||
    var closeBtn = $('<a class="close-sidebar" href="#">Close</a>');
 | 
			
		||||
    var tocTitle = $('#table-of-contents').find('h2');
 | 
			
		||||
    tocTitle.append(closeBtn);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
window.SphinxRtdTheme = (function (jquery) {
 | 
			
		||||
    var stickyNav = (function () {
 | 
			
		||||
        var navBar,
 | 
			
		||||
            win,
 | 
			
		||||
            stickyNavCssClass = 'stickynav',
 | 
			
		||||
            applyStickNav = function () {
 | 
			
		||||
                if (navBar.height() <= win.height()) {
 | 
			
		||||
                    navBar.addClass(stickyNavCssClass);
 | 
			
		||||
                } else {
 | 
			
		||||
                    navBar.removeClass(stickyNavCssClass);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            enable = function () {
 | 
			
		||||
                applyStickNav();
 | 
			
		||||
                win.on('resize', applyStickNav);
 | 
			
		||||
            },
 | 
			
		||||
            init = function () {
 | 
			
		||||
                navBar = jquery('nav.wy-nav-side:first');
 | 
			
		||||
                win    = jquery(window);
 | 
			
		||||
            };
 | 
			
		||||
        jquery(init);
 | 
			
		||||
        return {
 | 
			
		||||
            enable : enable
 | 
			
		||||
        };
 | 
			
		||||
    }());
 | 
			
		||||
    return {
 | 
			
		||||
        StickyNav : stickyNav
 | 
			
		||||
    };
 | 
			
		||||
}($));
 | 
			
		||||
							
								
								
									
										330
									
								
								matlab/charge_voltage_estimation.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,330 @@
 | 
			
		||||
%% Clear Workspace and Close figures
 | 
			
		||||
clear; close all; clc;
 | 
			
		||||
 | 
			
		||||
%% Intialize Laplace variable
 | 
			
		||||
s = zpk('s');
 | 
			
		||||
 | 
			
		||||
addpath('./mat/');
 | 
			
		||||
 | 
			
		||||
% Steps
 | 
			
		||||
 | 
			
		||||
load('force_sensor_steps.mat', 't', 'encoder', 'u', 'v');
 | 
			
		||||
 | 
			
		||||
figure;
 | 
			
		||||
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
 | 
			
		||||
nexttile;
 | 
			
		||||
plot(t, v);
 | 
			
		||||
xlabel('Time [s]'); ylabel('Measured voltage [V]');
 | 
			
		||||
nexttile;
 | 
			
		||||
plot(t, u);
 | 
			
		||||
xlabel('Time [s]'); ylabel('Actuator Voltage [V]');
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% #+name: fig:force_sen_steps_time_domain
 | 
			
		||||
% #+caption: Time domain signal during the 3 actuator voltage steps
 | 
			
		||||
% #+RESULTS:
 | 
			
		||||
% [[file:figs/force_sen_steps_time_domain.png]]
 | 
			
		||||
 | 
			
		||||
% Three steps are performed at the following time intervals:
 | 
			
		||||
 | 
			
		||||
t_s = [ 2.5, 23;
 | 
			
		||||
       23.8, 35;
 | 
			
		||||
       35.8, 50];
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% Fit function:
 | 
			
		||||
 | 
			
		||||
f = @(b,x) b(1).*exp(b(2).*x) + b(3);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% We are interested by the =b(2)= term, which is the time constant of the exponential.
 | 
			
		||||
 | 
			
		||||
tau = zeros(size(t_s, 1),1);
 | 
			
		||||
V0  = 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(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’
 | 
			
		||||
 | 
			
		||||
    tau(t_i) = 1/B(2);
 | 
			
		||||
    V0(t_i)  = B(3);
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% #+RESULTS:
 | 
			
		||||
% | $tau$ [s] | $V_0$ [V] |
 | 
			
		||||
% |-----------+-----------|
 | 
			
		||||
% |      6.47 |      2.26 |
 | 
			
		||||
% |      6.76 |      2.26 |
 | 
			
		||||
% |      6.49 |      2.25 |
 | 
			
		||||
 | 
			
		||||
% With the capacitance being $C = 4.4 \mu F$, the internal impedance of the Speedgoat ADC can be computed as follows:
 | 
			
		||||
 | 
			
		||||
Cp = 4.4e-6; % [F]
 | 
			
		||||
Rin = abs(mean(tau))/Cp;
 | 
			
		||||
 | 
			
		||||
ans = Rin
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% #+RESULTS:
 | 
			
		||||
% : 1494100.0
 | 
			
		||||
 | 
			
		||||
% The input impedance of the Speedgoat's ADC should then be close to $1.5\,M\Omega$ (specified at $1\,M\Omega$).
 | 
			
		||||
 | 
			
		||||
% #+begin_important
 | 
			
		||||
%   How can we explain the voltage offset?
 | 
			
		||||
% #+end_important
 | 
			
		||||
 | 
			
		||||
% As shown in Figure [[fig:force_sensor_model_electronics]] (taken from cite:reza06_piezoel_trans_vibrat_contr_dampin), an input voltage offset is due to the input bias current $i_n$.
 | 
			
		||||
 | 
			
		||||
% #+name: fig:force_sensor_model_electronics
 | 
			
		||||
% #+caption: Model of a piezoelectric transducer (left) and instrumentation amplifier (right)
 | 
			
		||||
% [[file:figs/force_sensor_model_electronics.png]]
 | 
			
		||||
 | 
			
		||||
% The estimated input bias current is then:
 | 
			
		||||
 | 
			
		||||
in = mean(V0)/Rin;
 | 
			
		||||
 | 
			
		||||
ans = in
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% #+RESULTS:
 | 
			
		||||
% : 1.5119e-06
 | 
			
		||||
 | 
			
		||||
% An additional resistor in parallel with $R_{in}$ would have two effects:
 | 
			
		||||
% - reduce the 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} \]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% If we allow the high pass corner frequency to be equals to 3Hz:
 | 
			
		||||
 | 
			
		||||
fc = 3;
 | 
			
		||||
Ra = Rin/(fc*Cp*Rin - 1);
 | 
			
		||||
 | 
			
		||||
ans = Ra
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% #+RESULTS:
 | 
			
		||||
% : 79804
 | 
			
		||||
 | 
			
		||||
% With this parallel resistance value, the voltage offset would be:
 | 
			
		||||
 | 
			
		||||
V_offset = Ra*Rin/(Ra + Rin) * in;
 | 
			
		||||
 | 
			
		||||
ans = V_offset
 | 
			
		||||
 | 
			
		||||
% Add Parallel Resistor
 | 
			
		||||
% A resistor $R_p \approx 100\,k\Omega$ is added in parallel with the force sensor as shown in Figure [[fig:force_sensor_model_electronics_without_R]].
 | 
			
		||||
 | 
			
		||||
% #+name: fig:force_sensor_model_electronics_without_R
 | 
			
		||||
% #+caption: Model of a piezoelectric transducer (left) and instrumentation amplifier (right) with added resistor $R_p$
 | 
			
		||||
% [[file:figs/force_sensor_model_electronics_without_R.png]]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
load('force_sensor_steps_R_82k7.mat', 't', 'encoder', 'u', 'v');
 | 
			
		||||
 | 
			
		||||
figure;
 | 
			
		||||
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
 | 
			
		||||
nexttile;
 | 
			
		||||
plot(t, v);
 | 
			
		||||
xlabel('Time [s]'); ylabel('Measured voltage [V]');
 | 
			
		||||
nexttile;
 | 
			
		||||
plot(t, u);
 | 
			
		||||
xlabel('Time [s]'); ylabel('Actuator Voltage [V]');
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% #+name: fig:force_sen_steps_time_domain_par_R
 | 
			
		||||
% #+caption: Time domain signal during the actuator voltage steps
 | 
			
		||||
% #+RESULTS:
 | 
			
		||||
% [[file:figs/force_sen_steps_time_domain_par_R.png]]
 | 
			
		||||
 | 
			
		||||
% Three steps are performed at the following time intervals:
 | 
			
		||||
 | 
			
		||||
t_s = [1.9,  6;
 | 
			
		||||
       8.5, 13;
 | 
			
		||||
      15.5, 21;
 | 
			
		||||
      22.6, 26;
 | 
			
		||||
      30.0, 36;
 | 
			
		||||
      37.5, 41;
 | 
			
		||||
      46.2, 49.5]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% Fit function:
 | 
			
		||||
 | 
			
		||||
f = @(b,x) b(1).*exp(b(2).*x) + b(3);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% We are interested by the =b(2)= term, which is the time constant of the exponential.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
tau = zeros(size(t_s, 1),1);
 | 
			
		||||
V0  = 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(b,t_cur)); % Residual Norm Cost Function
 | 
			
		||||
    B0 = [0.5, -0.2, 0.2];                        % Choose Appropriate Initial Estimates
 | 
			
		||||
    [B,rnrm] = fminsearch(nrmrsd, B0);     % Estimate Parameters ‘B’
 | 
			
		||||
 | 
			
		||||
    tau(t_i) = 1/B(2);
 | 
			
		||||
    V0(t_i)  = B(3);
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% #+RESULTS:
 | 
			
		||||
% | $tau$ [s] | $V_0$ [V] |
 | 
			
		||||
% |-----------+-----------|
 | 
			
		||||
% |      0.43 |      0.15 |
 | 
			
		||||
% |      0.45 |      0.16 |
 | 
			
		||||
% |      0.43 |      0.15 |
 | 
			
		||||
% |      0.43 |      0.15 |
 | 
			
		||||
% |      0.45 |      0.15 |
 | 
			
		||||
% |      0.46 |      0.16 |
 | 
			
		||||
% |      0.48 |      0.16 |
 | 
			
		||||
 | 
			
		||||
% Knowing the capacitance value, we can estimate the value of the added resistor (neglecting the input impedance of $\approx 1\,M\Omega$):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Cp = 4.4e-6; % [F]
 | 
			
		||||
Rin = abs(mean(tau))/Cp;
 | 
			
		||||
 | 
			
		||||
ans = Rin
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% #+RESULTS:
 | 
			
		||||
% : 101200.0
 | 
			
		||||
 | 
			
		||||
% And we can verify that the bias current estimation stays the same:
 | 
			
		||||
 | 
			
		||||
in = mean(V0)/Rin;
 | 
			
		||||
 | 
			
		||||
ans = in
 | 
			
		||||
 | 
			
		||||
% Sinus
 | 
			
		||||
 | 
			
		||||
load('force_sensor_sin.mat', 't', 'encoder', 'u', 'v');
 | 
			
		||||
 | 
			
		||||
u       = u(t>25);
 | 
			
		||||
v       = v(t>25);
 | 
			
		||||
encoder = encoder(t>25) - mean(encoder(t>25));
 | 
			
		||||
t       = t(t>25);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% The driving voltage is a sinus at 0.5Hz centered on 3V and with an amplitude of 3V (Figure [[fig:force_sensor_sin_u]]).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
figure;
 | 
			
		||||
plot(t, u)
 | 
			
		||||
xlabel('Time [s]'); ylabel('Control Voltage [V]');
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% #+name: fig:force_sensor_sin_u
 | 
			
		||||
% #+caption: Driving Voltage
 | 
			
		||||
% #+RESULTS:
 | 
			
		||||
% [[file:figs/force_sensor_sin_u.png]]
 | 
			
		||||
 | 
			
		||||
% The full stroke as measured by the encoder is:
 | 
			
		||||
 | 
			
		||||
max(encoder)-min(encoder)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% #+RESULTS:
 | 
			
		||||
% : 5.005e-05
 | 
			
		||||
 | 
			
		||||
% Its signal is shown in Figure [[fig:force_sensor_sin_encoder]].
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
figure;
 | 
			
		||||
plot(t, encoder)
 | 
			
		||||
xlabel('Time [s]'); ylabel('Encoder [m]');
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% #+name: fig:force_sensor_sin_encoder
 | 
			
		||||
% #+caption: Encoder measurement
 | 
			
		||||
% #+RESULTS:
 | 
			
		||||
% [[file:figs/force_sensor_sin_encoder.png]]
 | 
			
		||||
 | 
			
		||||
% The generated voltage by the stack is shown in Figure
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
figure;
 | 
			
		||||
plot(t, v)
 | 
			
		||||
xlabel('Time [s]'); ylabel('Force Sensor Output [V]');
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% #+name: fig:force_sensor_sin_stack
 | 
			
		||||
% #+caption: Voltage measured on the stack used as a sensor
 | 
			
		||||
% #+RESULTS:
 | 
			
		||||
% [[file:figs/force_sensor_sin_stack.png]]
 | 
			
		||||
 | 
			
		||||
% The capacitance of the stack is
 | 
			
		||||
 | 
			
		||||
Cp = 4.4e-6; % [F]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% The corresponding generated charge is then shown in Figure [[fig:force_sensor_sin_charge]].
 | 
			
		||||
 | 
			
		||||
figure;
 | 
			
		||||
plot(t, 1e6*Cp*(v-mean(v)))
 | 
			
		||||
xlabel('Time [s]'); ylabel('Generated Charge [$\mu C$]');
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% #+name: fig:force_sensor_sin_charge
 | 
			
		||||
% #+caption: Generated Charge
 | 
			
		||||
% #+RESULTS:
 | 
			
		||||
% [[file:figs/force_sensor_sin_charge.png]]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% The relation between the generated voltage and the measured displacement is almost linear as shown in Figure [[fig:force_sensor_linear_relation]].
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
b1 = encoder\(v-mean(v));
 | 
			
		||||
 | 
			
		||||
figure;
 | 
			
		||||
hold on;
 | 
			
		||||
plot(encoder, v-mean(v), 'DisplayName', 'Measured Voltage');
 | 
			
		||||
plot(encoder, encoder*b1, 'DisplayName', sprintf('Linear Fit: $U_s \\approx %.3f [V/\\mu m] \\cdot d$', 1e-6*abs(b1)));
 | 
			
		||||
hold off;
 | 
			
		||||
xlabel('Measured Displacement [m]'); ylabel('Generated Voltage [V]');
 | 
			
		||||
legend();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% #+name: fig:force_sensor_linear_relation
 | 
			
		||||
% #+caption: Almost linear relation between the relative displacement and the generated voltage
 | 
			
		||||
% #+RESULTS:
 | 
			
		||||
% [[file:figs/force_sensor_linear_relation.png]]
 | 
			
		||||
 | 
			
		||||
% With a 16bits ADC, the resolution will then be equals to (in [nm]):
 | 
			
		||||
 | 
			
		||||
abs((20/2^16)/(b1/1e9))
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								matlab/mat/force_sensor_sin.mat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								matlab/mat/force_sensor_steps.mat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								matlab/mat/force_sensor_steps_R_82k7.mat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								matlab/mat/identification_R_82k7.mat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								matlab/mat/identification_open_circuit.mat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								matlab/mat/identification_short_circuit.mat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										67
									
								
								matlab/open_closed_circuit.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,67 @@
 | 
			
		||||
%% Clear Workspace and Close figures
 | 
			
		||||
clear; close all; clc;
 | 
			
		||||
 | 
			
		||||
%% Intialize Laplace variable
 | 
			
		||||
s = zpk('s');
 | 
			
		||||
 | 
			
		||||
addpath('./mat/');
 | 
			
		||||
 | 
			
		||||
% Load Data
 | 
			
		||||
 | 
			
		||||
oc = load('identification_open_circuit.mat', 't', 'encoder', 'u');
 | 
			
		||||
sc = load('identification_short_circuit.mat', 't', 'encoder', 'u');
 | 
			
		||||
 | 
			
		||||
% Transfer Functions
 | 
			
		||||
 | 
			
		||||
Ts = 1e-4; % Sampling Time [s]
 | 
			
		||||
win = hann(ceil(10/Ts));
 | 
			
		||||
 | 
			
		||||
[tf_oc_est, f] = tfestimate(oc.u, oc.encoder, win, [], [], 1/Ts);
 | 
			
		||||
[co_oc_est, ~] = mscohere(  oc.u, oc.encoder, win, [], [], 1/Ts);
 | 
			
		||||
 | 
			
		||||
[tf_sc_est, ~] = tfestimate(sc.u, sc.encoder, win, [], [], 1/Ts);
 | 
			
		||||
[co_sc_est, ~] = mscohere(  sc.u, sc.encoder, win, [], [], 1/Ts);
 | 
			
		||||
 | 
			
		||||
figure;
 | 
			
		||||
hold on;
 | 
			
		||||
plot(f, co_oc_est, '-')
 | 
			
		||||
plot(f, co_sc_est, '-')
 | 
			
		||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
 | 
			
		||||
ylabel('Coherence'); xlabel('Frequency [Hz]');
 | 
			
		||||
hold off;
 | 
			
		||||
xlim([0.5, 5e3]);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% #+name: fig:stiffness_force_sensor_coherence
 | 
			
		||||
% #+caption:
 | 
			
		||||
% #+RESULTS:
 | 
			
		||||
% [[file:figs/stiffness_force_sensor_coherence.png]]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
figure;
 | 
			
		||||
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
 | 
			
		||||
 | 
			
		||||
ax1 = nexttile;
 | 
			
		||||
hold on;
 | 
			
		||||
plot(f, abs(tf_oc_est), '-', 'DisplayName', 'Open-Circuit')
 | 
			
		||||
plot(f, abs(tf_sc_est), '-', 'DisplayName', 'Short-Circuit')
 | 
			
		||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
 | 
			
		||||
ylabel('Amplitude'); set(gca, 'XTickLabel',[]);
 | 
			
		||||
hold off;
 | 
			
		||||
ylim([1e-7, 3e-4]);
 | 
			
		||||
legend('location', 'southwest');
 | 
			
		||||
 | 
			
		||||
ax2 = nexttile;
 | 
			
		||||
hold on;
 | 
			
		||||
plot(f, 180/pi*angle(tf_oc_est), '-')
 | 
			
		||||
plot(f, 180/pi*angle(tf_sc_est), '-')
 | 
			
		||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
 | 
			
		||||
ylabel('Phase'); xlabel('Frequency [Hz]');
 | 
			
		||||
hold off;
 | 
			
		||||
yticks(-360:90:360);
 | 
			
		||||
axis padded 'auto x'
 | 
			
		||||
 | 
			
		||||
linkaxes([ax1,ax2], 'x');
 | 
			
		||||
xlim([0.5, 5e3]);
 | 
			
		||||
							
								
								
									
										17
									
								
								matlab/runtest.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,17 @@
 | 
			
		||||
tg = slrt;
 | 
			
		||||
 | 
			
		||||
%%
 | 
			
		||||
f = SimulinkRealTime.openFTP(tg);
 | 
			
		||||
mget(f, 'int_enc.dat', 'data');
 | 
			
		||||
close(f);
 | 
			
		||||
 | 
			
		||||
%% Convert the Data
 | 
			
		||||
data = SimulinkRealTime.utils.getFileScopeData('data/int_enc.dat').data;
 | 
			
		||||
 | 
			
		||||
interferometer = data(:, 1);
 | 
			
		||||
encoder = data(:, 2);
 | 
			
		||||
u = data(:, 3);
 | 
			
		||||
t = data(:, 4);
 | 
			
		||||
 | 
			
		||||
save('./mat/int_enc_id_noise_bis.mat', 'interferometer', 'encoder', 'u' , 't');
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										23
									
								
								matlab/setup.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,23 @@
 | 
			
		||||
%%
 | 
			
		||||
s = tf('s');
 | 
			
		||||
Ts = 1e-4; % [s]
 | 
			
		||||
 | 
			
		||||
%% Pre-Filter
 | 
			
		||||
G_pf = 1/(1 + s/2/pi/20);
 | 
			
		||||
G_pf = c2d(G_pf, Ts, 'tustin');
 | 
			
		||||
 | 
			
		||||
% %% Force Sensor Filter (HPF)
 | 
			
		||||
% Gf_hpf = s/(s + 2*pi*2);
 | 
			
		||||
% Gf_hpf = tf(1);
 | 
			
		||||
% Gf_hpf = c2d(Gf_hpf, Ts, 'tustin');
 | 
			
		||||
% 
 | 
			
		||||
% %% IFF Controller
 | 
			
		||||
% Kiff = 1/(s + 2*pi*2);
 | 
			
		||||
% Kiff = c2d(Kiff, Ts, 'tustin');
 | 
			
		||||
% 
 | 
			
		||||
% %% Excitation Signal
 | 
			
		||||
Tsim = 100; % Excitation time + Measurement time [s]
 | 
			
		||||
 | 
			
		||||
t = 0:Ts:Tsim;
 | 
			
		||||
u_exc = timeseries(chirp(t, 10, Tsim, 40, 'logarithmic'), t);
 | 
			
		||||
% u_exc = timeseries(y_v, t);
 | 
			
		||||