5.Unterprogramme(adc_init, adc)
Code:
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);
}
//__________________________________________________________________________________________________________________
6.Unterprogramme
senden, receive, uart_init)
Code:
#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
}
//____________________________________________________________________________________________________________________________
7.Unterprogramme
timer8_init)
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
}
//___________________________________________________________________________________________________________________________
8.Unterprogramme(regler_funct)
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);
}
Es ist jetzt vor allem das Problem, dass das PWM nicht mehr geht!!!!
Lesezeichen