Documente Academic
Documente Profesional
Documente Cultură
RAPORT
Chișinău 2020
Scopul lucrării:
Implementarea unui sistem ce ar compensa variatia unor conditii pastrind tensinea la iesire la un
nivel constant.
Sarcina lucrării:
Notiuni teoretice:
Anumite aplicații pot necesita utilizarea doar unul sau doi termeni pentru a asigura controlul adecvat
sistemului. Acest lucru se realizează prin stabilirea alți parametri la zero. Un controler PID va fi
numit PI, PD, P sau controler I în absența acțiunilor de control respective. controlere PI sunt destul
de frecvente, deoarece acțiunea derivat este sensibil la măsurarea nivelului de zgomot, în timp ce
lipsa unui termen integrale poate împiedica sistemul să atingă valoarea țintă.
Fișierul adc_decl.h:
#endif /* ADC_DECL_H_ */
Fișierul pwm_decl.h:
#include <avr/io.h>
#endif /* PWM_DECL_H_ */
Fișierul pid_decl.h:
#ifndef PID_DECL_H_
#define PID_DECL_H_
#define ERR_TAB_SIZE 5
Fișierul adc_def.c:
#include "adc_decl.h"
int input=0;
int AdcTab[8];
}
}
Fișierul main.c:
#include <avr/io.h>
#include "adc_decl.h"
#include "pwm_decl.h"
#include "pid_decl.h"
#include <avr/interrupt.h>
int main(void)
{
while(1);
}
ISR(TIMER1_OVF_vect)//subrutina de prelucrare a intreruperii de overflow a TIMER1
{
int temp;
int va;
int vd;
int vout;
va=adc_result(0); //preluarea valorii actuale
vd=adc_result(1);//preluarea valorii dorite
temp=adc_result(2);//setarea coeficientilor
set_kp(temp);
temp=adc_result(3);
set_kd(temp);
temp= adc_result(4);
set_ki(temp);
vout=pid_control(va,vd);
set_pwm(vout);//setarea factorului de umplere a semnalului PWM
}
void port_init()//functia de initializare a porturilor
{
DDRA=0x00;
PORTA=0xff;
DDRB=0x00;
PORTB=0xff;
DDRC=0x00;
PORTC=0xff;
DDRD=0b00100000;
PORTD=0b11011111;
}
Fișierul pwm_def.c:
#include "pwm_decl.h"
void pwm_init() //functia de configurare a modulului TIMER pentru crearea semnalului PWM
{
TCCR1A=(1<<COM1A1)|(0<<COM1A0)|(1<<COM1B1)|(0<<COM1B0)|(1<<WGM11)|(1<<WGM10);
TCCR1B=(1<<WGM12)|(0<<WGM13)|(1<<CS12)|(0<<CS11)|(1<<CS10);
TIMSK|=(1<<TOIE1);
}
Fișierul pid_def.c:
#include "pid_decl.h"
int pid_control(int va, int vd)//functia de calculare a valorii de iesire
{
int e;
static int vapr;
static int ErrTab[ERR_TAB_SIZE];
static int errpos;
int vp;
int vi;
int vo;
e=vd-va;//calculul erorii
vp=kp*e;
vd=kd*(va-vapr);
vapr=va;
if (errpos++>ERR_TAB_SIZE)//verificarea pozitiei si introducerea valorii in tabelul
errpos=0; //cu valorile precedente ale erorii
ErrTab[errpos]=e;
vi=ki*(ErrTab[0]+ErrTab[1]+ErrTab[2]+ErrTab[3]+ErrTab[4]+ErrTab[5]);
vo=vp+vd+vi; //calculul valorii pentru setare a factorului de umplere a PWM
return vo;
}
void set_kp(int k){
kp=k;
}
void set_kd(int k){
kd=k;
}
void set_ki(int k){
ki=k;
}
4. A fost creată schema electrică în ISIS Proteus și a fost simulată verificîndu-se astfel
corectitudinea programului.
Efectuând această lucrare de laborator am reușit să înțeleg modul de lucru cu PID cît și
configurarea acestuia.
Am observat că pentru ca sistemul să funcționeze corect trebuie să ținem cont de frecvențele
modulului ADC și a modulului TIMER ce generează semnalul PWM.
De asemenea este nevoie de ales corect coeficienții pentru recepționarea unui răspuns
adecvat la inducerea unor factori perturbatori.