Hallo Zusammen,
ich komme wieder nach ein paar Tage, ich habe mein Program noch mal
bearbeiten und kann separat ein spannungsregler laufen lassen, nur dass
die Optimierung fehlt. jetzt wollte ich weiter mit der kaskadierung
anfangen und wie folg
__irq void IRQ_Handler(void) // Interrupt alle 100µs
{
if((IRQSTA & RTOS_TIMER_BIT) !=0) // Frage nach der Quelle des
Interrupts
{
ADCCON = 0x6A0; // single-ended Mode, start konv.
ADCCP=0; // Auswahl kanal 0 für ist-strom
ADCCON = 0x6A3;
while (!ADCSTA){}; // warten bie Ende der Wandlung
x1_value = (ADCDAT >> 16); // Ergebnis der Wandlung in Variable
ADCCON = 0x6A0;
ADCCP=1; soll_strom
ADCCON = 0x6A3;
while (!ADCSTA){};
w1_value = (ADCDAT >> 16);
--- kanal2 ist_spannung
---- kanal3 soll_spannung
if(x1_value >= w1_value){
stellglied=PI_Berechnung(x1_value, w1_value); // Aufrufe PI
routine für strom regler
DAC1DAT=(stellglied << 16 ) ; // Ausgabe
}
flag++; // curent Tick value Timer0
IRQEN = RTOS_TIMER_BIT; // Timer0-Interrupt Aktivieren
}
Return
}
************************************************************************
Main()
{
init uart
init ADC
init timet
enable timer-interrupt
while(1)
{
while(!(flag++==10));
flag++=0;
PID_Sapnnung(x_u, w_u)
sprintf(array,"x=%d ",x1_value);
write(0,array);
----
----
sprintf(array,"w=%d ",w1_value);
write(0,array);
}
********************************************************************+
int PI_strom( int x_i, int w_i)
{
x_i_normiert= (x_i1 << 3); // Normierter Istwert w_i_normiert=
(w_i1 << 3); // Normierter sollwert
e_i_normiert=x_i_normiert-w_i_normiert;// Regelabweichung
e_i= e_i_normiert/8;
esum_i_normiert=esum_i_normiert + e_i_normiert; // normierte Summe
der Regelabweichung
// Begrenzung Anti windup ??
temp1=(kp << 3) * e_i_normiert; // fixed point mit 3 Nachkoma
temp1=temp1+(1<<(n-1));
temp1=temp1/8;
if (temp1 > Max){
yp_i_normiert=Max;}
else if(temp1 < Min){
yp_i_normiert=Min;}
else
yp_i_normiert=temp1/8;
temp2=( (303 << 3) *(esum_i_normiert)); // ki*ta*10000=303
temp2=temp2 + (1<<(n-1));
temp2=temp2/8;
if (temp2 > Max){
yi_i_normiert=Max;}
else if(temp2 < Min){
yi_i_normiert=Min;}
else
yi_i_normiert=temp2/8;
y_i_normiert= (yp_i_normiert/1000 + yi_i_normiert/10000);
y_i=y_i_normiert/8 ; Stellglied der Regler
if(y_i<2978){
y_i=2978;
}
else
if(y_i>3276){
y_i=3276;
}
return y_i; }
die routine für Spannung allein funktioniert und jetzt will ich die
beide kaskadieren wie die analoge schaltung funktioniert.
die stromregler ist schneller ist im prinzip ein strombrgrenzung und
die PI_strom start nur wenn die x_i den w_i erreicht oder über ist.
und wenn der Fall kommt dann schaltet die PID_spannung ab. und pi_strom
ist aktiv.
deswegen denke ich an einem Timer-interrupt, das alle 100µ kommt. die
werte werden dann gelesen und einem Vergleich zwischen x_i und w_i wird
gemacht. wenn x_i >>= w_i ist , dann aufrufe von PI_strom und stellglied
im DAC zuweisen und der flag inkrementieren. im main flag wird gefrag.
wenn flag 10 erreicht hat, sind jetzt 10* 100µs d.h 1ms gelaufen ,dann
rufe von PID_spannung.
das konzept ist schon ok?
wenn ja, wie und wo genau soll ich das Interrupt sperren und freigeben.
ich will auch werte ausgeben, vor allem wo,dies möglich ist. beim test
von PI_routine habe einige werte mit der Funktion unten am Hyper
Terminal geschickt. Aber dies kostet viel Zeit.
kann man anders und einfacher mit weniger zeitkosten werten am HP
schicken? und wie? ich will zb solche anzeige yp=222
yi=xxxx,yyy ich arbeite mit fixed point number
int putchar(int ch) { /* Write character to Serial
Port */
if (ch == '\n') {
while(!(0x020==(COMSTA0 & 0x020)))
{}
COMTX = CR; /* output CR */
}
while(!(0x020==(COMSTA0 & 0x020)))
{}
return (COMTX = ch);
}
void write (int file, char * ptr ) {
//int i;
// for (i = 0; i < len; i++)
while(!(*ptr == 0))
putchar (*ptr++);
//return len;
}
bitte alle zu gucken und idee geben.
Grüß
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.