CDS 101: Principles of Feedback and Control

Lecture 9.1: PID and Root Locus

25 November 2002

Lecture Reading FAQ Homework CDS 101

Lecture

This lecture describes PID control, including the use of Ziegler-Nichols rules to design the gains. The root locus technique is introduced for determining the loop gain and the effect of pole location on performance is described in this context. Finally, some of the implications of right half plane zeros are discussed using the root locus plot.

Mud card responses [advanced search]:

#!/usr/bin/perl # -*- perl -*- # # htdbsearch.cgi - search for matching files in a database directory # RMM, 16 Mar 97 # # This CGI script searches the description files in a directory for a # against a set of criteria # # This script should be called as # # http://machine/path/htdblist.cgi? # or # http://machine/path/htdblist.cgi?db=&args # # where is the name of the configuration file that defines # all of the information needed to generate the listing. The optional # arguments are: # # _count=NN only list the first NN entries # _tight=1 use tight listing # _ssi=1 don't print header, trailer info (for includs) # # Include the necessary libraries require "cgi-lib.pl"; require "htdblib.pl"; # Parse script arguments if (&htdbinit) { # If the form contains some values, use them to search, and return # the results. if ($in{'_dbconfig'}) { # Generate the context header for the browser print &PrintHeader; # Print out the introductory information for search if (defined &SearchHeader) {&{$SearchHeader}($DBName);} # Summarize the search that was performed $rsltheader = defined &ResultHeader ? \&ResultHeader : htdb::ResultHeader; &{$rsltheader}(%in) if (!$in{_ssi}); # Go through and look for matching files if (not &PrintMatches) { &PrintNoMatches if (!in{ssi}); } # Generate the trailer if (defined &dbtrailer) {$dbtrailer = \&DBTrailer}; if (not $dbtrailer) {$dbtrailer = \&htdb::DBTrailer;} &{$dbtrailer}($DBName) if (!in{ssi}); } else { # Check to see if there is a user function for printing the search form if (defined &SearchForm) {$searchform = \&SearchForm}; if (not $searchform) {$searchform = \&htdb::SearchForm;} # Print out the introductory information for search if (defined &SearchHeader) {&{$SearchHeader}($DBName);} # Print the search form &{$searchform}(%in); } } # # Subroutine for printing the matches that occured # sub PrintMatches { my ($num_found); # Go to the database directory and read the contents chdir $DBPath || die "Can't cd to $DBPath"; opendir(DIR, '.') || die "Can't open $DBPath"; @filenames = readdir(DIR); closedir(DIR); # Check to see if there is a user function for checking matches if (defined &CheckEntry) {$checkentry = \&CheckEntry}; if (not $checkentry) {$checkentry = \&htdb::CheckEntry;} # Check to see if there is a user function for parsing filenames if (defined &ParseFname) {$parsefname = \&ParseFname}; if (not $parsefname) {$parsefname = \&htdb::ParseFname;} # Check to see if there is a user function for printing the entry if (defined &PrintEntry) {$printentry = \&PrintEntry}; if (not $printentry) {$printentry = \&htdb::PrintEntry;} # Check to see if there is a user function for printing the entry if (defined &TightEntry) {$tightentry = \&TightEntry}; if (not $tightentry) {$tightentry = \&htdb::TightEntry;} # Open the list environment used for the results # Print the command to generate a list of elements print ($in{_tight} ? "

\n" : "\n"); return $num_found; } # # Subroutine for alerting the user that no matches occured # sub PrintNoMatches { print "

No matches found

\n"; print "Sorry, no entries match your request. "; print "Please choose some different parameters and try again.

\n"; print $footer; }

Reading Material and Handouts

Handouts from lecture

The following materials were handed out in lecture. These have been updated to include any corrections.

Required reading

Supplemental reading

Homework

This homework set covers PID and root locus.

Modifications to the homework (link above is always the latest version):

Frequently asked questions on homework and TA hints:

#!/usr/bin/perl # -*- perl -*- # # htdbsearch.cgi - search for matching files in a database directory # RMM, 16 Mar 97 # # This CGI script searches the description files in a directory for a # against a set of criteria # # This script should be called as # # http://machine/path/htdblist.cgi? # or # http://machine/path/htdblist.cgi?db=&args # # where is the name of the configuration file that defines # all of the information needed to generate the listing. The optional # arguments are: # # _count=NN only list the first NN entries # _tight=1 use tight listing # _ssi=1 don't print header, trailer info (for includs) # # Include the necessary libraries require "cgi-lib.pl"; require "htdblib.pl"; # Parse script arguments if (&htdbinit) { # If the form contains some values, use them to search, and return # the results. if ($in{'_dbconfig'}) { # Generate the context header for the browser print &PrintHeader; # Print out the introductory information for search if (defined &SearchHeader) {&{$SearchHeader}($DBName);} # Summarize the search that was performed $rsltheader = defined &ResultHeader ? \&ResultHeader : htdb::ResultHeader; &{$rsltheader}(%in) if (!$in{_ssi}); # Go through and look for matching files if (not &PrintMatches) { &PrintNoMatches if (!in{ssi}); } # Generate the trailer if (defined &dbtrailer) {$dbtrailer = \&DBTrailer}; if (not $dbtrailer) {$dbtrailer = \&htdb::DBTrailer;} &{$dbtrailer}($DBName) if (!in{ssi}); } else { # Check to see if there is a user function for printing the search form if (defined &SearchForm) {$searchform = \&SearchForm}; if (not $searchform) {$searchform = \&htdb::SearchForm;} # Print out the introductory information for search if (defined &SearchHeader) {&{$SearchHeader}($DBName);} # Print the search form &{$searchform}(%in); } } # # Subroutine for printing the matches that occured # sub PrintMatches { my ($num_found); # Go to the database directory and read the contents chdir $DBPath || die "Can't cd to $DBPath"; opendir(DIR, '.') || die "Can't open $DBPath"; @filenames = readdir(DIR); closedir(DIR); # Check to see if there is a user function for checking matches if (defined &CheckEntry) {$checkentry = \&CheckEntry}; if (not $checkentry) {$checkentry = \&htdb::CheckEntry;} # Check to see if there is a user function for parsing filenames if (defined &ParseFname) {$parsefname = \&ParseFname}; if (not $parsefname) {$parsefname = \&htdb::ParseFname;} # Check to see if there is a user function for printing the entry if (defined &PrintEntry) {$printentry = \&PrintEntry}; if (not $printentry) {$printentry = \&htdb::PrintEntry;} # Check to see if there is a user function for printing the entry if (defined &TightEntry) {$tightentry = \&TightEntry}; if (not $tightentry) {$tightentry = \&htdb::TightEntry;} # Open the list environment used for the results # Print the command to generate a list of elements print ($in{_tight} ? "

\n" : "\n"); return $num_found; } # # Subroutine for alerting the user that no matches occured # sub PrintNoMatches { print "

No matches found

\n"; print "Sorry, no entries match your request. "; print "Please choose some different parameters and try again.

\n"; print $footer; }