Rev 63 | Rev 72 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 63 | Rev 71 | ||
---|---|---|---|
1 | /*####################################################################################### |
1 | /*####################################################################################### |
2 | Flight Control |
2 | Flight Control |
3 | #######################################################################################*/ |
3 | #######################################################################################*/ |
4 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
4 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
5 | // + Regler für Brushless-Motoren |
5 | // + Regler für Brushless-Motoren |
6 | // + ATMEGA8 mit 8MHz |
6 | // + ATMEGA8 mit 8MHz |
7 | // + Nur für den privaten Gebrauch |
7 | // + Nur für den privaten Gebrauch |
8 | // + Copyright (c) 12.2007 Holger Buss |
8 | // + Copyright (c) 12.2007 Holger Buss |
9 | // + www.MikroKopter.com |
9 | // + www.MikroKopter.com |
10 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
10 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
11 | // + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
11 | // + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
12 | // + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist. |
12 | // + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist. |
13 | // + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
13 | // + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
14 | // + bzgl. der Nutzungsbedingungen aufzunehmen. |
14 | // + bzgl. der Nutzungsbedingungen aufzunehmen. |
15 | // + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
15 | // + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
16 | // + Verkauf von Luftbildaufnahmen, usw. |
16 | // + Verkauf von Luftbildaufnahmen, usw. |
17 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
17 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
18 | // + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
18 | // + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
19 | // + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
19 | // + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
20 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
20 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
21 | // + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
21 | // + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
22 | // + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
22 | // + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
23 | // + eindeutig als Ursprung verlinkt werden |
23 | // + eindeutig als Ursprung verlinkt werden |
24 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
24 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
25 | // + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
25 | // + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
26 | // + Benutzung auf eigene Gefahr |
26 | // + Benutzung auf eigene Gefahr |
27 | // + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
27 | // + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
28 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
28 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
29 | // + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
29 | // + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
30 | // + mit unserer Zustimmung zulässig |
30 | // + mit unserer Zustimmung zulässig |
31 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
31 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
32 | // + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
32 | // + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
33 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
33 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
34 | // + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
34 | // + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
35 | // + this list of conditions and the following disclaimer. |
35 | // + this list of conditions and the following disclaimer. |
36 | // + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
36 | // + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
37 | // + from this software without specific prior written permission. |
37 | // + from this software without specific prior written permission. |
38 | // + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
38 | // + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
39 | // + for non-commercial use (directly or indirectly) |
39 | // + for non-commercial use (directly or indirectly) |
40 | // + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
40 | // + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
41 | // + with our written permission |
41 | // + with our written permission |
42 | // + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
42 | // + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
43 | // + clearly linked as origin |
43 | // + clearly linked as origin |
44 | // + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
44 | // + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
45 | // + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
45 | // + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
46 | // + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
46 | // + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
47 | // + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
47 | // + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
48 | // + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
48 | // + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
49 | // + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
49 | // + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
50 | // + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
50 | // + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
51 | // + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
51 | // + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
52 | // + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
52 | // + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
53 | // + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
53 | // + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
54 | // + POSSIBILITY OF SUCH DAMAGE. |
54 | // + POSSIBILITY OF SUCH DAMAGE. |
55 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
55 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
56 | 56 | ||
57 | #include "main.h" |
57 | #include "main.h" |
58 | 58 | ||
59 | unsigned int PWM = 0; |
59 | unsigned int PWM = 0; |
60 | unsigned int Strom = 0,RuheStrom; //ca. in 0,1A |
60 | unsigned int Strom = 0,RuheStrom; //ca. in 0,1A |
61 | unsigned char Strom_max = 0; |
61 | unsigned char Strom_max = 0; |
62 | unsigned char Mittelstrom = 0; |
62 | unsigned char Mittelstrom = 0; |
63 | unsigned int Drehzahl = 0; // in 100UPM 60 = 6000 |
63 | unsigned int Drehzahl = 0; // in 100UPM 60 = 6000 |
64 | unsigned int KommutierDelay = 10; |
64 | unsigned int KommutierDelay = 10; |
65 | unsigned int I2C_Timeout = 0; |
65 | unsigned int I2C_Timeout = 0; |
66 | unsigned int SIO_Timeout = 0; |
66 | unsigned int SIO_Timeout = 0; |
67 | unsigned int SollDrehzahl = 0; |
67 | unsigned int SollDrehzahl = 0; |
68 | unsigned int IstDrehzahl = 0; |
68 | unsigned int IstDrehzahl = 0; |
69 | unsigned int DrehZahlTabelle[256];//vorberechnete Werte zur Drehzahlerfassung |
69 | unsigned int DrehZahlTabelle[256];//vorberechnete Werte zur Drehzahlerfassung |
70 | unsigned char ZeitFuerBerechnungen = 1; |
70 | unsigned char ZeitFuerBerechnungen = 1; |
71 | unsigned char MotorAnwerfen = 0; |
71 | unsigned char MotorAnwerfen = 0; |
72 | unsigned char MotorGestoppt = 1; |
72 | unsigned char MotorGestoppt = 1; |
73 | unsigned char MaxPWM = MAX_PWM; |
73 | unsigned char MaxPWM = MAX_PWM; |
74 | unsigned int CntKommutierungen = 0; |
74 | unsigned int CntKommutierungen = 0; |
75 | unsigned int SIO_Drehzahl = 0; |
75 | unsigned int SIO_Drehzahl = 0; |
76 | unsigned char ZeitZumAdWandeln = 1; |
76 | unsigned char ZeitZumAdWandeln = 1; |
77 | unsigned char MotorAdresse = 1; |
77 | unsigned char MotorAdresse = 1; |
78 | unsigned char PPM_Betrieb = 1; |
78 | unsigned char PPM_Betrieb = 1; |
79 | 79 | ||
80 | //############################################################################ |
80 | //############################################################################ |
81 | // |
81 | // |
82 | void SetPWM(void) |
82 | void SetPWM(void) |
83 | //############################################################################ |
83 | //############################################################################ |
84 | { |
84 | { |
85 | unsigned char tmp_pwm; |
85 | unsigned char tmp_pwm; |
86 | tmp_pwm = PWM; |
86 | tmp_pwm = PWM; |
87 | if(tmp_pwm > MaxPWM) // Strombegrenzung |
87 | if(tmp_pwm > MaxPWM) // Strombegrenzung |
88 | { |
88 | { |
89 | tmp_pwm = MaxPWM; |
89 | tmp_pwm = MaxPWM; |
90 | PORTC |= ROT; |
90 | PORTC |= ROT; |
91 | } |
91 | } |
92 | if(Strom > MAX_STROM) // Strombegrenzung |
92 | if(Strom > MAX_STROM) // Strombegrenzung |
93 | { |
93 | { |
94 | OCR1A = 0; OCR1B = 0; OCR2 = 0; |
94 | OCR1A = 0; OCR1B = 0; OCR2 = 0; |
95 | PORTC |= ROT; |
95 | PORTC |= ROT; |
96 | Strom--; |
96 | Strom--; |
97 | } |
97 | } |
98 | else |
98 | else |
99 | { |
99 | { |
100 | #ifdef _32KHZ |
100 | #ifdef _32KHZ |
101 | OCR1A = tmp_pwm; OCR1B = tmp_pwm; OCR2 = tmp_pwm; |
101 | OCR1A = tmp_pwm; OCR1B = tmp_pwm; OCR2 = tmp_pwm; |
102 | #endif |
102 | #endif |
103 | 103 | ||
104 | #ifdef _16KHZ |
104 | #ifdef _16KHZ |
105 | //OCR1A = 2 * (int)tmp_pwm; OCR1B = 2 * (int)tmp_pwm; OCR2 = tmp_pwm; |
105 | //OCR1A = 2 * (int)tmp_pwm; OCR1B = 2 * (int)tmp_pwm; OCR2 = tmp_pwm; |
106 | OCR1A = tmp_pwm; OCR1B = tmp_pwm; OCR2 = tmp_pwm; |
106 | OCR1A = tmp_pwm; OCR1B = tmp_pwm; OCR2 = tmp_pwm; |
107 | #endif |
107 | #endif |
108 | } |
108 | } |
109 | } |
109 | } |
110 | 110 | ||
111 | //############################################################################ |
111 | //############################################################################ |
112 | // |
112 | // |
113 | void PWM_Init(void) |
113 | void PWM_Init(void) |
114 | //############################################################################ |
114 | //############################################################################ |
115 | { |
115 | { |
116 | PWM_OFF; |
116 | PWM_OFF; |
117 | TCCR1B = (1 << CS10) | (0 << CS11) | (0 << CS12) | (0 << WGM12) | |
117 | TCCR1B = (1 << CS10) | (0 << CS11) | (0 << CS12) | (0 << WGM12) | |
118 | (0 << WGM13) | (0<< ICES1) | (0 << ICNC1); |
118 | (0 << WGM13) | (0<< ICES1) | (0 << ICNC1); |
119 | /* TCCR1B = (1 << CS10) | (0 << CS11) | (0 << CS12) | (1 << WGM12) | |
119 | /* TCCR1B = (1 << CS10) | (0 << CS11) | (0 << CS12) | (1 << WGM12) | |
120 | (0 << WGM13) | (0<< ICES1) | (0 << ICNC1); |
120 | (0 << WGM13) | (0<< ICES1) | (0 << ICNC1); |
121 | */ |
121 | */ |
122 | } |
122 | } |
123 | 123 | ||
124 | //############################################################################ |
124 | //############################################################################ |
125 | // |
125 | // |
126 | void Wait(unsigned char dauer) |
126 | void Wait(unsigned char dauer) |
127 | //############################################################################ |
127 | //############################################################################ |
128 | { |
128 | { |
129 | dauer = (unsigned char)TCNT0 + dauer; |
129 | dauer = (unsigned char)TCNT0 + dauer; |
130 | while((TCNT0 - dauer) & 0x80); |
130 | while((TCNT0 - dauer) & 0x80); |
131 | } |
131 | } |
132 | 132 | ||
133 | //############################################################################ |
133 | //############################################################################ |
134 | // |
134 | // |
135 | void Anwerfen(unsigned char pwm) |
135 | void Anwerfen(unsigned char pwm) |
136 | //############################################################################ |
136 | //############################################################################ |
137 | { |
137 | { |
138 | unsigned long timer = 300,i; |
138 | unsigned long timer = 300,i; |
139 | DISABLE_SENSE_INT; |
139 | DISABLE_SENSE_INT; |
140 | PWM = 5; |
140 | PWM = 5; |
141 | SetPWM(); |
141 | SetPWM(); |
142 | Manuell(); |
142 | Manuell(); |
143 | Delay_ms(200); |
143 | Delay_ms(200); |
144 | PWM = pwm; |
144 | PWM = pwm; |
145 | while(1) |
145 | while(1) |
146 | { |
146 | { |
147 | for(i=0;i<timer; i++) |
147 | for(i=0;i<timer; i++) |
148 | { |
148 | { |
149 | if(!UebertragungAbgeschlossen) SendUart(); |
149 | if(!UebertragungAbgeschlossen) SendUart(); |
150 | else DatenUebertragung(); |
150 | else DatenUebertragung(); |
151 | Wait(100); // warten |
151 | Wait(100); // warten |
152 | } |
152 | } |
153 | timer-= timer/15+1; |
153 | timer-= timer/15+1; |
154 | if(timer < 25) { if(TEST_MANUELL) timer = 25; else return; } |
154 | if(timer < 25) { if(TEST_MANUELL) timer = 25; else return; } |
155 | 155 | ||
156 | Manuell(); |
156 | Manuell(); |
157 | Phase++; |
157 | Phase++; |
158 | Phase %= 6; |
158 | Phase %= 6; |
159 | AdConvert(); |
159 | AdConvert(); |
160 | PWM = pwm; |
160 | PWM = pwm; |
161 | SetPWM(); |
161 | SetPWM(); |
162 | if(SENSE) |
162 | if(SENSE) |
163 | { |
163 | { |
164 | PORTD ^= GRUEN; |
164 | PORTD ^= GRUEN; |
165 | } |
165 | } |
166 | } |
166 | } |
167 | } |
167 | } |
168 | 168 | ||
169 | /* |
169 | /* |
170 | #define SENSE_A ADMUX = 0; |
170 | #define SENSE_A ADMUX = 0; |
171 | #define SENSE_B ADMUX = 1; |
171 | #define SENSE_B ADMUX = 1; |
172 | #define SENSE_C ADMUX = 2; |
172 | #define SENSE_C ADMUX = 2; |
173 | 173 | ||
174 | #define ClrSENSE ACSR |= 0x10 |
174 | #define ClrSENSE ACSR |= 0x10 |
175 | #define SENSE ((ACSR & 0x10)) |
175 | #define SENSE ((ACSR & 0x10)) |
176 | #define SENSE_L (!(ACSR & 0x20)) |
176 | #define SENSE_L (!(ACSR & 0x20)) |
177 | #define SENSE_H ((ACSR & 0x20)) |
177 | #define SENSE_H ((ACSR & 0x20)) |
178 | */ |
178 | */ |
179 | 179 | ||
180 | void RotBlink(unsigned char anz) |
180 | void RotBlink(unsigned char anz) |
181 | { |
181 | { |
182 | sei(); // Interrupts ein |
182 | sei(); // Interrupts ein |
183 | while(anz--) |
183 | while(anz--) |
184 | { |
184 | { |
185 | PORTC |= ROT; |
185 | PORTC |= ROT; |
186 | Delay_ms(300); |
186 | Delay_ms(300); |
187 | PORTC &= ~ROT; |
187 | PORTC &= ~ROT; |
188 | Delay_ms(300); |
188 | Delay_ms(300); |
189 | } |
189 | } |
190 | Delay_ms(1000); |
190 | Delay_ms(1000); |
191 | } |
191 | } |
192 | 192 | ||
193 | #define TEST_STROMGRENZE 120 |
193 | #define TEST_STROMGRENZE 120 |
194 | unsigned char DelayM(unsigned int timer) |
194 | unsigned char DelayM(unsigned int timer) |
195 | { |
195 | { |
196 | while(timer--) |
196 | while(timer--) |
197 | { |
197 | { |
198 | FastADConvert(); |
198 | FastADConvert(); |
199 | if(Strom > (TEST_STROMGRENZE + RuheStrom)) |
199 | if(Strom > (TEST_STROMGRENZE + RuheStrom)) |
200 | { |
200 | { |
201 | FETS_OFF; |
201 | FETS_OFF; |
202 | return(1); |
202 | return(1); |
203 | } |
203 | } |
204 | } |
204 | } |
205 | return(0); |
205 | return(0); |
206 | } |
206 | } |
207 | 207 | ||
208 | unsigned char Delay(unsigned int timer) |
208 | unsigned char Delay(unsigned int timer) |
209 | { |
209 | { |
210 | while(timer--) |
210 | while(timer--) |
211 | { |
211 | { |
212 | // if(SENSE_H) { PORTC |= ROT; } else { PORTC &= ~ROT;} |
212 | // if(SENSE_H) { PORTC |= ROT; } else { PORTC &= ~ROT;} |
213 | } |
213 | } |
214 | return(0); |
214 | return(0); |
215 | } |
215 | } |
216 | 216 | ||
217 | /* |
217 | /* |
218 | void ShowSense(void) |
218 | void ShowSense(void) |
219 | { |
219 | { |
220 | if(SENSE_H) { PORTC |= ROT; } else { PORTC &= ~ROT;} |
220 | if(SENSE_H) { PORTC |= ROT; } else { PORTC &= ~ROT;} |
221 | 221 | ||
222 | } |
222 | } |
223 | */ |
223 | */ |
224 | #define HIGH_A_EIN PORTB |= 0x08 |
224 | #define HIGH_A_EIN PORTB |= 0x08 |
225 | #define HIGH_B_EIN PORTB |= 0x04 |
225 | #define HIGH_B_EIN PORTB |= 0x04 |
226 | #define HIGH_C_EIN PORTB |= 0x02 |
226 | #define HIGH_C_EIN PORTB |= 0x02 |
227 | #define LOW_A_EIN PORTD |= 0x08 |
227 | #define LOW_A_EIN PORTD |= 0x08 |
228 | #define LOW_B_EIN PORTD |= 0x10 |
228 | #define LOW_B_EIN PORTD |= 0x10 |
229 | #define LOW_C_EIN PORTD |= 0x20 |
229 | #define LOW_C_EIN PORTD |= 0x20 |
230 | 230 | ||
231 | void MotorTon(void) |
231 | void MotorTon(void) |
232 | //############################################################################ |
232 | //############################################################################ |
233 | { |
233 | { |
234 | unsigned char ADR_TAB[5] = {0,0,2,1,3}; |
234 | unsigned char ADR_TAB[5] = {0,0,2,1,3}; |
235 | unsigned int timer = 300,i; |
235 | unsigned int timer = 300,i; |
236 | unsigned int t = 0; |
236 | unsigned int t = 0; |
237 | unsigned char anz = 0,MosfetOkay = 0, grenze = 50; |
237 | unsigned char anz = 0,MosfetOkay = 0, grenze = 50; |
238 | 238 | ||
239 | PORTC &= ~ROT; |
239 | PORTC &= ~ROT; |
240 | Delay_ms(300 * ADR_TAB[MotorAdresse]); |
240 | Delay_ms(300 * ADR_TAB[MotorAdresse]); |
241 | DISABLE_SENSE_INT; |
241 | DISABLE_SENSE_INT; |
242 | cli();//Globale Interrupts Ausschalten |
242 | cli();//Globale Interrupts Ausschalten |
243 | uart_putchar('\n'); |
243 | uart_putchar('\n'); |
244 | STEUER_OFF; |
244 | STEUER_OFF; |
245 | Strom_max = 0; |
245 | Strom_max = 0; |
246 | DelayM(50); |
246 | DelayM(50); |
247 | RuheStrom = Strom_max; |
247 | RuheStrom = Strom_max; |
248 | // uart_putchar(RuheStrom + 'A'); |
248 | // uart_putchar(RuheStrom + 'A'); |
249 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
249 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
250 | //+ High-Mosfets auf Kurzschluss testen |
250 | //+ High-Mosfets auf Kurzschluss testen |
251 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
251 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
252 | Strom = 0; |
252 | Strom = 0; |
- | 253 | /* |
|
253 | LOW_B_EIN; |
254 | LOW_B_EIN; |
254 | HIGH_A_EIN; |
255 | HIGH_A_EIN; |
255 | if(DelayM(3)) |
256 | if(DelayM(3)) |
256 | { |
257 | { |
257 | anz = 1; |
258 | anz = 1; |
258 | uart_putchar('1'); |
259 | uart_putchar('1'); |
259 | } |
260 | } |
260 | FETS_OFF; |
261 | FETS_OFF; |
261 | Delay(1000); |
262 | Delay(1000); |
262 | Strom = 0; |
263 | Strom = 0; |
263 | LOW_A_EIN; |
264 | LOW_A_EIN; |
264 | HIGH_B_EIN; |
265 | HIGH_B_EIN; |
265 | if(DelayM(3)) |
266 | if(DelayM(3)) |
266 | { |
267 | { |
267 | anz = 2; |
268 | anz = 2; |
268 | uart_putchar('2'); |
269 | uart_putchar('2'); |
269 | } |
270 | } |
270 | FETS_OFF; |
271 | FETS_OFF; |
271 | Delay(1000); |
272 | Delay(1000); |
272 | Strom = 0; |
273 | Strom = 0; |
273 | LOW_B_EIN; // Low C ein |
274 | LOW_B_EIN; // Low C ein |
274 | HIGH_C_EIN; // High B ein |
275 | HIGH_C_EIN; // High B ein |
275 | if(DelayM(3)) |
276 | if(DelayM(3)) |
276 | { |
277 | { |
277 | anz = 3; |
278 | anz = 3; |
278 | uart_putchar('3'); |
279 | uart_putchar('3'); |
279 | } |
280 | } |
280 | FETS_OFF; |
281 | FETS_OFF; |
281 | Delay(1000); |
282 | Delay(1000); |
282 | LOW_A_EIN; // Low A ein; und A gegen C |
283 | LOW_A_EIN; // Low A ein; und A gegen C |
283 | HIGH_C_EIN; // High C ein |
284 | HIGH_C_EIN; // High C ein |
284 | if(DelayM(3)) |
285 | if(DelayM(3)) |
285 | { |
286 | { |
286 | anz = 3; |
287 | anz = 3; |
287 | uart_putchar('7'); |
288 | uart_putchar('7'); |
288 | } |
289 | } |
289 | FETS_OFF; |
290 | FETS_OFF; |
290 | DelayM(10000); |
291 | DelayM(10000); |
291 | if(anz) while(1) RotBlink(anz); // bei Kurzschluss nicht starten |
- | |
- | 292 | ||
- | 293 | if(anz) while(1) RotBlink(anz); // bei Kurzschluss nicht starten |
|
292 | 294 | */ |
|
293 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
295 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
294 | //+ LOW-Mosfets auf Schalten und Kurzschluss testen |
296 | //+ LOW-Mosfets auf Schalten und Kurzschluss testen |
295 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
297 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
296 | if(UDR == ' ') {t = 65535; grenze = 40; uart_putchar('_');} else t = 1000; // Ausführlicher Test |
298 | if(UDR == ' ') {t = 65535; grenze = 40; uart_putchar('_');} else t = 1000; // Ausführlicher Test |
297 | Strom = 0; |
299 | Strom = 0; |
298 | for(i=0;i<t;i++) |
300 | for(i=0;i<t;i++) |
299 | { |
301 | { |
300 | LOW_A_EIN; |
302 | LOW_A_EIN; |
301 | DelayM(1); |
303 | DelayM(1); |
302 | FETS_OFF; |
304 | FETS_OFF; |
303 | Delay(5); |
305 | Delay(5); |
304 | HIGH_A_EIN; |
306 | HIGH_A_EIN; |
305 | DelayM(1); |
307 | DelayM(1); |
306 | FETS_OFF; |
308 | FETS_OFF; |
307 | if(Strom > grenze + RuheStrom) {anz = 4; uart_putchar('4'); break;} |
309 | if(Strom > grenze + RuheStrom) {anz = 4; uart_putchar('4'); break;} |
308 | Delay(5); |
310 | Delay(5); |
309 | } |
311 | } |
310 | Delay(10000); |
312 | Delay(10000); |
311 | 313 | ||
312 | Strom = 0; |
314 | Strom = 0; |
313 | for(i=0;i<t;i++) |
315 | for(i=0;i<t;i++) |
314 | { |
316 | { |
315 | LOW_B_EIN; |
317 | LOW_B_EIN; |
316 | DelayM(1); |
318 | DelayM(1); |
317 | FETS_OFF; |
319 | FETS_OFF; |
318 | Delay(5); |
320 | Delay(5); |
319 | HIGH_B_EIN; |
321 | HIGH_B_EIN; |
320 | DelayM(1); |
322 | DelayM(1); |
321 | FETS_OFF; |
323 | FETS_OFF; |
322 | if(Strom > grenze + RuheStrom) {anz = 5; uart_putchar('5'); break;} |
324 | if(Strom > grenze + RuheStrom) {anz = 5; uart_putchar('5'); break;} |
323 | Delay(5); |
325 | Delay(5); |
324 | } |
326 | } |
325 | 327 | ||
326 | Strom = 0; |
328 | Strom = 0; |
327 | Delay(10000); |
329 | Delay(10000); |
328 | 330 | ||
329 | for(i=0;i<t;i++) |
331 | for(i=0;i<t;i++) |
330 | { |
332 | { |
331 | LOW_C_EIN; |
333 | LOW_C_EIN; |
332 | DelayM(1); |
334 | DelayM(1); |
333 | FETS_OFF; |
335 | FETS_OFF; |
334 | Delay(5); |
336 | Delay(5); |
335 | HIGH_C_EIN; |
337 | HIGH_C_EIN; |
336 | DelayM(1); |
338 | DelayM(1); |
337 | FETS_OFF; |
339 | FETS_OFF; |
338 | if(Strom > grenze + RuheStrom) {anz = 6; uart_putchar('6'); break;} |
340 | if(Strom > grenze + RuheStrom) {anz = 6; uart_putchar('6'); break;} |
339 | Delay(5); |
341 | Delay(5); |
340 | } |
342 | } |
341 | 343 | ||
342 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
344 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
343 | //+ High-Mosfets auf Schalten testen |
345 | //+ High-Mosfets auf Schalten testen |
344 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
346 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
345 | SENSE_A; |
347 | SENSE_A; |
346 | FETS_OFF; |
348 | FETS_OFF; |
347 | LOW_B_EIN; // Low B ein |
349 | LOW_B_EIN; // Low B ein |
348 | LOW_C_EIN; // Low C ein |
350 | LOW_C_EIN; // Low C ein |
349 | Strom = 0; |
351 | Strom = 0; |
350 | #define TONDAUER 40000 |
352 | #define TONDAUER 40000 |
351 | #define SOUND_E 2 |
353 | #define SOUND_E 1 // 1 |
352 | #define SOUND1_A 300 |
354 | #define SOUND1_A 300 |
353 | #define SOUND2_A 330 |
355 | #define SOUND2_A 330 |
354 | #define SOUND3_A 360 |
356 | #define SOUND3_A 360 |
355 | 357 | ||
356 | for(i=0; i< (TONDAUER / SOUND2_A) ; i++) |
358 | for(i=0; i< (TONDAUER / SOUND2_A) ; i++) |
357 | { |
359 | { |
358 | HIGH_A_EIN; // Test A |
360 | HIGH_A_EIN; // Test A |
359 | Delay(SOUND_E); |
361 | Delay(SOUND_E); |
360 | if(MessAD(0) > 50) { MosfetOkay |= 0x01; } else { MosfetOkay &= ~0x01;}; |
362 | if(MessAD(0) > 50) { MosfetOkay |= 0x01; } else { MosfetOkay &= ~0x01;}; |
361 | PORTB = 0; |
363 | PORTB = 0; |
362 | Delay(SOUND1_A); |
364 | Delay(SOUND1_A); |
363 | } |
365 | } |
364 | FETS_OFF; |
366 | FETS_OFF; |
365 | 367 | ||
366 | LOW_A_EIN; // Low A ein |
368 | LOW_A_EIN; // Low A ein |
367 | LOW_C_EIN; // Low C ein |
369 | LOW_C_EIN; // Low C ein |
368 | for(i=0; i<(TONDAUER / SOUND1_A); i++) |
370 | for(i=0; i<(TONDAUER / SOUND1_A); i++) |
369 | { |
371 | { |
370 | HIGH_B_EIN; // Test B |
372 | HIGH_B_EIN; // Test B |
371 | Delay(SOUND_E); |
373 | Delay(SOUND_E); |
372 | if(MessAD(1) > 50) { MosfetOkay |= 0x02; } else { MosfetOkay &= ~0x02;}; |
374 | if(MessAD(1) > 50) { MosfetOkay |= 0x02; } else { MosfetOkay &= ~0x02;}; |
373 | PORTB = 0; |
375 | PORTB = 0; |
374 | Delay(SOUND1_A); |
376 | Delay(SOUND1_A); |
375 | } |
377 | } |
376 | 378 | ||
377 | FETS_OFF; |
379 | FETS_OFF; |
378 | LOW_A_EIN; // Low A ein |
380 | LOW_A_EIN; // Low A ein |
379 | LOW_B_EIN; // Low B ein |
381 | LOW_B_EIN; // Low B ein |
380 | for(i=0; i<(TONDAUER / SOUND3_A); i++) |
382 | for(i=0; i<(TONDAUER / SOUND3_A); i++) |
381 | { |
383 | { |
382 | HIGH_C_EIN; // Test C |
384 | HIGH_C_EIN; // Test C |
383 | Delay(SOUND_E); |
385 | Delay(SOUND_E); |
384 | if(MessAD(2) > 50) { MosfetOkay |= 0x04; } else { MosfetOkay &= ~0x04;}; |
386 | if(MessAD(2) > 50) { MosfetOkay |= 0x04; } else { MosfetOkay &= ~0x04;}; |
385 | PORTB = 0; |
387 | PORTB = 0; |
386 | Delay(SOUND2_A); |
388 | Delay(SOUND2_A); |
387 | } |
389 | } |
388 | FETS_OFF; |
390 | FETS_OFF; |
389 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
391 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
390 | //+ Low-Mosfets auf Schalten testen |
392 | //+ Low-Mosfets auf Schalten testen |
391 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
393 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
392 | SENSE_B; |
394 | SENSE_B; |
393 | LOW_A_EIN; // Low A ein |
395 | LOW_A_EIN; // Low A ein |
394 | for(i=0; i< (TONDAUER / SOUND2_A) ; i++) |
396 | for(i=0; i< (TONDAUER / SOUND2_A) ; i++) |
395 | { |
397 | { |
396 | HIGH_B_EIN; // Test B |
398 | HIGH_B_EIN; // Test B |
397 | Delay(SOUND_E); |
399 | Delay(SOUND_E); |
398 | if(MessAD(0) > 50) { MosfetOkay &= ~0x08;} else { MosfetOkay |= 0x08;}; |
400 | if(MessAD(0) > 50) { MosfetOkay &= ~0x08;} else { MosfetOkay |= 0x08;}; |
399 | PORTB = 0; |
401 | PORTB = 0; |
400 | Delay(SOUND2_A); |
402 | Delay(SOUND2_A); |
401 | } |
403 | } |
402 | 404 | ||
403 | //++++++++++++++++++++++++++++++++++++ |
405 | //++++++++++++++++++++++++++++++++++++ |
404 | LOW_C_EIN; // Low C ein |
406 | LOW_C_EIN; // Low C ein |
405 | for(i=0; i<(TONDAUER / SOUND1_A); i++) |
407 | for(i=0; i<(TONDAUER / SOUND1_A); i++) |
406 | { |
408 | { |
407 | HIGH_B_EIN; // Test B |
409 | HIGH_B_EIN; // Test B |
408 | Delay(SOUND_E); |
410 | Delay(SOUND_E); |
409 | if(MessAD(2) > 50) { MosfetOkay &= ~0x20;} else { MosfetOkay |= 0x20;}; |
411 | if(MessAD(2) > 50) { MosfetOkay &= ~0x20;} else { MosfetOkay |= 0x20;}; |
410 | PORTB = 0; |
412 | PORTB = 0; |
411 | Delay(SOUND3_A); |
413 | Delay(SOUND3_A); |
412 | } |
414 | } |
413 | FETS_OFF; |
415 | FETS_OFF; |
414 | //++++++++++++++++++++++++++++++++++++ |
416 | //++++++++++++++++++++++++++++++++++++ |
415 | FETS_OFF; |
417 | FETS_OFF; |
416 | LOW_B_EIN; // Low B ein |
418 | LOW_B_EIN; // Low B ein |
417 | for(i=0; i<(TONDAUER / SOUND3_A); i++) |
419 | for(i=0; i<(TONDAUER / SOUND3_A); i++) |
418 | { |
420 | { |
419 | HIGH_C_EIN; // Test C |
421 | HIGH_C_EIN; // Test C |
420 | Delay(SOUND_E); |
422 | Delay(SOUND_E); |
421 | if(MessAD(1) > 50) { MosfetOkay &= ~0x10;} else { MosfetOkay |= 0x10;}; |
423 | if(MessAD(1) > 50) { MosfetOkay &= ~0x10;} else { MosfetOkay |= 0x10;}; |
422 | PORTB = 0; |
424 | PORTB = 0; |
423 | Delay(SOUND3_A); |
425 | Delay(SOUND3_A); |
424 | } |
426 | } |
425 | FETS_OFF; |
427 | FETS_OFF; |
426 | //++++++++++++++++++++++++++++++++++++ |
428 | //++++++++++++++++++++++++++++++++++++ |
427 | 429 | ||
428 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
430 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
429 | sei();//Globale Interrupts Einschalten |
431 | sei();//Globale Interrupts Einschalten |
430 | // Delay_ms(250 * MotorAdresse); |
432 | // Delay_ms(250 * MotorAdresse); |
431 | /* |
433 | /* |
432 | LOW_A_EIN; // Low B ein |
434 | LOW_A_EIN; // Low B ein |
433 | #define SOUND8_A 650 |
435 | #define SOUND8_A 650 |
434 | for(i=0; i<(TONDAUER / SOUND8_A); i++) |
436 | for(i=0; i<(TONDAUER / SOUND8_A); i++) |
435 | { |
437 | { |
436 | HIGH_B_EIN; // Test B |
438 | HIGH_B_EIN; // Test B |
437 | Delay(SOUND_E); |
439 | Delay(SOUND_E); |
438 | PORTB = 0; |
440 | PORTB = 0; |
439 | Delay(SOUND8_A); |
441 | Delay(SOUND8_A); |
440 | } |
442 | } |
441 | */ |
443 | */ |
442 | Delay_ms(300 * (4-ADR_TAB[MotorAdresse])); |
444 | Delay_ms(300 * (4-ADR_TAB[MotorAdresse])); |
443 | if(!(MosfetOkay & 0x01)) { anz = 1; UDR='A'; } else |
445 | if(!(MosfetOkay & 0x01)) { anz = 1; UDR='A'; } else |
444 | if(!(MosfetOkay & 0x02)) { anz = 2; UDR='B'; } else |
446 | if(!(MosfetOkay & 0x02)) { anz = 2; UDR='B'; } else |
445 | if(!(MosfetOkay & 0x04)) { anz = 3; UDR='C'; } else |
447 | if(!(MosfetOkay & 0x04)) { anz = 3; UDR='C'; } else |
446 | if(!(MosfetOkay & 0x08)) { anz = 4; UDR='a'; } else |
448 | if(!(MosfetOkay & 0x08)) { anz = 4; UDR='a'; } else |
447 | if(!(MosfetOkay & 0x10)) { anz = 5; UDR='b'; } else |
449 | if(!(MosfetOkay & 0x10)) { anz = 5; UDR='b'; } else |
448 | if(!(MosfetOkay & 0x20)) { anz = 6; UDR='c'; } |
450 | if(!(MosfetOkay & 0x20)) { anz = 6; UDR='c'; } |
449 | 451 | ||
450 | if(anz) Delay_ms(1000); |
452 | if(anz) Delay_ms(1000); |
451 | 453 | ||
452 | RotBlink(anz); |
454 | RotBlink(anz); |
453 | uart_putchar('.'); |
455 | uart_putchar('.'); |
454 | } |
456 | } |
455 | 457 | ||
456 | //############################################################################ |
458 | //############################################################################ |
457 | // |
459 | // |
458 | unsigned char SollwertErmittlung(void) |
460 | unsigned char SollwertErmittlung(void) |
459 | //############################################################################ |
461 | //############################################################################ |
460 | { |
462 | { |
461 | static unsigned int sollwert = 0; |
463 | static unsigned int sollwert = 0; |
462 | unsigned int ppm; |
464 | unsigned int ppm; |
463 | if(!I2C_Timeout) // bei Erreichen von 0 ist der Wert ungültig |
465 | if(!I2C_Timeout) // bei Erreichen von 0 ist der Wert ungültig |
464 | { |
466 | { |
465 | if(SIO_Timeout) // es gibt gültige SIO-Daten |
467 | if(SIO_Timeout) // es gibt gültige SIO-Daten |
466 | { |
468 | { |
467 | sollwert = (MAX_PWM * (unsigned int) SIO_Sollwert) / 200; // skalieren auf 0-200 = 0-255 |
469 | sollwert = (MAX_PWM * (unsigned int) SIO_Sollwert) / 200; // skalieren auf 0-200 = 0-255 |
468 | PPM_Betrieb = 0; |
470 | PPM_Betrieb = 0; |
469 | ICP_INT_DISABLE; |
471 | ICP_INT_DISABLE; |
470 | PORTC &= ~ROT; |
472 | PORTC &= ~ROT; |
471 | } |
473 | } |
472 | else |
474 | else |
473 | if(anz_ppm_werte > 20) // es gibt gültige PPM-Daten |
475 | if(anz_ppm_werte > 20) // es gibt gültige PPM-Daten |
474 | { |
476 | { |
475 | PPM_Betrieb = 1; |
477 | PPM_Betrieb = 1; |
476 | ppm = PPM_Signal; |
478 | ppm = PPM_Signal; |
477 | if(ppm > 300) ppm = 0; // ungültiges Signal |
479 | if(ppm > 300) ppm = 0; // ungültiges Signal |
478 | if(ppm > 200) ppm = 200; |
480 | if(ppm > 200) ppm = 200; |
479 | if(ppm <= MIN_PPM) sollwert = 0; |
481 | if(ppm <= MIN_PPM) sollwert = 0; |
480 | else |
482 | else |
481 | { |
483 | { |
482 | sollwert = (int) MIN_PWM + ((MAX_PWM - MIN_PWM) * (ppm - MIN_PPM)) / (190 - MIN_PPM); |
484 | sollwert = (int) MIN_PWM + ((MAX_PWM - MIN_PWM) * (ppm - MIN_PPM)) / (190 - MIN_PPM); |
483 | } |
485 | } |
484 | PORTC &= ~ROT; |
486 | PORTC &= ~ROT; |
485 | } |
487 | } |
486 | else // Kein gültiger Sollwert |
488 | else // Kein gültiger Sollwert |
487 | { |
489 | { |
488 | if(!TEST_SCHUB) { if(sollwert) sollwert--; } |
490 | if(!TEST_SCHUB) { if(sollwert) sollwert--; } |
489 | PORTC |= ROT; |
491 | PORTC |= ROT; |
490 | } |
492 | } |
491 | } |
493 | } |
492 | else // I2C-Daten sind gültig |
494 | else // I2C-Daten sind gültig |
493 | { |
495 | { |
494 | sollwert = I2C_RXBuffer; |
496 | sollwert = I2C_RXBuffer; |
495 | PPM_Betrieb = 0; |
497 | PPM_Betrieb = 0; |
496 | PORTC &= ~ROT; |
498 | PORTC &= ~ROT; |
497 | ICP_INT_DISABLE; |
499 | ICP_INT_DISABLE; |
498 | } |
500 | } |
499 | if(sollwert > MAX_PWM) sollwert = MAX_PWM; |
501 | if(sollwert > MAX_PWM) sollwert = MAX_PWM; |
500 | return(sollwert); |
502 | return(sollwert); |
501 | } |
503 | } |
502 | 504 | ||
503 | void DebugAusgaben(void) |
505 | void DebugAusgaben(void) |
504 | { |
506 | { |
505 | DebugOut.Analog[0] = Strom; |
507 | DebugOut.Analog[0] = Strom; |
506 | DebugOut.Analog[1] = Mittelstrom; |
508 | DebugOut.Analog[1] = Mittelstrom; |
507 | DebugOut.Analog[2] = SIO_Drehzahl; |
509 | DebugOut.Analog[2] = SIO_Drehzahl; |
508 | DebugOut.Analog[3] = PPM_Signal; |
510 | DebugOut.Analog[3] = PPM_Signal; |
509 | } |
511 | } |
510 | 512 | ||
511 | 513 | ||
512 | //############################################################################ |
514 | //############################################################################ |
513 | //Hauptprogramm |
515 | //Hauptprogramm |
514 | int main (void) |
516 | int main (void) |
515 | //############################################################################ |
517 | //############################################################################ |
516 | { |
518 | { |
517 | char altPhase = 0; |
519 | char altPhase = 0; |
518 | int test = 0; |
520 | int test = 0; |
519 | unsigned int MinUpmPulse,Blink,TestschubTimer; |
521 | unsigned int MinUpmPulse,Blink,TestschubTimer; |
520 | unsigned int Blink2,MittelstromTimer,DrehzahlMessTimer,MotorGestopptTimer; |
522 | unsigned int Blink2,MittelstromTimer,DrehzahlMessTimer,MotorGestopptTimer; |
521 | 523 | ||
522 | DDRC = 0x08; |
524 | DDRC = 0x08; |
523 | PORTC = 0x08; |
525 | PORTC = 0x08; |
524 | DDRD = 0xBA; |
526 | DDRD = 0xBA; |
525 | PORTD = 0x00; |
527 | PORTD = 0x00; |
526 | DDRB = 0x0E; |
528 | DDRB = 0x0E; |
527 | PORTB = 0x31; |
529 | PORTB = 0x31; |
528 | 530 | ||
529 | #if (MOTORADRESSE == 0) |
531 | #if (MOTORADRESSE == 0) |
530 | PORTB |= (ADR1 + ADR2); // Pullups für Adresswahl |
532 | PORTB |= (ADR1 + ADR2); // Pullups für Adresswahl |
531 | for(test=0;test<500;test++); |
533 | for(test=0;test<500;test++); |
532 | if (PINB & ADR1) |
534 | if (PINB & ADR1) |
533 | { |
535 | { |
534 | if (PINB & ADR2) MotorAdresse = 1; |
536 | if (PINB & ADR2) MotorAdresse = 1; |
535 | else MotorAdresse = 2; |
537 | else MotorAdresse = 2; |
536 | } |
538 | } |
537 | else |
539 | else |
538 | { |
540 | { |
539 | if (PINB & ADR2) MotorAdresse = 3; |
541 | if (PINB & ADR2) MotorAdresse = 3; |
540 | else MotorAdresse = 4; |
542 | else MotorAdresse = 4; |
541 | } |
543 | } |
542 | #else |
544 | #else |
543 | MotorAdresse = MOTORADRESSE; |
545 | MotorAdresse = MOTORADRESSE; |
544 | #endif |
546 | #endif |
545 | 547 | ||
546 | UART_Init(); |
548 | UART_Init(); |
547 | Timer0_Init(); |
549 | Timer0_Init(); |
548 | sei();//Globale Interrupts Einschalten |
550 | sei();//Globale Interrupts Einschalten |
549 | 551 | ||
550 | // Am Blinken erkennt man die richtige Motoradresse |
552 | // Am Blinken erkennt man die richtige Motoradresse |
551 | /* |
553 | /* |
552 | for(test=0;test<5;test++) |
554 | for(test=0;test<5;test++) |
553 | { |
555 | { |
554 | if(test == MotorAdresse) PORTD |= GRUEN; |
556 | if(test == MotorAdresse) PORTD |= GRUEN; |
555 | Delay_ms(150); |
557 | Delay_ms(150); |
556 | PORTD &= ~GRUEN; |
558 | PORTD &= ~GRUEN; |
557 | Delay_ms(250); |
559 | Delay_ms(250); |
558 | } |
560 | } |
559 | 561 | ||
560 | Delay_ms(500); |
562 | Delay_ms(500); |
561 | */ |
563 | */ |
562 | // UART_Init(); // war doppelt |
564 | // UART_Init(); // war doppelt |
563 | PWM_Init(); |
565 | PWM_Init(); |
564 | 566 | ||
565 | InitIC2_Slave(0x50); |
567 | InitIC2_Slave(0x50); |
566 | InitPPM(); |
568 | InitPPM(); |
567 | 569 | ||
568 | Blink = SetDelay(101); |
570 | Blink = SetDelay(101); |
569 | Blink2 = SetDelay(102); |
571 | Blink2 = SetDelay(102); |
570 | MinUpmPulse = SetDelay(103); |
572 | MinUpmPulse = SetDelay(103); |
571 | MittelstromTimer = SetDelay(254); |
573 | MittelstromTimer = SetDelay(254); |
572 | DrehzahlMessTimer = SetDelay(1005); |
574 | DrehzahlMessTimer = SetDelay(1005); |
573 | TestschubTimer = SetDelay(1006); |
575 | TestschubTimer = SetDelay(1006); |
574 | while(!CheckDelay(MinUpmPulse)) |
576 | while(!CheckDelay(MinUpmPulse)) |
575 | { |
577 | { |
576 | if(SollwertErmittlung()) break; |
578 | if(SollwertErmittlung()) break; |
577 | } |
579 | } |
578 | ; |
580 | ; |
579 | PORTD |= GRUEN; |
581 | PORTD |= GRUEN; |
580 | PWM = 0; |
582 | PWM = 0; |
581 | 583 | ||
582 | SetPWM(); |
584 | SetPWM(); |
583 | 585 | ||
584 | SFIOR = 0x08; // Analog Comperator ein |
586 | SFIOR = 0x08; // Analog Comperator ein |
585 | ADMUX = 1; |
587 | ADMUX = 1; |
586 | 588 | ||
587 | MinUpmPulse = SetDelay(10); |
589 | MinUpmPulse = SetDelay(10); |
588 | DebugOut.Analog[1] = 1; |
590 | DebugOut.Analog[1] = 1; |
589 | PPM_Signal = 0; |
591 | PPM_Signal = 0; |
590 | 592 | ||
591 | if(!SollwertErmittlung()) MotorTon(); |
593 | if(!SollwertErmittlung()) MotorTon(); |
592 | //MotorTon(); |
594 | //MotorTon(); |
593 | PORTB = 0x31; // Pullups wieder einschalten |
595 | PORTB = 0x31; // Pullups wieder einschalten |
594 | 596 | ||
595 | // zum Test der Hardware; Motor dreht mit konstanter Drehzahl ohne Regelung |
597 | // zum Test der Hardware; Motor dreht mit konstanter Drehzahl ohne Regelung |
596 | if(TEST_MANUELL) Anwerfen(TEST_MANUELL); // kommt von dort nicht wieder |
598 | if(TEST_MANUELL) Anwerfen(TEST_MANUELL); // kommt von dort nicht wieder |
597 | 599 | ||
598 | while (1) |
600 | while (1) |
599 | { |
601 | { |
600 | //ShowSense(); |
602 | //ShowSense(); |
601 | 603 | ||
602 | if(!TEST_SCHUB) PWM = SollwertErmittlung(); |
604 | if(!TEST_SCHUB) PWM = SollwertErmittlung(); |
603 | //I2C_TXBuffer = PWM; // Antwort über I2C-Bus |
605 | //I2C_TXBuffer = PWM; // Antwort über I2C-Bus |
604 | if(MANUELL_PWM) PWM = MANUELL_PWM; |
606 | if(MANUELL_PWM) PWM = MANUELL_PWM; |
605 | 607 | ||
606 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
608 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
607 | if(Phase != altPhase) // es gab eine Kommutierung im Interrupt |
609 | if(Phase != altPhase) // es gab eine Kommutierung im Interrupt |
608 | { |
610 | { |
609 | MotorGestoppt = 0; |
611 | MotorGestoppt = 0; |
610 | ZeitFuerBerechnungen = 0; // direkt nach einer Kommutierung ist Zeit |
612 | ZeitFuerBerechnungen = 0; // direkt nach einer Kommutierung ist Zeit |
611 | MinUpmPulse = SetDelay(250); // Timeout, falls ein Motor stehen bleibt |
613 | MinUpmPulse = SetDelay(250); // Timeout, falls ein Motor stehen bleibt |
612 | altPhase = Phase; |
614 | altPhase = Phase; |
613 | } |
615 | } |
614 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
616 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
615 | if(!PWM) // Sollwert == 0 |
617 | if(!PWM) // Sollwert == 0 |
616 | { |
618 | { |
617 | MotorAnwerfen = 0; // kein Startversuch |
619 | MotorAnwerfen = 0; // kein Startversuch |
618 | ZeitFuerBerechnungen = 0; |
620 | ZeitFuerBerechnungen = 0; |
619 | // nach 1,5 Sekunden den Motor als gestoppt betrachten |
621 | // nach 1,5 Sekunden den Motor als gestoppt betrachten |
620 | if(CheckDelay(MotorGestopptTimer)) |
622 | if(CheckDelay(MotorGestopptTimer)) |
621 | { |
623 | { |
622 | DISABLE_SENSE_INT; |
624 | DISABLE_SENSE_INT; |
623 | MotorGestoppt = 1; |
625 | MotorGestoppt = 1; |
624 | STEUER_OFF; |
626 | STEUER_OFF; |
625 | } |
627 | } |
626 | } |
628 | } |
627 | else |
629 | else |
628 | { |
630 | { |
629 | if(MotorGestoppt) MotorAnwerfen = 1; // Startversuch |
631 | if(MotorGestoppt) MotorAnwerfen = 1; // Startversuch |
630 | MotorGestopptTimer = SetDelay(1500); |
632 | MotorGestopptTimer = SetDelay(1500); |
631 | } |
633 | } |
632 | 634 | ||
633 | if(MotorGestoppt && !TEST_SCHUB) PWM = 0; |
635 | if(MotorGestoppt && !TEST_SCHUB) PWM = 0; |
634 | SetPWM(); |
636 | SetPWM(); |
635 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
637 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
636 | if(!ZeitFuerBerechnungen++) |
638 | if(!ZeitFuerBerechnungen++) |
637 | { |
639 | { |
638 | if(MotorGestoppt) PORTD |= GRUEN; //else PORTD &= ~GRUEN; |
640 | if(MotorGestoppt) PORTD |= GRUEN; //else PORTD &= ~GRUEN; |
639 | if(SIO_DEBUG) |
641 | if(SIO_DEBUG) |
640 | { |
642 | { |
641 | DebugAusgaben(); // welche Werte sollen angezeigt werden? |
643 | DebugAusgaben(); // welche Werte sollen angezeigt werden? |
642 | if(!UebertragungAbgeschlossen) SendUart(); |
644 | if(!UebertragungAbgeschlossen) SendUart(); |
643 | else DatenUebertragung(); |
645 | else DatenUebertragung(); |
644 | } |
646 | } |
645 | // Berechnen des Mittleren Stroms zur (langsamen) Strombegrenzung |
647 | // Berechnen des Mittleren Stroms zur (langsamen) Strombegrenzung |
646 | if(CheckDelay(MittelstromTimer)) |
648 | if(CheckDelay(MittelstromTimer)) |
647 | { |
649 | { |
648 | MittelstromTimer = SetDelay(50); // alle 50ms |
650 | MittelstromTimer = SetDelay(50); // alle 50ms |
649 | if(Mittelstrom < Strom) Mittelstrom++;// Mittelwert des Stroms bilden |
651 | if(Mittelstrom < Strom) Mittelstrom++;// Mittelwert des Stroms bilden |
650 | else if(Mittelstrom > Strom) Mittelstrom--; |
652 | else if(Mittelstrom > Strom) Mittelstrom--; |
651 | if(Strom > MAX_STROM) MaxPWM -= MaxPWM / 32; |
653 | if(Strom > MAX_STROM) MaxPWM -= MaxPWM / 32; |
652 | if((Mittelstrom > LIMIT_STROM))// Strom am Limit? |
654 | if((Mittelstrom > LIMIT_STROM))// Strom am Limit? |
653 | { |
655 | { |
654 | if(MaxPWM) MaxPWM--;// dann die Maximale PWM herunterfahren |
656 | if(MaxPWM) MaxPWM--;// dann die Maximale PWM herunterfahren |
655 | PORTC |= ROT; |
657 | PORTC |= ROT; |
656 | } |
658 | } |
657 | else |
659 | else |
658 | { |
660 | { |
659 | if(MaxPWM < MAX_PWM) MaxPWM++; |
661 | if(MaxPWM < MAX_PWM) MaxPWM++; |
660 | } |
662 | } |
661 | } |
663 | } |
662 | 664 | ||
663 | if(CheckDelay(DrehzahlMessTimer)) // Ist-Drehzahl bestimmen |
665 | if(CheckDelay(DrehzahlMessTimer)) // Ist-Drehzahl bestimmen |
664 | { |
666 | { |
665 | DrehzahlMessTimer = SetDelay(10); |
667 | DrehzahlMessTimer = SetDelay(10); |
666 | SIO_Drehzahl = CntKommutierungen;//(6 * CntKommutierungen) / (POLANZAHL / 2); |
668 | SIO_Drehzahl = CntKommutierungen;//(6 * CntKommutierungen) / (POLANZAHL / 2); |
667 | CntKommutierungen = 0; |
669 | CntKommutierungen = 0; |
668 | if(PPM_Timeout == 0) // keine PPM-Signale |
670 | // if(PPM_Timeout == 0) // keine PPM-Signale |
669 | ZeitZumAdWandeln = 1; |
671 | ZeitZumAdWandeln = 1; |
670 | } |
672 | } |
671 | 673 | ||
672 | if(TEST_SCHUB) |
674 | if(TEST_SCHUB) |
673 | { |
675 | { |
674 | if(CheckDelay(TestschubTimer)) |
676 | if(CheckDelay(TestschubTimer)) |
675 | { |
677 | { |
676 | TestschubTimer = SetDelay(1500); |
678 | TestschubTimer = SetDelay(1500); |
677 | switch(test) |
679 | switch(test) |
678 | { |
680 | { |
679 | case 0: PWM = 50; test++; break; |
681 | case 0: PWM = 50; test++; break; |
680 | case 1: PWM = 130; test++; break; |
682 | case 1: PWM = 130; test++; break; |
681 | case 2: PWM = 60; test++; break; |
683 | case 2: PWM = 60; test++; break; |
682 | case 3: PWM = 140; test++; break; |
684 | case 3: PWM = 140; test++; break; |
683 | case 4: PWM = 150; test = 0; break; |
685 | case 4: PWM = 150; test = 0; break; |
684 | default: test = 0; |
686 | default: test = 0; |
685 | } |
687 | } |
686 | } |
688 | } |
687 | } |
689 | } |
688 | // Motor Stehen geblieben |
690 | // Motor Stehen geblieben |
689 | if((CheckDelay(MinUpmPulse) && SIO_Drehzahl == 0) || MotorAnwerfen) |
691 | if((CheckDelay(MinUpmPulse) && SIO_Drehzahl == 0) || MotorAnwerfen) |
690 | { |
692 | { |
691 | MotorGestoppt = 1; |
693 | MotorGestoppt = 1; |
692 | DISABLE_SENSE_INT; |
694 | DISABLE_SENSE_INT; |
693 | MinUpmPulse = SetDelay(100); |
695 | MinUpmPulse = SetDelay(100); |
694 | if(MotorAnwerfen) |
696 | if(MotorAnwerfen) |
695 | { |
697 | { |
696 | PORTC &= ~ROT; |
698 | PORTC &= ~ROT; |
697 | MotorAnwerfen = 0; |
699 | MotorAnwerfen = 0; |
698 | Anwerfen(10); |
700 | Anwerfen(10); |
699 | PORTD |= GRUEN; |
701 | PORTD |= GRUEN; |
700 | MotorGestoppt = 0; |
702 | MotorGestoppt = 0; |
701 | Phase--; |
703 | Phase--; |
702 | PWM = 1; |
704 | PWM = 1; |
703 | SetPWM(); |
705 | SetPWM(); |
704 | SENSE_TOGGLE_INT; |
706 | SENSE_TOGGLE_INT; |
705 | ENABLE_SENSE_INT; |
707 | ENABLE_SENSE_INT; |
706 | MinUpmPulse = SetDelay(20); |
708 | MinUpmPulse = SetDelay(20); |
707 | while(!CheckDelay(MinUpmPulse)); // kurz Synchronisieren |
709 | while(!CheckDelay(MinUpmPulse)); // kurz Synchronisieren |
708 | PWM = 15; |
710 | PWM = 15; |
709 | SetPWM(); |
711 | SetPWM(); |
710 | MinUpmPulse = SetDelay(300); |
712 | MinUpmPulse = SetDelay(300); |
711 | while(!CheckDelay(MinUpmPulse)); // kurz Durchstarten |
713 | while(!CheckDelay(MinUpmPulse)); // kurz Durchstarten |
712 | 714 | ||
713 | // Drehzahlmessung wieder aufsetzen |
715 | // Drehzahlmessung wieder aufsetzen |
714 | DrehzahlMessTimer = SetDelay(50); |
716 | DrehzahlMessTimer = SetDelay(50); |
715 | altPhase = 7; |
717 | altPhase = 7; |
716 | } |
718 | } |
717 | } |
719 | } |
718 | } // ZeitFuerBerechnungen |
720 | } // ZeitFuerBerechnungen |
719 | } // while(1) - Hauptschleife |
721 | } // while(1) - Hauptschleife |
720 | } |
722 | } |
721 | 723 | ||
722 | 724 |