1 | //******************
|
2 | //******************
|
3 | //***Tariersystem***
|
4 | //******************
|
5 | //******************
|
6 |
|
7 | #include "MAIN.H"
|
8 | #include <stdio.h>
|
9 | #include <math.h>
|
10 |
|
11 | void MAIN_vInit(void)
|
12 | {
|
13 |
|
14 | /// Initialization of module 'GPIO'
|
15 | IO_vInit();
|
16 |
|
17 | /// Initialization of module 'UART (Serial Interface)'
|
18 | UART_vInit();
|
19 |
|
20 | /// Initialization of module "ADC"
|
21 | ADC_vInit();
|
22 |
|
23 | //Timer 2 Initialisieren
|
24 | T2_vInit();
|
25 |
|
26 | // Interrupt Priority
|
27 | IP = 0x20; // load Interrupt Priority Register
|
28 | // Priorität von T2
|
29 | IPH = 0x20; // load Interrupt Priority High Register
|
30 | // höher als von UART
|
31 | IP1 = 0x00; // load Interrupt Priority 1 Register
|
32 | IPH1 = 0x00; // load Interrupt Priority 1 High Register
|
33 |
|
34 | EA = 1; //Interupt einschalten
|
35 | ET2 = 1;
|
36 | ES = 1;
|
37 | }
|
38 |
|
39 | //**************************
|
40 | //***Variablen definieren***
|
41 | //**************************
|
42 |
|
43 | float winkel;
|
44 | float winkel_print;
|
45 | float winkel_alt;
|
46 | //float result;
|
47 | float x ;
|
48 | float y ;
|
49 | float esum ;
|
50 | float Ausgabe_Stellgroesse ;
|
51 | //float Kp;
|
52 | float e;
|
53 | //float Ki;
|
54 | float Ta;
|
55 | float w;
|
56 |
|
57 | //int i;
|
58 | unsigned int Reload_Wert;
|
59 | //unsigned int Frequenz;
|
60 | unsigned int xx;
|
61 |
|
62 | //int ww;
|
63 | int result;
|
64 | int Kp;
|
65 | int Ki;
|
66 | int Frequenz;
|
67 | int Ua;
|
68 | char print_zaehler;
|
69 | char Empfangen;
|
70 | //Empfangen = 0;
|
71 | //char print_versuch = 22;
|
72 |
|
73 | //*******************
|
74 | //***Hauptprogramm***
|
75 | //*******************
|
76 |
|
77 | void main(void)
|
78 | {
|
79 | // unsigned int i;
|
80 |
|
81 | MAIN_vInit();
|
82 | TR2 = 1;
|
83 |
|
84 | // Senden ermöglichen
|
85 | TI = 1;
|
86 |
|
87 | // Empfangen ermöglichen
|
88 | // RI = 1; ### Eben nicht. Diese Stelle ist auskommentiert... ###
|
89 |
|
90 | //***AD-Wandler***
|
91 | while(1)
|
92 | {
|
93 | ADC_PAGE = 0x06;
|
94 | ADC_CRCR1 |= 0x40; // write channel information to be converted
|
95 | ADC_CRMR1 |= 0x40; // generate load event
|
96 | while(ADC_bBusy())
|
97 | ; // warten bis Wandlung komplett
|
98 | ADC_PAGE = 0x02;
|
99 | {
|
100 | result = ADC_RESR2H; // Das 8-Bit resultat wird gelesen
|
101 | }
|
102 | PORT_PAGE = 0x00;
|
103 | P3_DATA = result; // Port3 als Visualisierungsausgang benützen
|
104 |
|
105 | //***Winkelberechnen***
|
106 | // winkel_alt = winkel;
|
107 | winkel = ((result/51.2 - 2.5)/4); // Hier wird aus dem 8 Bit Digitalwert des Winkelwertes wieder
|
108 | winkel = asin(winkel); // der float Wert des richtigen Winkels berechnet.
|
109 | winkel /= 3.1415926;
|
110 | winkel *= 180;
|
111 | x = winkel;
|
112 | winkel_print = winkel;
|
113 | winkel_print = winkel_print + 50.0;
|
114 | // winkel_neu = winkel;
|
115 |
|
116 | print_zaehler++;
|
117 | if(print_zaehler >= 5)
|
118 | {
|
119 | printf(" %.2f ",winkel_print);
|
120 | print_zaehler = 0;
|
121 | }
|
122 |
|
123 | // TI = 0;
|
124 | // printf("%i",print_versuch);
|
125 |
|
126 | //***Motoransteuerung***
|
127 | if (winkel == 0)
|
128 | {
|
129 | zaehler = 0;
|
130 | }
|
131 |
|
132 | // Motordrehrichtung festlegen
|
133 | if (winkel > w)
|
134 | // if ((winkel_neu<(winkel_alt+2)) && ((winkel_neu+2)>w))
|
135 | {
|
136 | P04 = 0; // Gewicht nach rechts
|
137 | }
|
138 | else
|
139 | {
|
140 | P04 = 1; // Gewicht nach links
|
141 | }
|
142 |
|
143 |
|
144 | if ((winkel>(w-4))&& (winkel <(w+4)))
|
145 | {
|
146 | // Halbschrittmodus einschalten
|
147 | P03 = 1;
|
148 | }
|
149 | else
|
150 | {
|
151 | P03 = 0;
|
152 | }
|
153 |
|
154 | if ((winkel >(w-0.4))&&(winkel<(w+0.4)))
|
155 | {
|
156 | // Motor ausschalten wenn praktisch
|
157 | // der Sollwinkel erreicht wurde
|
158 | P02 = 0;
|
159 | }
|
160 | else
|
161 | {
|
162 | P02 = 1;
|
163 | }
|
164 |
|
165 | // printf(" %i\t",zaehler);
|
166 |
|
167 | //***Ab hier wird der PI Regler Programmiert***
|
168 |
|
169 | w = 0.0; // Hier können die Werte für den Regler verändert werden.
|
170 | Kp = 20.0;
|
171 | Ki = 40.0;
|
172 | Ta = 0.01;
|
173 |
|
174 | e = w - x; // Vergleich w = Sollwert x = Istwert
|
175 | esum = esum + e; // Integration I - Anteil
|
176 | if ( esum < -400) {esum = -400;} // Begrenzung I - Anteil
|
177 | if (esum > 400) {esum = 400;}
|
178 | y = Kp * e + Ki * Ta * esum ; // Reglergleichung
|
179 | if (y < -260) {y = -260;} // Begrenung Stellgrösse
|
180 | if (y > 260) {y = 260;}
|
181 |
|
182 | // printf(" %f\t",y);
|
183 | Ausgabe_Stellgroesse = y; // Übergabe der Stellgrösse
|
184 |
|
185 | //***Timer2 einschalten***
|
186 |
|
187 | //***Reload Wert ermitteln***
|
188 | #if 0
|
189 | // ### Auskommentiert wegen,...
|
190 | if(y <= 26)
|
191 | {
|
192 | // Ist Ausgabe Wert des Reglers unter 26 dann ist der
|
193 | // Reload_Wert 0 um die Regelung etwas zu verlangsamen
|
194 | Reload_Wert=0;
|
195 | }
|
196 | #endif
|
197 |
|
198 | // if(y >= 26)
|
199 | {
|
200 | Ausgabe_Stellgroesse = abs(Ausgabe_Stellgroesse);
|
201 | xx = 1668750 / (Ausgabe_Stellgroesse);
|
202 |
|
203 | // Reload Wert High ermitteln, Low wird vernachlässigt.
|
204 | Reload_Wert = (65535 - xx)/(pow(2,8));
|
205 |
|
206 | // Frequenz = 1668750 / (65535-Reload_Wert);
|
207 | // printf(" %i\n", Frequenz);
|
208 |
|
209 | //***Empfangen***
|
210 | // TI = 0;
|
211 | scanf("%c",&Empfangen);
|
212 | // RI = 0;
|
213 |
|
214 | /*
|
215 | scanf wartet bis ein Zeichen empfangen wurde.
|
216 | Das Zeichen steht anschliessend in der Variable Empfangen
|
217 | und könnte als Wert -127 bis 127 interpretiert werden.
|
218 | Was soll damit gemacht werden? Im Restprogramm ist kein
|
219 | Bezug darauf vorhanden.
|
220 | */
|
221 | }
|
222 | } // end-while-forever
|
223 | } // end-main
|