AUTOMATIC CONTROLAUTOMATIC CONTROLSYSTEMSSYSTEMS
Ali KarimpourAssociate Professor
Ferdowsi University of Mashhad
Reference: Microcontroller Based Applied Digital ControlDogan Ibrahim, John Wiley & Sons Ltd, 2006
Lecture 6
Ali Karimpour Apr 2013
2
Lecture 6
Topics to be covered include:
Design of a sample controller in time domain.
Liquid Level Digital Control System:A Case Study
Lecture 6
Ali Karimpour Apr 2013
A typical liquid level control system
3
Lecture 6
Ali Karimpour Apr 2013
A typical liquid level control system (Schematic of the system)
4
Lecture 6
Ali Karimpour Apr 2013
System Model
5
Lecture 6
Ali Karimpour Apr 2013
66
Series Compensation Structureجبران سازي سري
Ziegler-Nichols Design for PID Controller
This procedure is only valid for open loop stable plants. Open-Loop Tuning
Closed-Loop Tuning
According to Ziegler and Nichols, the open-loop transfer function of a system can be approximated with time delay and single-order system, i.e.
Lecture 6
Ali Karimpour Apr 2013
7
Ziegler-Nichols Open-Loop Case
For open-loop tuning, we first find the plant parameters by applying a step input to the open-loop system.
The plant parameters K, TD and T1 are then found from the result of the step test as shown in Figure.
طراحی زیگلر نیکولز حالت حلقه باز
Lecture 6
Ali Karimpour Apr 2013
Identification of System Model
8
200
5*200/256=3.906 v
2.5*3.906=9.76 v
Lecture 6
Ali Karimpour Apr 2013
Microcontroller program to send a step to D/A
9
For program the Microcontroller we just need to:
1- Define PORTB as 200.
2- Enable DAC
3- Disable DAC
That’s all
Lecture 6
Ali Karimpour Apr 2013
Identification of System Model
10G(s) is transfer function of tank+amplifier
Lecture 6
Ali Karimpour Apr 2013
Controller Design and Implementation
11
Controller Implementation
sKK
sesusD ip )()()( )()()( seKsseKssu ip )(
)()( teKdttdeK
dttdu
ip
)()()()()( teKT
TteteKT
Ttutuip
)()()()()( TteKteTKKTtutu pip
)()()()()( 11 tezKteTKKtuztu pip 11)(
)()(
zTKK
zezuzD ip
Lecture 6
Ali Karimpour Apr 2013
1212
Series Compensation Structureجبران سازي سري
Continues block diagram
Digital block diagram +z.o.h.
Lecture 6
Ali Karimpour Apr 2013
Sampling period
13
First of all we need sampling period
Digital block diagram +z.o.h.
Time constant is 31 so we must consider T
Lecture 6
Ali Karimpour Apr 2013
System
14
Lecture 6
Ali Karimpour Apr 2013
15
Complete system
Lecture 6
Ali Karimpour Apr 2013
16
Lecture 6
Ali Karimpour Apr 2013
Microcontroller program to implement the controller
17
Chip selection Code WizardAVRProject information Code WizardAVRPort configuration Code WizardAVRExternal interrupts Code WizardAVRLCD configuration Code WizardAVRADC configuration Code WizardAVRTimers configuration Code WizardAVRMain program By yourselfController output calculation By yourself
Lecture 6
Ali Karimpour Apr 2013
Chip selection
18
Chip selection Code WizardAVR Tools Code WizardAVR
Lecture 6
Ali Karimpour Apr 2013
Project information
19
/*****************************************************This program was produced by theCodeWizardAVR V2.05.0 EvaluationAutomatic Program Generator© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.http://www.hpinfotech.com
Project : Level ControlVersion : 1Date : 2012/12/27Author : KarimpourCompany : Ferdowsi University of MashhadComments: This is a simple example for class.
Chip type : ATmega16Program type : ApplicationAVR Core Clock frequency: 4.000000 MHzMemory model : SmallExternal RAM size : 0Data Stack size : 256*****************************************************/#include
Lecture 6
Ali Karimpour Apr 2013
Port configuration
20
Lecture 6
Ali Karimpour Apr 2013
21
void main(void)}// Input/Output Ports initialization// Port A initialization// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00;DDRA=0x00;
// Port B initialization// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTB=0x00;DDRB=0xFF;
// Port C initialization// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=0 PORTC=0x00;DDRC=0x01;
// Port D initialization// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00;DDRD=0x00;}
Port configuration
Lecture 6
Ali Karimpour Apr 2013
External interrupt configuration
22
// External Interrupt 0 service routineinterrupt [EXT_INT0] void ext_int0_isr(void){// Place your code here}
// External Interrupt 1 service routineinterrupt [EXT_INT1] void ext_int1_isr(void){// Place your code here}
void main(void){……..// External Interrupt(s) initialization// INT0: On// INT0 Mode: Low level// INT1: On// INT1 Mode: Low level// INT2: OffGICR|=0xC0;MCUCR=0x00;MCUCSR=0x00;GIFR=0xC0;
// Global enable interrupts#asm("sei“)}
Lecture 6
Ali Karimpour Apr 2013
LCD configuration
23
// Alphanumeric LCD Module functions#include
void main(void){……..// Alphanumeric LCD initialization// Connections specified in the// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:// RS - PORTC Bit 1// RD - PORTC Bit 2// EN - PORTC Bit 3// D4 - PORTC Bit 4// D5 - PORTC Bit 5// D6 - PORTC Bit 6// D7 - PORTC Bit 7// Characters/line: 16lcd_init(16);
while (1){// Place your code here}
}
Lecture 6
Ali Karimpour Apr 2013
ADC configuration
24
#include
#define ADC_VREF_TYPE 0x40
// Read the AD conversion resultunsigned char read_adc(unsigned char adc_input){ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);// Delay needed for the stabilization of the ADC input voltagedelay_us(10);// Start the AD conversionADCSRA|=0x40;// Wait for the AD conversion to completewhile ((ADCSRA & 0x10)==0);ADCSRA|=0x10;return ADCH;}
void main(void){........// ADC initialization// ADC Clock frequency: 125.000 kHz// ADC Voltage Reference: AVCC pin// ADC Auto Trigger Source: Free RunningADMUX=ADC_VREF_TYPE & 0xff;ADCSRA=0xA5;SFIOR&=0x1F;while (1)
{// Place your code here}
}
Lecture 6
Ali Karimpour Apr 2013
Timers configuration
25
// Timer 0 overflow interrupt service routineinterrupt [TIM0_OVF] void timer0_ovf_isr(void){// Place your code here}
void main(void){// Timer/Counter 0 initialization// Clock source: System Clock// Clock value: 15.625 kHz// Mode: Normal top=0xFF// OC0 output: DisconnectedTCCR0=0x04;TCNT0=0x00;OCR0=0x00;
// Timer(s)/Counter(s) Interrupt(s) initializationTIMSK=0x01;
// Global enable interrupts#asm("sei")}
Lecture 6
Ali Karimpour Apr 2013
Total Program from CodeWizardAVR
26
#include
#include
#include
interrupt [EXT_INT0] void ext_int0_isr(void){// Place your code here}
interrupt [EXT_INT1] void ext_int1_isr(void){// Place your code here}
// Timer 0 overflow interrupt service routineinterrupt [TIM0_OVF] void timer0_ovf_isr(void){// Place your code here}
#define ADC_VREF_TYPE 0x40
unsigned int read_adc(unsigned char adc_input){ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);delay_us(10);ADCSRA|=0x40;while ((ADCSRA & 0x10)==0);ADCSRA|=0x10;return ADCW;}
Lecture 6
Ali Karimpour Apr 2013
Total Program from CodeWizardAVR
27
void main(void){// Declare your local variables herePORTA=0x00;DDRA=0x00;
PORTB=0x00;DDRB=0xFF;
PORTC=0x00;DDRC=0x01;
PORTD=0x00;DDRD=0x00;
TCCR0=0x04;TCNT0=0x00;OCR0=0x00;
TCCR1A=0x00;TCCR1B=0x00;TCNT1H=0x00;TCNT1L=0x00;ICR1H=0x00;ICR1L=0x00;OCR1AH=0x00;OCR1AL=0x00;OCR1BH=0x00;OCR1BL=0x00;
ASSR=0x00;TCCR2=0x00;
TCNT2=0x00;OCR2=0x00;
GICR|=0xC0;MCUCR=0x00;MCUCSR=0x00;GIFR=0xC0;
TIMSK=0x01;
UCSRB=0x00;
ACSR=0x80;SFIOR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff;ADCSRA=0xA5;SFIOR&=0x1F;
SPCR=0x00;
TWCR=0x00;
lcd_init(16);
// Global enable interrupts#asm("sei")
while (1){// Place your code here}}
Lecture 6
Ali Karimpour Apr 2013
Setting Timer
28
Ts=0.1
Timer counts 256 cycle.
Clock of timer is 15625 Hz.
Every 156 counts = 0.01 Sec.
So 10 times of counter = 0.1 Sec.
So 256-100=156.
Start of timer is 100 or 0x64 (in hex)
// Timer 0 overflow interrupt service routineinterrupt [TIM0_OVF] void timer0_ovf_isr(void){// Place your code here}
void main(void){// Timer/Counter 0 initialization// Clock source: System Clock// Clock value: 15.625 kHz// Mode: Normal top=0xFF// OC0 output: DisconnectedTCCR0=0x04;
TCNT0=0x00;
OCR0=0x00;
// Timer(s)/Counter(s) Interrupt(s) initializationTIMSK=0x01;
// Global enable interrupts#asm("sei")}
TCNT0=0x64;
// Reinitialize Timer 0 valueTCNT0=0x64;time_set++;if (time_set ==10){time_set = 0;// Controller update must be here}
// Reinitialize Timer 0 valueTCNT0=0x64;time_set++;if (time_set ==10){time_set = 0;yk = read_adc(0);yk = yk *5000 / 1024; // convert ADC
ek=(ref-yk);uk = pk_1+(kp+ki*ti)* ek;uk = uk * 256/5000 ;
if (uk >255)uk_im = 255;else uk_im = (unsigned char )uk ;
PORTB = uk_im ;PORTC.0 = 1 ; // write to D/A converterPORTC.0 = 0 ;pk_1 = uk-kp*ek ;}
)()()()()( teTKKTteKTtutu ipp
Lecture 6
Ali Karimpour Apr 2013
External interrupt program
29
// External Interrupt 0 service routineinterrupt [EXT_INT0] void ext_int0_isr(void){// Place your code here
}
// External Interrupt 1 service routineinterrupt [EXT_INT1] void ext_int1_isr(void){// Place your code here
}
ref++;itoa(ref,ch);lcd_clear();lcd_puts(ch);}
ref--;itoa(ref,ch);lcd_clear();lcd_puts(ch);}
Lecture 6
Ali Karimpour Apr 2013
Parameter Definition and Initial Values
30
#include unsigned int time_set = 0;int ref= 2280;float kp , ki , pk_1 ,ek ,yk , uk, T;unsigned char uk_im ; char ch[20];
….kp =279.0;T= 0.1 ;ki=42.3;pk_1 = 0;PORTC.0 = 0 ; // disable write D/Aitoa(ref,ch);lcd_puts(ch);while (1)
{// Place your code here}
Lecture 6
Ali Karimpour Apr 2013
Total Program of System
31
/*****************************************************This program was produced by theCodeWizardAVR V2.05.0 EvaluationAutomatic Program Generator© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.http://www.hpinfotech.com
Project : Level ControlVersion : 1Date : 2012/12/30Author : Freeware, for evaluation and non-commercial use onlyCompany : Ferdowsi University of MashhadComments: This is a simple example for lecture#16.
Chip type : ATmega16Program type : ApplicationAVR Core Clock frequency: 4.000000 MHzMemory model : SmallExternal RAM size : 0Data Stack size : 256*****************************************************/
Lecture 6
Ali Karimpour Apr 2013
Total Program of System
32
#include #include #include #include
unsigned int time_set = 0;int ref= 2280;float kp , ki , pk_1 ,ek ,yk , uk, T;unsigned char uk_im ; char ch[20];// Alphanumeric LCD Module functions
#define ADC_VREF_TYPE 0x40// Read the AD conversion resultunsigned int read_adc(unsigned char adc_input){ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);// Delay needed for the stabilization of the ADC input voltagedelay_us(10);// Start the AD conversionADCSRA|=0x40;// Wait for the AD conversion to completewhile ((ADCSRA & 0x10)==0);ADCSRA|=0x10;return ADCW;}
Lecture 6
Ali Karimpour Apr 2013
Total Program of System
33
// External Interrupt 0 service routineinterrupt [EXT_INT0] void ext_int0_isr(void){// Place your code hereref--;itoa(ref,ch);lcd_clear();lcd_puts(ch);}
// External Interrupt 1 service routineinterrupt [EXT_INT1] void ext_int1_isr(void){// Place your code hereref++;itoa(ref,ch);lcd_clear();lcd_puts(ch);}
// Timer 0 overflow interrupt service routineinterrupt [TIM0_OVF] void timer0_ovf_isr(void){// Reinitialize Timer 0 valueTCNT0=0x64;time_set++;if (time_set ==10){time_set = 0;yk = read_adc(0);yk = yk *5000 / 1024; // convert ADC
ek=(ref-yk);uk = pk_1+(kp+ki*T)* ek;uk = uk * 256/5000 ;
if (uk >255)uk_im = 255;else uk_im = (unsigned char )uk ;
PORTB = uk_im ;PORTC.0 = 1 ; // write to D/A converterPORTC.0 = 0 ;pk_1 = uk-kp*ek ;}}
Lecture 6
Ali Karimpour Apr 2013
34
void main(void){// Input/Output Ports initialization// Port A initialization// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00;DDRA=0x00;
// Port B initialization// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTB=0x00;DDRB=0xFF;
// Port C initialization// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=0 PORTC=0x00;DDRC=0x01;
// Port D initialization// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00;DDRD=0x00;
Total Program of System
Lecture 6
Ali Karimpour Apr 2013
Total Program of System
35
// Timer/Counter 0 initialization// Clock source: System Clock// Clock value: 15.625 kHz// Mode: Normal top=0xFF// OC0 output: DisconnectedTCCR0=0x04;TCNT0=0x00;OCR0=0x00;
// External Interrupt(s) initialization// INT0: On// INT0 Mode: Low level// INT1: On// INT1 Mode: Low level// INT2: OffGICR|=0xC0;MCUCR=0x00;MCUCSR=0x00;GIFR=0xC0;
// Timer(s)/Counter(s) Interrupt(s) initializationTIMSK=0x01;
// ADC initialization// ADC Clock frequency: 125.000 kHz// ADC Voltage Reference: AVCC pin// ADC Auto Trigger Source: Free RunningADMUX=ADC_VREF_TYPE & 0xff;ADCSRA=0xA5;SFIOR&=0x1F;
// Alphanumeric LCD initialization// Connections specified in the// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:// RS - PORTC Bit 1// RD - PORTC Bit 2// EN - PORTC Bit 3// D4 - PORTC Bit 4// D5 - PORTC Bit 5// D6 - PORTC Bit 6// D7 - PORTC Bit 7// Characters/line: 16lcd_init(16);
Lecture 6
Ali Karimpour Apr 2013
Total Program of System
36
// Global enable interrupts#asm("sei")kp =279.0;T= 0.1 ;ki=42.3;pk_1 = 0;PORTC.0 = 0 ; // disable write D/Aitoa(ref,ch);lcd_puts(ch);while (1)
{// Place your code here
}}