#include void main(void) { //Variablen Deklaration long int i, istwert, sollwert, regeldifferenzalt, regeldifferenzneu, integrationssumme, kp, ki, kd, ausgang; WDTCTL = WDTPW | WDTHOLD; // Stopt Watchdogtimer //Konfiguriere Input/Output Einstellungen: P1DIR |= BIT6|BIT4; //Port 1,4,6,8 als Ausgang P1SEL = BIT1|BIT6; // Setzt P1.6 als Digitalen Output //Konfiguriere TimerA CCR0 = 1023; // PWM Periode, im CCR0 Register CCTL1 = OUTMOD_7; // Rreset/Set Modus auswählen CCR1 = 500; // PWM duty cycle im CCR1 Register, wird nur bis zum ersten Durchlauf verwendet TACTL = TASSEL_2 + MC_1; // SubMasterClock als Takt, Timer im Up mode //eint(); // Enabel den globalen Interrupt //Konfiguriere AD-Wandler Einstellungen in den Byte ADC10CTL0 & ADC10CTL1 /* ADC10ON = Schaltet AD-Wandler ein * REFON = Schaltet Referenzspannung ein * REF2_5V = Konfiguriert Referenzspannung auf 2.5V * SREF_1 = Konfiguriert Auswahl der Refernzspannung VR+ = VREF+ and VR- = AVSS * ADC10SHT_3 = Setzt Clockteiler für AD-Wandler * ENC = Erlaubt Wandlungen */ ADC10CTL0 = ADC10ON + REFON + REF2_5V + SREF_1 + ADC10SHT_3 + ENC; /* INCH1 = Gibt den analogen Eingangskanal an 1-8 * SHS_0 = Wählt den AD-Wandler als Wandler aus * ADC10DIV_0 = ADC10 Clock Divider auswahl 0 * ADC10SSEL_2 = Wählt MCLK als Clock aus * CONSEQ_0 = Einkanalwandlung als Auswahl gesetzt */ ADC10CTL1 = INCH_1 | SHS_0 | ADC10DIV_0 | ADC10SSEL_2 | CONSEQ_0; ADC10AE0 = BIT1; // Setzte analogen Eingang auf Kanal 1 //Reglereinstellungen sollwert = 410; istwert = 0; kp = 8; ki = 1; integrationssumme = 0; for(;;) { ADC10CTL0 |=ADC10SC; // Startet neue Wandlung while ((ADC10CTL1 & ADC10BUSY) == ADC10BUSY) { // Warten bist die neue Wandlung abgeschlossen ist if (ADC10MEM >= BIT9) // Is output in top half of range? { P1OUT = BIT6; // Ja: Schalte LED an } else { P1OUT = 0; // Nein: Schalte LED aus } } istwert = ADC10MEM; // Istwert = Wandelwert sollwert = 410; //Regelung regeldifferenzneu = istwert - sollwert; //Integration I-Anteil integrationssumme = integrationssumme + regeldifferenzneu; if (integrationssumme > 1023) integrationssumme=1023; // Begrenzung der Summe if (integrationssumme < -1023) integrationssumme=-1023; ausgang = kp * regeldifferenzneu; //+ ki * integrationssumme; //+ kd*regeldifferenzneu – regeldifferenzalt; regeldifferenzalt = regeldifferenzneu; if(ausgang > 1000) ausgang = 1000; // Begrenzung des Stellgliedes if(ausgang < 10) ausgang = 10; // Neues Duty Cycle in CCR1 Register schreiben CCR1 = ausgang; } }