function varargout = log_dec(varargin) % LOG_DEC M-file for log_dec.fig % LOG_DEC, by itself, creates a new LOG_DEC or raises the existing % singleton*. % % H = LOG_DEC returns the handle to a new LOG_DEC or the handle to % the existing singleton*. % % LOG_DEC('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in LOG_DEC.M with the given input arguments. % % LOG_DEC('Property','Value',...) creates a new LOG_DEC or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before log_dec_OpeningFunction gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to log_dec_OpeningFcn via varargin. % % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES % Edit the above text to modify the response to help log_dec % Last Modified by GUIDE v2.5 18-Feb-2005 13:18:11 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @log_dec_OpeningFcn, ... 'gui_OutputFcn', @log_dec_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin & isstr(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT % --- Executes just before log_dec is made visible. function log_dec_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to log_dec (see VARARGIN) % Choose default command line output for log_dec handles.output = hObject; % Update handles structure guidata(hObject, handles); % UIWAIT makes log_dec wait for user response (see UIRESUME) % uiwait(handles.figure1); % --- Outputs from this function are returned to the command line. function varargout = log_dec_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Get default command line output from handles structure varargout{1} = handles.output; % %============================================================= % Determine which cart we are using %============================================================= % % --- Executes on button press in radiobutton1. function radiobutton1_Callback(hObject, eventdata, handles) global cart1 cart2 cart3 disk1 disk3 encoder % cart1 = get(handles.radiobutton1,'Value'); encoder = 1; % % If this cart is selected, deselect the other carts % set(handles.radiobutton2,'Value',0); set(handles.radiobutton3,'Value',0); set(handles.radiobutton4,'Value',0); set(handles.radiobutton5,'Value',0); % return; % % --- Executes on button press in radiobutton2. function radiobutton2_Callback(hObject, eventdata, handles) global cart1 cart2 cart3 disk1 disk3 encoder % cart2 = get(handles.radiobutton2,'Value'); encoder = 2; % % If this cart is selected, deselect the other carts % set(handles.radiobutton1,'Value',0); set(handles.radiobutton3,'Value',0); set(handles.radiobutton4,'Value',0); set(handles.radiobutton5,'Value',0); % return; % % --- Executes on button press in radiobutton3. function radiobutton3_Callback(hObject, eventdata, handles) global cart1 cart2 cart3 disk1 disk3 encoder % cart3 = get(handles.radiobutton3,'Value'); encoder = 3; % % If this cart is selected, deselect the other carts % set(handles.radiobutton1,'Value',0); set(handles.radiobutton2,'Value',0); set(handles.radiobutton4,'Value',0); set(handles.radiobutton5,'Value',0); % return; % --- Executes on button press in radiobutton4. function radiobutton4_Callback(hObject, eventdata, handles) global cart1 cart2 cart3 disk1 disk3 encoder % disk1 = get(handles.radiobutton4,'Value'); encoder = 4; % % If this disk is selected, deselect the other carts % set(handles.radiobutton1,'Value',0); set(handles.radiobutton2,'Value',0); set(handles.radiobutton3,'Value',0); set(handles.radiobutton5,'Value',0); % return; % --- Executes on button press in radiobutton5. function radiobutton5_Callback(hObject, eventdata, handles) global cart1 cart2 cart3 disk1 disk3 encoder % disk3 = get(handles.radiobutton5,'Value'); encoder = 5; % % If this disk is selected, deselect the other carts % set(handles.radiobutton1,'Value',0); set(handles.radiobutton2,'Value',0); set(handles.radiobutton3,'Value',0); set(handles.radiobutton4,'Value',0); % return; % %======================================================================= % This routine loads the initial condition response %======================================================================= % % --- Executes on button press in pushbutton1. % function pushbutton1_Callback(hObject, eventdata, handles) global tIC yIC encoder low_peak high_peak separation final_time % % read in the data from the workspace % tIC = evalin('base','time'); if( encoder == 5) yIC = evalin('base','theta3'); elseif ( encoder == 4) yIC = evalin('base','theta1'); elseif( encoder == 3) yIC = evalin('base','x3'); elseif (encoder == 2) yIC = evalin('base','x2'); else yIC = evalin('base','x1'); end; % % Set the initial final time for the step response % final_time = tIC(end); set(handles.edit1,'String',num2str(tIC(end))); % % Set the ranges of the final time slider % set(handles.slider1,'Min',0); set(handles.slider1,'Max',tIC(end)); set(handles.slider1,'Value',final_time); % % Set the initial separation (sample points) between peaks % separation = 65; set(handles.edit4,'String',num2str(separation)); % % Set the ranges of the separation slider % set(handles.slider4,'Min',1); set(handles.slider4,'Max',100); set(handles.slider4,'SliderStep',[0.01 .1]); set(handles.slider4,'Value',separation); % % set the initial values for the low peaks % low_peak = 2; set(handles.edit2,'String',num2str(low_peak)); set(handles.slider2,'Min',1); set(handles.slider2,'Max',100); set(handles.slider2,'Value',low_peak); set(handles.slider2,'SliderStep',[0.01 0.1]); % % set the initial values for the high peaks % high_peak = 3; set(handles.edit3,'String',num2str(high_peak)); set(handles.slider3,'Min',1); set(handles.slider3,'Max',100); set(handles.slider3,'Value',high_peak); set(handles.slider3,'SliderStep',[0.01 0.1]); % return; % %====================================================== % This routine plots the initial condition response %====================================================== % % --- Executes on button press in pushbutton6. function pushbutton6_Callback(hObject, eventdata, handles) global tIC yIC final_time encoder % axes(handles.axes1); cla reset plot(tIC,yIC,'-'); grid; xlabel('Time (sec)'); if (encoder <= 3) ylabel('Displacement (cm)'); else ylabel('Displacement (degrees)'); end; % if (isempty(final_time) == 0) axis([0 final_time min(yIC) max(yIC)]); end; % return; % %========================================================================== % This routine determines the final time for the IC response from the % slider %========================================================================== % % --- Executes on slider movement. function slider1_Callback(hObject, eventdata, handles) global final_time % % Get the final time % final_time = get(handles.slider1,'Value'); % % Put this final value in the box % set(handles.edit1,'String',num2str(final_time)); % return; % %===================================================================== % Read the final time from direct input %==================================================================== function edit1_Callback(hObject, eventdata, handles) global final_time % final_time = str2num(get(handles.edit1,'String')); return; % %============================================================= % This routine makes the + peaks picture %============================================================ % % --- Executes on button press in pushbutton2. function pushbutton2_Callback(hObject, eventdata, handles) global tIC yIC separation index final_time peaks encoder % peaks = 1; % peaks is -1 if a negative peak picture temp = yIC; data = temp - temp(end); % % find the positive peaks of the data % N = length(tIC); index = []; old_index = 0; for i=2:N-1 if((data(i)>=data(i-1)) & (data(i)>data(i+1)) & (i > old_index+separation)); index = [index i]; old_index = i; end; end; % % Plot the data with the identified inflection points % axes(handles.axes1); cla reset hold on plot(tIC,data); grid; xlabel('Time (sec)'); if (encoder <= 3) ylabel('Displacement (cm)'); else ylabel('Displacement (degrees)'); end; for i=1:length(index) if (tIC(index(i)) < final_time) text(tIC(index(i)),data(index(i)),num2str(i)); % the inflection point end; end; if (isempty(final_time) == 0) axis([0 final_time min(data) max(data)]); end; hold off % return; % %================================================================== % This routine makes the (-) peaks picture %==================================================================== % % --- Executes on button press in pushbutton4. function pushbutton4_Callback(hObject, eventdata, handles) global tIC yIC separation index final_time peaks encoder % peaks = -1; % peaks is +1 if a positive peaks picture temp = -yIC; data = temp - temp(end); % % find the positive peaks of the data % N = length(tIC); index = []; old_index = 0; for i=2:N-1 if((data(i)>=data(i-1)) & (data(i)>data(i+1)) & (i > old_index+separation)); index = [index i]; old_index = i; end; end; % % Plot the data with the identified inflection points % axes(handles.axes1); cla reset hold on plot(tIC,data); grid; xlabel('Time (sec)'); if (encoder <= 3) ylabel('Discplacement (cm)'); else ylabel('Displacement (degrees)'); end; for i=1:length(index) if( tIC(index(i)) < final_time ) text(tIC(index(i)),data(index(i)),num2str(i)); % the inflection point end; end; if (isempty(final_time) == 0) axis([0 final_time min(data) max(data)]); end; hold off % return; % %========================================================= % Get the Separation Value %========================================================= % % --- Executes on slider movement. function slider4_Callback(hObject, eventdata, handles) global separation % % Get the separation value % separation = floor(get(handles.slider4,'Value')); set(handles.edit4,'String',num2str(separation)); % return; % %============================================================= % Read The Separation Value %============================================================== % function edit4_Callback(hObject, eventdata, handles) global separation % separation = str2num(get(handles.edit4,'String')); % return; % %=============================================================== % Get the low peak value %=============================================================== % % --- Executes on slider movement. function slider2_Callback(hObject, eventdata, handles) global low_peak high_peak % low_peak = floor(get(handles.slider2,'Value')); set(handles.edit2,'String',num2str(low_peak)); % % be sure the high peak is at least one larger % if (high_peak <= low_peak) high_peak = low_peak+1; set(handles.edit3,'String',num2str(high_peak)); end; % return; % %============================================= % Read the low peak value %============================================= % function edit2_Callback(hObject, eventdata, handles) global low_peak high_peak % low_peak = str2num(get(handles.edit2,'String')); % % be sure the high peak is at least one larger % if (high_peak <= low_peak) high_peak = low_peak+1; set(handles.edit3,'String',num2str(high_peak)); end; % return; % %============================================================== % Get the high peak value %============================================================== % % --- Executes on slider movement. function slider3_Callback(hObject, eventdata, handles) global high_peak low_peak % high_peak = floor(get(handles.slider3,'Value')); set(handles.edit3,'String',num2str(high_peak)); % return; % %==================================================== % Read the high peak value %====================================================== % function edit3_Callback(hObject, eventdata, handles) global low_peak high_peak % high_peak = str2num(get(handles.edit3,'String')); % return; % %============================================================== % Estimate Parameters %============================================================== % % --- Executes on button press in pushbutton7. function pushbutton7_Callback(hObject, eventdata, handles) global tIC yIC index low_peak high_peak omega_n zeta H % % Find the damped period % temp = -yIC; data = temp - temp(end); % n = high_peak-low_peak; T_d = (tIC(index(high_peak))-tIC(index(low_peak)))/n; omega_d = 2*pi/T_d; delta = log(data(index(low_peak))/data(index(high_peak))); zeta = delta/sqrt(4*pi*pi*n*n+delta*delta); omega_n = omega_d/sqrt(1-zeta*zeta); % % Put it all together % H = tf(1,[(1/omega_n^2) 2*zeta/omega_n 1]); % % Now write it out % set(handles.edit5,'String',num2str(omega_n,4)); set(handles.edit7,'String',num2str(zeta,4)); return; % %================================================================= % Make Log Decrement Figure %================================================================== % % --- Executes on button press in pushbutton3. function pushbutton3_Callback(hObject, eventdata, handles) global tIC yIC index low_peak high_peak omega_n zeta H peaks separation final_time encoder % if (peaks == 1) temp = yIC; data = temp - temp(end); % % find the positive peaks of the data % N = length(tIC); index = []; old_index = 0; for i=2:N-1 if((data(i)>=data(i-1)) & (data(i)>data(i+1)) & (i > old_index+separation)); index = [index i]; old_index = i; end; end; % % Plot the data with the identified inflection points % figure hold on plot(tIC,data); grid; xlabel('Time (sec)'); if ( encoder <= 3 ) ylabel('Displacement (cm)'); else ylabel('Displacement (degrees)'); end; for i=1:length(index) if (tIC(index(i)) < final_time ) text(tIC(index(i)),data(index(i)),num2str(i)); % the inflection point end; end; if (isempty(final_time) == 0) axis([0 final_time min(data) max(data)]); end; hold off title(['Log Decrement Analysis: Peak X_n = ' num2str(low_peak) ', Peak X_{n+N} = ' num2str(high_peak) ', \omega_n = ' num2str(omega_n,3) ' rad/sec, \zeta = ' num2str(zeta,3)]); else temp = -yIC; data = temp - temp(end); % % find the positive peaks of the data % N = length(tIC); index = []; old_index = 0; for i=2:N-1 if((data(i)>=data(i-1)) & (data(i)>data(i+1)) & (i > old_index+separation)); index = [index i]; old_index = i; end; end; % % Plot the data with the identified inflection points % figure; hold on plot(tIC,data); grid; xlabel('Time (sec)'); if (encoder <= 3 ) ylabel('Discplacement (cm)'); else ylabel('Displacement (degrees)'); end; for i=1:length(index) if (tIC(index(i)) < final_time) text(tIC(index(i)),data(index(i)),num2str(i)); % the inflection point end; end; if (isempty(final_time) == 0) axis([0 final_time min(data) max(data)]); end; hold off title(['Log Decrement Analysis: Peak X_n = ' num2str(low_peak) ', Peak X_{n+N} = ' num2str(high_peak) ', \omega_n = ' num2str(omega_n,3) ' rad/sec, \zeta = ' num2str(zeta,3)]); end; % return; function edit5_Callback(hObject, eventdata, handles) % hObject handle to edit5 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit5 as text % str2double(get(hObject,'String')) returns contents of edit5 as a double %========================================================================================== % --- Executes during object creation, after setting all properties. function edit1_CreateFcn(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc set(hObject,'BackgroundColor','white'); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end % --- Executes during object creation, after setting all properties. function edit3_CreateFcn(hObject, eventdata, handles) % hObject handle to edit3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc set(hObject,'BackgroundColor','white'); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end % --- Executes during object creation, after setting all properties. function edit4_CreateFcn(hObject, eventdata, handles) % hObject handle to edit4 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc set(hObject,'BackgroundColor','white'); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end % --- Executes during object creation, after setting all properties. function slider1_CreateFcn(hObject, eventdata, handles) % hObject handle to slider1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: slider controls usually have a light gray background, change % 'usewhitebg' to 0 to use default. See ISPC and COMPUTER. usewhitebg = 1; if usewhitebg set(hObject,'BackgroundColor',[.9 .9 .9]); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end % --- Executes during object creation, after setting all properties. function slider2_CreateFcn(hObject, eventdata, handles) % hObject handle to slider2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: slider controls usually have a light gray background, change % 'usewhitebg' to 0 to use default. See ISPC and COMPUTER. usewhitebg = 1; if usewhitebg set(hObject,'BackgroundColor',[.9 .9 .9]); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end % --- Executes during object creation, after setting all properties. function slider3_CreateFcn(hObject, eventdata, handles) % hObject handle to slider3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: slider controls usually have a light gray background, change % 'usewhitebg' to 0 to use default. See ISPC and COMPUTER. usewhitebg = 1; if usewhitebg set(hObject,'BackgroundColor',[.9 .9 .9]); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end % --- Executes during object creation, after setting all properties. function slider4_CreateFcn(hObject, eventdata, handles) % hObject handle to slider4 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % % Hint: slider controls usually have a light gray background, change % 'usewhitebg' to 0 to use default. See ISPC and COMPUTER. usewhitebg = 1; if usewhitebg set(hObject,'BackgroundColor',[.9 .9 .9]); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end % --- Executes during object creation, after setting all properties. function edit5_CreateFcn(hObject, eventdata, handles) % hObject handle to edit5 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc set(hObject,'BackgroundColor','white'); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end % --- Executes during object creation, after setting all properties. function edit7_CreateFcn(hObject, eventdata, handles) % hObject handle to edit7 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc set(hObject,'BackgroundColor','white'); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end function edit7_Callback(hObject, eventdata, handles) % hObject handle to edit7 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit7 as text % str2double(get(hObject,'String')) returns contents of edit7 as a double % --- Executes during object creation, after setting all properties. function edit2_CreateFcn(hObject, eventdata, handles) % hObject handle to edit2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc set(hObject,'BackgroundColor','white'); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end % --- Executes on button press in pushbutton8. function pushbutton8_Callback(hObject, eventdata, handles) % hObject handle to pushbutton8 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)