5.Unterprogramme(adc_init, adc)
6.UnterprogrammeCode:float prozent_wert; //Prozent wert nach ADC //unsigned char kanal; //Variable wird bei der Funktion adc(kanal) übergeben //_______________________________________initialisieren der ADC Register____________________________________________ void adc_init(void) { ADMUX=0x00; //Den AusgangsPin 0 zum vergleichen festgelegt, Vref ist turned off ADCSRA=(1<<ADEN); //ADC Enablen ADCSRA|=(1<<ADPS2)|(1<<ADPS1); //Prescaler Quotient festgelgt: 64, damit die Frequenz: 125kHz ist SFIOR=0x00; //für den Free Running Mode(die ersten 3 Bits =0), die anderen brauchen wir nicht } //__________________________________________________________________________________________________________________ //__________________________________________Free Running Mode_______________________________________________________ float adc (unsigned char kanal) { long int x; ADMUX |= kanal; //Zum einstellen des Kanals(Vergleichs Pin an der Platine) ADCSRA|=(1<<ADSC); //Vergleich starten while(ADCSRA&(1<<ADSC)) //Warten bis der Vergleich zu Ende ist, dann wird das ADSC wieder auf "0" gesetzt ; x=ADCL+ADCH*256; //Den wert des Hight und Low Registers in einer Variable zusammengefügt //return(x); //Herauslesen der beiden Register, ADCH*256 weil man ja schon 8 Bits belegt hat //:4 weil man sonst 1024 als höchsten Wert hat, man möchte es aber auf die //8 Leds ausgeben, deshalb 1024/4= 256(jetzt nicht mehr dabei, weil wir ja eine //10 Bit Auflösung haben wollen!!! prozent_wert=(x*100)/1024; //prozent_sollwert/100= x/1024--> damit habe ich einfach die Prozent ausgerechnet return(prozent_wert); } //__________________________________________________________________________________________________________________senden, receive, uart_init)
7.UnterprogrammeCode:#include "funktion.h" //Header für meine eigen angelegten Funktionen //_____________________________________Baudrate Berechnung____________________________________________________________________ #define F_CPU 8000000 //CPu mit einen 8Mhz Taktfrequenz definiert #define UART_BAUD_RATE 19200 // Baud Rate wie bei Serieller mit 9600 festgelegt //____________________________________________________________________________________________________________________________ //Variabeln unsigned char j; //___________________________________________Initialiseren der UART Register__________________________________________________ void uart_init(void) { UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); /*USART settings: Parity=disable(das wäre mit Bit UPM1:0=0), character size=8Bit(Mit UCSZ1:0)*/ UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE); /*Transmitter enabled(TXEN) (zum Senden an den PC) und TRansmitter Data bit 8gesetzt ist (TXB8)*/ /*Receiver enabled(RXEN) (zu empfangen vom PC) und Receiver Data Bit 8 gesetzt ist (RXB8)*/ //RXCIE Interrupt Enable UBRRL=F_CPU/(UART_BAUD_RATE*16L)-1; //Formel zum Berechnen der UART Bade Rate Register (Baudrate =51) //UBRRH=0; } //____________________________________________________________________________________________________________________________ //______________________________________________________________________________________________________________________________ void receive(void) { pc_daten[j]=UDR; if(pc_daten[j-1]=='y') //Wenn bei den Abgespeicherten Daten ein 'y' schon vorhanden ist, { //ist die übertragung beendet, und die Variable uebert_beendet=1 gesetzt uebert_beendet=1; //und die For Schleife wird verlassen if(pc_daten[j-2]=='b'&&pc_daten[j-3]=='x') { start_brenn=1; } if(pc_daten[j-2]=='a'&&pc_daten[j-3]=='x') { zeit_abfrage=1; } } if(j>=60) j=0; if(uebert_beendet==1) j=0; else j++; } //___________________________________________Programm von senden()____________________________________________________________ void senden(char sende_string_pc[]) { for(unsigned char i=0;i<=20;i++) { while(!(UCSRA&(1<<UDRE))) //zuerst muss ich warten bis das Daten Register leer ist, damit ich nichts überschreibe ; if(sende_string_pc[i]=='\0') break; UDR=sende_string_pc[i]; //dann überschreibe ich ins Daten Register die zu sendenden Daten while(!(UCSRA&(1<<TXC))) //dann warte ich wieder bis die Sendung komplett ist ; } //return; //Kein Rückgabe Wert } //____________________________________________________________________________________________________________________________timer8_init)
8.Unterprogramme(regler_funct)Code:#include "funktion.h" //Header für meine eigen angelegten Funktionen //_______________________________________initialisieren des 8 Bit Timer Registers____________________________________________ void timer8_init(void) { TCCR0=(1<<CS02)|(1<<CS00); //Takt: Im Timer ControlRegister den Takt für den Prescaler festlegen //wenn CS02&CS00=1 dann Oszillator Frequ./1024=7812,5 //7812,5/256=30,51 t=1/30,51 TIMSK=(1<<TOIE0); //Interrupt Enable } //___________________________________________________________________________________________________________________________
Es ist jetzt vor allem das Problem, dass das PWM nicht mehr geht!!!!Code:#include "funktion.h" float prozent_istwert; //Nach ADC wandlung, auf Prozent*100 umgerechnet, Das ist der Istwert des Reglers float prozent_sollwert; //Nach ADC wandlung, auf Prozent*100 umgerechnet, Das ist der Sollwert des Reglers float kp; //die Reglerverstärkung float tn; //die Nachstellzeit, für I-Anteil int regler_funct (float istwert, float sollwert, float kp, float tn) { int hilf; float xd_k,xd_k1,ta; float y_k,y_k1; float b0, b1; int a0, a1; ta=1; //angenommene Abtastzeit (wird bei uns später die Timer Zeit sein) xd_k=0; //xd_k beim ersten Durchlauf auf 0 setzen, wird später berechnet y_k1=0; a0=1; a1=-1; b0=kp*(1+ta/(2*tn)); b1=kp*(-1+ta/(2*tn)); //a0,b0,a1,b1 sind die Koeffizienten für einen PI Regler Algorithmus xd_k1=xd_k; //xd_k1 ist die Differenze von Sollwert und Istwert vom letzten Durchlauf xd_k=sollwert-istwert; //xd_k ist die derzeitige Differenz von Sollwert und IStwert y_k1=y_k; //y_k1 ist der Stellwert vom letzten Durchlauf y_k=(b0*xd_k+b1*xd_k1-a1*y_k1)/a0; //Das ist die Formel für einen PI-Regel Algorithmus if(istwert<=sollwert) PORTC=0xFF; else PORTC=0x11; if(y_k<0) //Wenn bei der Berechnung eine kleinere Stellgröße raus kommt als 0 { //dann soll die Stellgröße 0 sein y_k=0; } if(y_k>100) //Wenn bei der Berechnung eine größere Stellgröße raus kommt als 100 { //dann soll die Stellgröße 0 sein y_k=100; } /* werte_schicken(y_k); senden(sende_string); sende_string[0]='\0'; */ //y_k=50; hilf=((y_k*1024.0)/100.0); //Umrechnung von im Verhältnis von Prozent auf die 10 Bit //prozent_istwert=hilf; //hilf=512; return(hilf); }





Zitieren

Lesezeichen