#include // Header file for this device #include // Intrinsic functions #define LED = BIT6 // Output bit for LED void wait (long int pwmpause); void main (void) { long int i, istwert, sollwert, regeldifferenzalt, regeldifferenzneu, integrationssumme, kp, ki, kd, ausgang; WDTCTL = WDTPW | WDTHOLD; // Stop watchdog P1SEL = 0; // Digital i/o rather than crystal P1OUT = 0; P1DIR = BIT6|BIT7|BIT4|BIT0; ADC10CTL0 = ADC10ON + REFON + REF2_5V + SREF_1 + ADC10SHT_3; //ADC10CTL0 = ADC10SHT_2 | ADC10ON | REFON | REF2_5V; // Input channel 1, trigger using ADC10SC bit , no clock division , // internal ADC clock , single channel single conversions ADC10CTL1 = INCH_1 | SHS_0 | ADC10DIV_0 | ADC10SSEL_0 | CONSEQ_0; ADC10AE0 = BIT1; // Enable analog input on channel 1 ADC10CTL0 |= ENC; // Enable conversions sollwert = 41; istwert=0; kp = 8; ki = 1; integrationssumme = 0; for(;;) { ADC10CTL0 |=ADC10SC; // Trigger new conversion while ((ADC10CTL1 & ADC10BUSY) == ADC10BUSY) { // Loop while conversion takes place if (ADC10MEM >= BIT9) // Is output in top half of range? { P1OUT = BIT6; // Yes: Turn LED on } else { P1OUT = 0; // No: Turn LED off } } istwert = ADC10MEM / 10; sollwert = 41; regeldifferenzneu = istwert - sollwert; //Vergleich integrationssumme = integrationssumme + regeldifferenzneu; //Integration I-Anteil ausgang = kp * regeldifferenzneu + ki * integrationssumme; //+ kd*regeldifferenzneu – regeldifferenzalt; //Reglergleichung regeldifferenzalt = regeldifferenzneu; if(ausgang > 101) ausgang = 102; if(ausgang < 2) ausgang = 1; // PWM ausgeben P1OUT = ~BIT4; wait(103-ausgang); P1OUT = BIT4; wait(ausgang); } } void wait (long int pwmpause) { do { pwmpause--; } while (pwmpause != 0); }