automatic control systemsprofsite.um.ac.ir/~karimpor/autocontrol/lec6_aut_con.pdfautomatic control...

36
AUTOMATIC CONTROL AUTOMATIC CONTROL SYSTEMS SYSTEMS Ali Karimpour Associate Professor Ferdowsi University of Mashhad Reference: Microcontroller Based Applied Digital Control Dogan Ibrahim, John Wiley & Sons Ltd, 2006

Upload: others

Post on 26-Jan-2021

12 views

Category:

Documents


0 download

TRANSCRIPT

  • 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

    }}