1 |
// DART01A verze programu 1.00 |
1 |
// DART01A verze programu 1.00 |
2 |
// (c)miho 2005 |
2 |
// (c)miho 2005 |
3 |
|
3 |
|
4 |
#include "DART.h" |
4 |
#include "DART.h" |
5 |
|
5 |
|
6 |
|
6 |
|
7 |
#define BEEP0 PIN_A6 // pipak, prvni vystup |
7 |
#define BEEP0 PIN_A6 // pipak, prvni vystup |
8 |
#define BEEP1 PIN_A7 // pipak, druhy vystup |
8 |
#define BEEP1 PIN_A7 // pipak, druhy vystup |
9 |
#define PWM PIN_B3 // PWM vystup pro menic |
9 |
#define PWM PIN_B3 // PWM vystup pro menic |
10 |
#define REFPOWER PIN_B1 // napajeni zdroje Vref |
10 |
#define REFPOWER PIN_B1 // napajeni zdroje Vref |
11 |
#define MOTOR PIN_B2 // zapinani motoru |
11 |
#define MOTOR PIN_B2 // zapinani motoru |
12 |
#define SW0 PIN_B7 // konfiguracni prepinac 0 |
12 |
#define SW0 PIN_B7 // konfiguracni prepinac 0 |
13 |
#define SW1 PIN_B6 // konfiguracni prepinac 1 |
13 |
#define SW1 PIN_B6 // konfiguracni prepinac 1 |
14 |
|
14 |
|
15 |
|
15 |
|
16 |
void InitRS232() |
16 |
void InitRS232() |
17 |
// Inicializace HW RS232 |
17 |
// Inicializace HW RS232 |
18 |
{ |
18 |
{ |
19 |
SPBRG=xclock/9600/16-1; // ryclost 9600Bd |
19 |
SPBRG=xclock/9600/16-1; // ryclost 9600Bd |
20 |
RCSTA=0b10000000; // enable USART |
20 |
RCSTA=0b10000000; // enable USART |
21 |
TXSTA=0b00100100; // BRGH=1, TX enable |
21 |
TXSTA=0b00100100; // BRGH=1, TX enable |
22 |
} |
22 |
} |
23 |
|
23 |
|
24 |
|
24 |
|
25 |
void Putc(char c) |
25 |
void Putc(char c) |
26 |
// Posilani znaku pres HW RS232 |
26 |
// Posilani znaku pres HW RS232 |
27 |
{ |
27 |
{ |
28 |
while(TRMT==0); // cekej na prazdny TX buffer |
28 |
while(TRMT==0); // cekej na prazdny TX buffer |
29 |
TXREG=c; // predej data |
29 |
TXREG=c; // predej data |
30 |
} |
30 |
} |
31 |
|
31 |
|
32 |
|
32 |
|
33 |
// Globalni promenna pro data posilana na SSP |
33 |
// Globalni promenna pro data posilana na SSP |
34 |
// Nastavuje se funkci MotorPatternSet() |
34 |
// Nastavuje se funkci MotorPatternSet() |
35 |
// Vyuziva se v prerusovaci rutine IntSSP() |
35 |
// Vyuziva se v prerusovaci rutine IntSSP() |
36 |
unsigned int8 MotorPattern; // aktualni data pro SSP jednotku |
36 |
unsigned int8 MotorPattern; // aktualni data pro SSP jednotku |
37 |
|
37 |
|
38 |
|
38 |
|
39 |
void MotorPatternSet(unsigned int Gear) |
39 |
void MotorPatternSet(unsigned int Gear) |
40 |
// Na zaklade rychlosti nastavi MotorPattern pro SSP |
40 |
// Na zaklade rychlosti nastavi MotorPattern pro SSP |
41 |
// Rychlost 0 znamena stop, rychlost 8 je maximum |
41 |
// Rychlost 0 znamena stop, rychlost 8 je maximum |
42 |
{ |
42 |
{ |
43 |
// Tabulka rychlost -> pattern pro SSP |
43 |
// Tabulka rychlost -> pattern pro SSP |
44 |
unsigned int8 const ExpTab[8] = {0x02,0x06,0x0e,0x1e,0x3e,0x7e,0xfe,0xff}; |
44 |
unsigned int8 const ExpTab[8] = {0x02,0x06,0x0e,0x1e,0x3e,0x7e,0xfe,0xff}; |
45 |
|
45 |
|
46 |
// Vyber patternu |
46 |
// Vyber patternu |
47 |
if (Gear==0) // stav 0 znamena stop |
47 |
if (Gear==0) // stav 0 znamena stop |
48 |
{ |
48 |
{ |
49 |
output_low(MOTOR); // klidovy stav |
49 |
output_low(MOTOR); // klidovy stav |
50 |
SSPSTAT = 0; |
50 |
SSPSTAT = 0; |
51 |
SSPCON1 = 0; // SPI stop |
51 |
SSPCON1 = 0; // SPI stop |
52 |
disable_interrupts(INT_SSP); // neni preruseni od SSP |
52 |
disable_interrupts(INT_SSP); // neni preruseni od SSP |
53 |
} |
53 |
} |
54 |
else // rizeny vykon |
54 |
else // rizeny vykon |
55 |
{ |
55 |
{ |
56 |
if (Gear>7) // stav 8 a vice znamena plny vykon |
56 |
if (Gear>7) // stav 8 a vice znamena plny vykon |
57 |
{ |
57 |
{ |
58 |
Gear=8; // plny plyn |
58 |
Gear=8; // plny plyn |
59 |
} |
59 |
} |
60 |
|
60 |
|
61 |
MotorPattern=ExpTab[--Gear]; // prevod z hodnoty plynu na data pro SSP |
61 |
MotorPattern=ExpTab[--Gear]; // prevod z hodnoty plynu na data pro SSP |
62 |
output_low(MOTOR); // klidovy stav |
62 |
output_low(MOTOR); // klidovy stav |
63 |
SSPSTAT = 0; |
63 |
SSPSTAT = 0; |
64 |
SSPCON1 = 0x22; // SPI OSC/64 |
64 |
SSPCON1 = 0x22; // SPI OSC/64 |
65 |
|
65 |
|
66 |
SSPBUF=MotorPattern; // prvni data pro vyslani |
66 |
SSPBUF=MotorPattern; // prvni data pro vyslani |
67 |
enable_interrupts(INT_SSP); // az budou vyslana prijde interrupt od SSP |
67 |
enable_interrupts(INT_SSP); // az budou vyslana prijde interrupt od SSP |
68 |
} |
68 |
} |
69 |
} |
69 |
} |
70 |
|
70 |
|
71 |
|
71 |
|
72 |
// Obsluha preruseni od SSP jednotky, posila data z promenne MotorRun do SSP. |
72 |
// Obsluha preruseni od SSP jednotky, posila data z promenne MotorRun do SSP. |
73 |
#INT_SSP |
73 |
#INT_SSP |
74 |
void IntSSP() |
74 |
void IntSSP() |
75 |
{ |
75 |
{ |
76 |
SSPBUF=MotorPattern; // znova hdnota PWM patternu na SSP |
76 |
SSPBUF=MotorPattern; // znova hdnota PWM patternu na SSP |
77 |
} |
77 |
} |
78 |
|
78 |
|
79 |
|
79 |
|
80 |
void MotorSet(unsigned int Gear) |
80 |
void MotorSet(unsigned int Gear) |
81 |
// Nastavi vykon motoru dle hodnoty Gear a zahaji posilani PWM dat pres SSP pod prerusenim |
81 |
// Nastavi vykon motoru dle hodnoty Gear a zahaji posilani PWM dat pres SSP pod prerusenim |
82 |
// od SSP jednotky |
82 |
// od SSP jednotky |
83 |
// 0 stop |
83 |
// 0 stop |
84 |
// 1-7 pocet 1/8 vykonu |
84 |
// 1-7 pocet 1/8 vykonu |
85 |
// >7 plny vykon |
85 |
// >7 plny vykon |
86 |
{ |
86 |
{ |
87 |
// Nastav PWM pattern |
87 |
// Nastav PWM pattern |
88 |
MotorPatternSet(Gear); // nastav PWM pattern pro SSP |
88 |
MotorPatternSet(Gear); // nastav PWM pattern pro SSP |
89 |
|
89 |
|
90 |
// Povol preruseni |
90 |
// Povol preruseni |
91 |
enable_interrupts(GLOBAL); // povol preruseni |
91 |
enable_interrupts(GLOBAL); // povol preruseni |
92 |
} |
92 |
} |
93 |
|
93 |
|
94 |
|
94 |
|
95 |
void InitT0() |
95 |
void InitT0() |
96 |
// Inicializace casovace T0 (cca 1000x za sekundu) |
96 |
// Inicializace casovace T0 (cca 1000x za sekundu) |
97 |
{ |
97 |
{ |
98 |
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); // T0 z internich hodin 1/4 |
98 |
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); // T0 z internich hodin 1/4 |
99 |
enable_interrupts(INT_RTCC); // generuj preruseni od T0 |
99 |
enable_interrupts(INT_RTCC); // generuj preruseni od T0 |
100 |
enable_interrupts(GLOBAL); // povol preruseni |
100 |
enable_interrupts(GLOBAL); // povol preruseni |
101 |
} |
101 |
} |
102 |
|
102 |
|
103 |
|
103 |
|
104 |
// Globalni promenna pro mereni casu |
104 |
// Globalni promenna pro mereni casu |
105 |
// Nastavuje se procedurou TimeSet() |
105 |
// Nastavuje se procedurou TimeSet() |
106 |
// Testuje se funkci TimeIf() |
106 |
// Testuje se funkci TimeIf() |
107 |
// Modifikuje se pri preruseni od casovace IntTo() |
107 |
// Modifikuje se pri preruseni od casovace IntTo() |
108 |
unsigned int16 TimeTime; |
108 |
unsigned int16 TimeTime; |
109 |
|
109 |
|
110 |
|
110 |
|
111 |
void TimerSet(unsigned int16 Time) |
111 |
void TimerSet(unsigned int16 Time) |
112 |
// Nastavi casovac na zadany pocet ms |
112 |
// Nastavi casovac na zadany pocet ms |
113 |
// Test uplynuti casu se dela pomoci TimerIf() |
113 |
// Test uplynuti casu se dela pomoci TimerIf() |
114 |
{ |
114 |
{ |
115 |
// Nastav hodnotu |
115 |
// Nastav hodnotu |
116 |
disable_interrupts(INT_RTCC); // nesmi prijit preruseni |
116 |
disable_interrupts(INT_RTCC); // nesmi prijit preruseni |
117 |
TimeTime=Time; // pri nastavovani hodnoty |
117 |
TimeTime=Time; // pri nastavovani hodnoty |
118 |
enable_interrupts(INT_RTCC); // promenne (o delce vice nez 8 bitu) |
118 |
enable_interrupts(INT_RTCC); // promenne (o delce vice nez 8 bitu) |
119 |
} |
119 |
} |
120 |
|
120 |
|
121 |
|
121 |
|
122 |
int1 TimerIf() |
122 |
int1 TimerIf() |
123 |
// Vraci TRUE pokud casovac jiz dobehl |
123 |
// Vraci TRUE pokud casovac jiz dobehl |
124 |
{ |
124 |
{ |
125 |
int1 Flag; // pomocna promenna |
125 |
int1 Flag; // pomocna promenna |
126 |
|
126 |
|
127 |
// Otestuj casovac |
127 |
// Otestuj casovac |
128 |
disable_interrupts(INT_RTCC); // nesmi prijit preruseni |
128 |
disable_interrupts(INT_RTCC); // nesmi prijit preruseni |
129 |
Flag=(TimeTime==0); // behem testu promenne |
129 |
Flag=(TimeTime==0); // behem testu promenne |
130 |
enable_interrupts(INT_RTCC); // ted uz muze |
130 |
enable_interrupts(INT_RTCC); // ted uz muze |
131 |
|
131 |
|
132 |
// Navratova hodnota |
132 |
// Navratova hodnota |
133 |
return Flag; // TRUE znamena dobehl casovac |
133 |
return Flag; // TRUE znamena dobehl casovac |
134 |
} |
134 |
} |
135 |
|
135 |
|
136 |
|
136 |
|
137 |
// Globalni promenne pro akceleraci |
137 |
// Globalni promenne pro akceleraci |
138 |
// Nastavuje se metodou MotorStart() |
138 |
// Nastavuje se metodou MotorStart() |
139 |
// Pouziva se v obsluze preruseni IntT0() |
139 |
// Pouziva se v obsluze preruseni IntT0() |
140 |
unsigned int8 MotorTime; // aktualni casovac pro rozjezd |
140 |
unsigned int8 MotorTime; // aktualni casovac pro rozjezd |
141 |
unsigned int8 MotorDelay; // spozdeni mezi razenim |
141 |
unsigned int8 MotorDelay; // spozdeni mezi razenim |
142 |
unsigned int8 MotorGear; // rychlostni stupen |
142 |
unsigned int8 MotorGear; // rychlostni stupen |
143 |
|
143 |
|
144 |
|
144 |
|
145 |
void MotorStart(unsigned int8 Delay) |
145 |
void MotorStart(unsigned int8 Delay) |
146 |
// Provede rizeny rozjezd motoru |
146 |
// Provede rizeny rozjezd motoru |
147 |
{ |
147 |
{ |
148 |
disable_interrupts(INT_RTCC); |
148 |
disable_interrupts(INT_RTCC); |
149 |
MotorGear=1; |
149 |
MotorGear=1; |
150 |
MotorDelay=Delay; |
150 |
MotorDelay=Delay; |
151 |
MotorTime=MotorDelay; |
151 |
MotorTime=MotorDelay; |
152 |
enable_interrupts(INT_RTCC); |
152 |
enable_interrupts(INT_RTCC); |
153 |
|
153 |
|
154 |
MotorPatternSet(1); |
154 |
MotorPatternSet(1); |
155 |
} |
155 |
} |
156 |
|
156 |
|
157 |
|
157 |
|
158 |
#INT_TIMER0 |
158 |
#INT_TIMER0 |
159 |
void IntT0() |
159 |
void IntT0() |
160 |
// Preruseni od casovace cca 1000x za sekundu |
160 |
// Preruseni od casovace cca 1000x za sekundu |
161 |
{ |
161 |
{ |
162 |
// Odpocitavani casovace |
162 |
// Odpocitavani casovace |
163 |
if (TimeTime) TimeTime--; |
163 |
if (TimeTime) TimeTime--; |
164 |
|
164 |
|
165 |
// Obsluha akcelerace |
165 |
// Obsluha akcelerace |
166 |
if (MotorTime) MotorTime--; // dekrementuj casovac rozjezdu |
166 |
if (MotorTime) MotorTime--; // dekrementuj casovac rozjezdu |
167 |
if ((MotorGear>0) && (MotorGear<8) && (!MotorTime)) // dalsi rychlostni stupen |
167 |
if ((MotorGear>0) && (MotorGear<8) && (!MotorTime)) // dalsi rychlostni stupen |
168 |
{ |
168 |
{ |
169 |
MotorTime=MotorDelay; // znovu nastav casovac |
169 |
MotorTime=MotorDelay; // znovu nastav casovac |
170 |
MotorGear++; // dalsi rychlost |
170 |
MotorGear++; // dalsi rychlost |
171 |
MotorPatternSet(MotorGear); // nastav rychlost |
171 |
MotorPatternSet(MotorGear); // nastav rychlost |
172 |
} |
172 |
} |
173 |
} |
173 |
} |
174 |
|
174 |
|
175 |
|
175 |
|
176 |
// Cteni dat z AD prevodniku, zadava se cislo kanalu |
176 |
// Cteni dat z AD prevodniku, zadava se cislo kanalu |
177 |
int8 ReadAD(int8 Ch) |
177 |
int8 ReadAD(int8 Ch) |
178 |
{ |
178 |
{ |
179 |
// Pokud merim Vref zapnu si jeho napajeni |
179 |
// Pokud merim Vref zapnu si jeho napajeni |
180 |
if (Ch==4) output_high(REFPOWER); |
180 |
if (Ch==4) output_high(REFPOWER); |
181 |
|
181 |
|
182 |
// Inicializace a cislo kanalu |
182 |
// Inicializace a cislo kanalu |
183 |
ADCON1=0x30; // Vref+-, bez deleni hodin, Left Justify |
183 |
ADCON1=0x30; // Vref+-, bez deleni hodin, Left Justify |
184 |
ADCON0=0x41+(Ch<<3); // on, Tosc/8, cislo kanalu |
184 |
ADCON0=0x41+(Ch<<3); // on, Tosc/8, cislo kanalu |
185 |
|
185 |
|
186 |
// Mereni |
186 |
// Mereni |
187 |
delay_us(50); // doba na prepnuti kanalu |
187 |
delay_us(50); // doba na prepnuti kanalu |
188 |
ADCON0 |= 4; // start prevodu |
188 |
ADCON0 |= 4; // start prevodu |
189 |
delay_us(50); // doba na prevod |
189 |
delay_us(50); // doba na prevod |
190 |
|
190 |
|
191 |
// Vypnu napajeni Vref (vzdycky) |
191 |
// Vypnu napajeni Vref (vzdycky) |
192 |
output_low(REFPOWER); |
192 |
output_low(REFPOWER); |
193 |
|
193 |
|
194 |
// Navrat hodnoty |
194 |
// Navrat hodnoty |
195 |
return ADRESH; |
195 |
return ADRESH; |
196 |
} |
196 |
} |
197 |
|
197 |
|
198 |
|
198 |
|
199 |
void main() |
199 |
void main() |
200 |
{ |
200 |
{ |
201 |
unsigned int8 Debug; |
201 |
unsigned int8 Debug; |
202 |
unsigned int8 i; |
202 |
unsigned int8 i; |
203 |
|
203 |
|
204 |
// Hodiny |
204 |
// Hodiny |
205 |
OSCCON = 0x62; // 4 MHz interni RC oscilator |
205 |
OSCCON = 0x62; // 4 MHz interni RC oscilator |
206 |
|
206 |
|
207 |
// Digitalni vystupy |
207 |
// Digitalni vystupy |
208 |
output_low(PWM); // PWM vystup |
208 |
output_low(PWM); // PWM vystup |
209 |
output_low(MOTOR); // Proud do motoru |
209 |
output_low(MOTOR); // Proud do motoru |
210 |
output_low(REFPOWER); // Napajeni Vref |
210 |
output_low(REFPOWER); // Napajeni Vref |
211 |
port_b_pullups(TRUE); // Zbyvajici vyvody portu B |
211 |
port_b_pullups(TRUE); // Zbyvajici vyvody portu B |
212 |
|
212 |
|
213 |
// Watch Dog |
213 |
// Watch Dog |
214 |
PSA=0; // preddelic prirazen casovaci |
214 |
PSA=0; // preddelic prirazen casovaci |
215 |
WDTCON=0x0E; // Watch Dog cca 130ms |
215 |
WDTCON=0x0E; // Watch Dog cca 130ms |
216 |
|
216 |
|
217 |
// Analogove vstupy |
217 |
// Analogove vstupy |
218 |
ANSEL = 0x1F; // AN0 az AN4 |
218 |
ANSEL = 0x1F; // AN0 az AN4 |
219 |
|
219 |
|
220 |
// nastaveni RS232 |
220 |
// nastaveni RS232 |
221 |
InitRS232(); // inicializace HW RS232 (nutno pockat cca 10ms) |
221 |
InitRS232(); // inicializace HW RS232 (nutno pockat cca 10ms) |
222 |
|
222 |
|
223 |
// Pipnuti (a cekani) |
223 |
// Pipnuti (a cekani) |
224 |
for (i=1;i<30;i++) // pocet 1/2 period |
224 |
for (i=1;i<30;i++) // pocet 1/2 period |
225 |
{ |
225 |
{ |
226 |
int1 beep; // stavova promenna pro pipak |
226 |
int1 beep; // stavova promenna pro pipak |
227 |
|
227 |
|
228 |
output_bit(BEEP0,beep); |
228 |
output_bit(BEEP0,beep); |
229 |
beep=~beep; |
229 |
beep=~beep; |
230 |
output_bit(BEEP1,beep); |
230 |
output_bit(BEEP1,beep); |
231 |
delay_us(1000); |
231 |
delay_us(1000); |
232 |
} |
232 |
} |
233 |
|
233 |
|
234 |
// Rozhodnuti o rezimu cinnosti |
234 |
// Rozhodnuti o rezimu cinnosti |
235 |
Debug=0; |
235 |
Debug=0; |
236 |
if (~input(SW0)) Debug|=1; // precti bit 0 |
236 |
if (~input(SW0)) Debug|=1; // precti bit 0 |
237 |
if (~input(SW1)) Debug|=2; // precti bit 1 |
237 |
if (~input(SW1)) Debug|=2; // precti bit 1 |
238 |
output_low(SW0); // nastav L aby se snizila spotreba |
238 |
output_low(SW0); // nastav L aby se snizila spotreba |
239 |
output_low(SW1); // na obou vstupech |
239 |
output_low(SW1); // na obou vstupech |
240 |
|
240 |
|
241 |
// Zobrazeni rezimu |
241 |
// Zobrazeni rezimu |
242 |
printf(Putc,"\fMode:%d",Debug); |
242 |
printf(Putc,"\fMode:%d",Debug); |
243 |
|
243 |
|
244 |
// Inicializace PWM |
244 |
// Inicializace PWM |
245 |
PR2 = 0x1F; // perioda PWM casovace |
245 |
PR2 = 0x1F; // perioda PWM casovace |
246 |
T2CON = 0x04; // povoleni casovace T2 bez preddelicu a postdelicu |
246 |
T2CON = 0x04; // povoleni casovace T2 bez preddelicu a postdelicu |
247 |
CCP1CON = 0x0C; // PWM mode, lsb bity nulove |
247 |
CCP1CON = 0x0C; // PWM mode, lsb bity nulove |
248 |
CCPR1L = 0; // na zacatku nulova data |
248 |
CCPR1L = 0; // na zacatku nulova data |
249 |
output_low(PWM); // PWM vystup |
249 |
output_low(PWM); // PWM vystup |
250 |
|
250 |
|
251 |
// Inicializace casovace |
251 |
// Inicializace casovace |
252 |
InitT0(); // nastav casovac na cca 1ms |
252 |
InitT0(); // nastav casovac na cca 1ms |
253 |
|
253 |
|
254 |
// Test menice PWM a rozjezdoveho PWM |
254 |
// Test menice PWM a rozjezdoveho PWM |
255 |
if (Debug==1) |
255 |
if (Debug==1) |
256 |
{ |
256 |
{ |
257 |
unsigned int8 Data1; // poteniometr P1 = PWM |
257 |
unsigned int8 Data1; // poteniometr P1 = PWM |
258 |
unsigned int8 Data2; // poteniometr P2 = Rozjezd |
258 |
unsigned int8 Data2; // poteniometr P2 = Rozjezd |
259 |
|
259 |
|
260 |
while (1) |
260 |
while (1) |
261 |
{ |
261 |
{ |
262 |
// watch dog |
262 |
// watch dog |
263 |
restart_wdt(); |
263 |
restart_wdt(); |
264 |
|
264 |
|
265 |
// mereni vstupu |
265 |
// mereni vstupu |
266 |
Data1=ReadAD(0); // nacti parametr pro PWM |
266 |
Data1=ReadAD(0); // nacti parametr pro PWM |
267 |
Data1>>=2; // redukuj rozsah na 0 az 63 |
267 |
Data1>>=2; // redukuj rozsah na 0 az 63 |
268 |
Data2=ReadAD(1); // nacti parametr pro rozjezd |
268 |
Data2=ReadAD(1); // nacti parametr pro rozjezd |
269 |
Data2>>=4; // redukuj rozsah na 0 az 15 |
269 |
Data2>>=4; // redukuj rozsah na 0 az 15 |
270 |
|
270 |
|
271 |
// zobrazeni |
271 |
// zobrazeni |
272 |
printf(Putc,"\nPWM:%03u RUN:%03u",Data1,Data2); |
272 |
printf(Putc,"\nPWM:%03u RUN:%03u",Data1,Data2); |
273 |
delay_ms(20); |
273 |
delay_ms(20); |
274 |
|
274 |
|
275 |
// nastaveni parametru PWM |
275 |
// nastaveni parametru PWM |
276 |
CCPR1L = Data1; |
276 |
CCPR1L = Data1; |
277 |
|
277 |
|
278 |
// nastaveni parametru RUN |
278 |
// nastaveni parametru RUN |
279 |
MotorSet(Data2); |
279 |
MotorSet(Data2); |
280 |
} |
280 |
} |
281 |
} |
281 |
} |
282 |
|
282 |
|
283 |
// Testovani rozjezdu |
283 |
// Testovani rozjezdu |
284 |
// Zadava se cas mezi stupni razeni pro rozjezd v ms |
284 |
// Zadava se cas mezi stupni razeni pro rozjezd v ms |
285 |
if (Debug==2) |
285 |
if (Debug==2) |
286 |
{ |
286 |
{ |
287 |
int8 Data; |
287 |
int8 Data; |
288 |
int8 Start; |
288 |
int8 Start; |
289 |
|
289 |
|
290 |
Start=0; // uvodni stav |
290 |
Start=0; // uvodni stav |
291 |
while(1) |
291 |
while(1) |
292 |
{ |
292 |
{ |
293 |
// Nacti a zobraz parametr |
293 |
// Nacti a zobraz parametr |
294 |
Data=ReadAD(1); // potenciometr P2 = rozjezd |
294 |
Data=ReadAD(1); // potenciometr P2 = rozjezd |
295 |
printf(Putc,"\nRUN: %3ums ",Data); // zobraz |
295 |
printf(Putc,"\nRUN: %3ums ",Data); // zobraz |
296 |
delay_ms(10); // prodleva pro terminal |
296 |
delay_ms(10); // prodleva pro terminal |
297 |
|
297 |
|
298 |
// Uvodni pauza |
298 |
// Uvodni pauza |
299 |
if (Start==0) // spousti se 1x na zacatku |
299 |
if (Start==0) // spousti se 1x na zacatku |
300 |
{ |
300 |
{ |
301 |
Start++; // dalsi stav je cekani |
301 |
Start++; // dalsi stav je cekani |
302 |
TimerSet(2000); // na dokonceni uvodni prodlevy |
302 |
TimerSet(2000); // na dokonceni uvodni prodlevy |
303 |
} |
303 |
} |
304 |
|
304 |
|
305 |
// Rozjezd |
305 |
// Rozjezd |
306 |
if ((Start==1) && TimerIf()) |
306 |
if ((Start==1) && TimerIf()) |
307 |
{ |
307 |
{ |
308 |
Start++; |
308 |
Start++; |
309 |
printf(Putc,"R"); |
309 |
printf(Putc,"R"); |
310 |
MotorStart(Data); // rozjezd s nastavenim prodlevy |
310 |
MotorStart(Data); // rozjezd s nastavenim prodlevy |
311 |
|
311 |
|
312 |
TimerSet(2000); // nastav celkovy cas jizdy |
312 |
TimerSet(2000); // nastav celkovy cas jizdy |
313 |
} |
313 |
} |
314 |
|
314 |
|
315 |
// Zastaveni |
315 |
// Zastaveni |
316 |
if ((Start==2) && TimerIf()) |
316 |
if ((Start==2) && TimerIf()) |
317 |
{ |
317 |
{ |
318 |
Start++; |
318 |
Start++; |
319 |
printf(Putc,"S"); |
319 |
printf(Putc,"S"); |
320 |
MotorSet(0); // pokud dobehl casovac zastav motor |
320 |
MotorSet(0); // pokud dobehl casovac zastav motor |
321 |
} |
321 |
} |
322 |
|
322 |
|
323 |
// watch dog |
323 |
// watch dog |
324 |
restart_wdt(); |
324 |
restart_wdt(); |
325 |
} |
325 |
} |
326 |
} |
326 |
} |
327 |
|
327 |
|
328 |
// Test nabijeciho algoritmu |
328 |
// Test nabijeciho algoritmu |
329 |
if (Debug==3) |
329 |
if (Debug==3) |
330 |
{ |
330 |
{ |
331 |
unsigned int8 PwmOut; // akcni hodnota pro PWM |
331 |
unsigned int8 PwmOut; // akcni hodnota pro PWM |
332 |
unsigned int8 Req; // pozadovana hodnota z P1 |
332 |
unsigned int8 Req; // pozadovana hodnota z P1 |
333 |
unsigned int8 Vref; // merena hodnota vref |
333 |
unsigned int8 Vref; // merena hodnota vref |
334 |
|
334 |
|
335 |
// Inicializace stavove promenne |
335 |
// Inicializace stavove promenne |
336 |
PwmOut=0; |
336 |
PwmOut=0; |
337 |
|
337 |
|
338 |
// Hlavni smycka |
338 |
// Hlavni smycka |
339 |
while (1) |
339 |
while (1) |
340 |
{ |
340 |
{ |
341 |
// watch dog |
341 |
// watch dog |
342 |
restart_wdt(); |
342 |
restart_wdt(); |
343 |
|
343 |
|
344 |
// pozadovana hodnota (potenciometr P1) |
344 |
// pozadovana hodnota (potenciometr P1) |
345 |
Req=ReadAD(0); |
345 |
Req=ReadAD(0); |
346 |
Req=50+(ReadAD(0)>>1); // 50 az 177 |
346 |
Req=50+(ReadAD(0)>>1); // 50 az 177 |
347 |
|
347 |
|
348 |
// napeti na napajeni (vref) |
348 |
// napeti na napajeni (vref) |
349 |
Vref=ReadAD(4); |
349 |
Vref=ReadAD(4); |
350 |
|
350 |
|
351 |
// ricici algoritmus |
351 |
// ricici algoritmus |
352 |
if ((Vref<Req) &&(PwmOut<30)) PwmOut++; |
352 |
if ((Vref<Req) &&(PwmOut<30)) PwmOut++; |
353 |
if ((Vref>=Req)&&(PwmOut> 0)) PwmOut--; |
353 |
if ((Vref>=Req)&&(PwmOut> 0)) PwmOut--; |
354 |
Vref+=10; |
354 |
Vref+=10; |
355 |
if ((Vref<(Req))&&(PwmOut<30)) PwmOut++; // urychleni nabehu |
355 |
if ((Vref<(Req))&&(PwmOut<30)) PwmOut++; // urychleni nabehu |
356 |
|
356 |
|
357 |
// nastaveni parametru PWM |
357 |
// nastaveni parametru PWM |
358 |
if (PwmOut>24) PwmOut=24; // saturace |
358 |
if (PwmOut>24) PwmOut=24; // saturace |
359 |
CCPR1L = PwmOut; // pouziti vystupu |
359 |
CCPR1L = PwmOut; // pouziti vystupu |
360 |
|
360 |
|
361 |
// zobrazeni |
361 |
// zobrazeni |
362 |
printf(Putc,"\nALG:%03u %03u %03u",Req,Vref,PwmOut); |
362 |
printf(Putc,"\nALG:%03u %03u %03u",Req,Vref,PwmOut); |
363 |
delay_ms(10); |
363 |
delay_ms(10); |
364 |
} |
364 |
} |
365 |
} |
365 |
} |
366 |
|
366 |
|
367 |
// Standardni beh |
367 |
// Standardni beh |
368 |
if (Debug==0) |
368 |
if (Debug==0) |
369 |
{ |
369 |
{ |
370 |
unsigned int8 PwmOut; // akcni hodnota pro PWM |
370 |
unsigned int8 PwmOut; // akcni hodnota pro PWM |
371 |
unsigned int8 Req; // pozadovana hodnota z P1 |
371 |
unsigned int8 Req; // pozadovana hodnota z P1 |
372 |
unsigned int8 Vref; // merena hodnota vref |
372 |
unsigned int8 Vref; // merena hodnota vref |
373 |
int1 Run; |
373 |
int1 Run; |
374 |
|
374 |
|
375 |
// Inicializace stavove promenne |
375 |
// Inicializace stavove promenne |
376 |
PwmOut=0; |
376 |
PwmOut=0; |
377 |
TimerSet(14000); // casovani startu |
377 |
TimerSet(14000); // casovani startu |
378 |
Run=1; |
378 |
Run=1; |
379 |
|
379 |
|
380 |
// Hlavni smycka |
380 |
// Hlavni smycka |
381 |
while (1) |
381 |
while (1) |
382 |
{ |
382 |
{ |
383 |
// watch dog |
383 |
// watch dog |
384 |
restart_wdt(); |
384 |
restart_wdt(); |
385 |
|
385 |
|
386 |
// pozadovana hodnota (potenciometr P1) |
386 |
// pozadovana hodnota (potenciometr P1) |
387 |
Req=ReadAD(0); |
387 |
Req=ReadAD(0); |
388 |
Req=50+(ReadAD(0)>>1); // 50 az 177 |
388 |
Req=50+(ReadAD(0)>>1); // 50 az 177 |
389 |
|
389 |
|
390 |
// napeti na napajeni (vref) |
390 |
// napeti na napajeni (vref) |
391 |
Vref=ReadAD(4); |
391 |
Vref=ReadAD(4); |
392 |
|
392 |
|
393 |
// ricici algoritmus |
393 |
// ricici algoritmus |
394 |
if ((Vref<Req) &&(PwmOut<30)) PwmOut++; |
394 |
if ((Vref<Req) &&(PwmOut<30)) PwmOut++; |
395 |
if ((Vref>=Req)&&(PwmOut> 0)) PwmOut--; |
395 |
if ((Vref>=Req)&&(PwmOut> 0)) PwmOut--; |
396 |
Vref+=10; |
396 |
Vref+=10; |
397 |
if ((Vref<(Req))&&(PwmOut<30)) PwmOut++; // urychleni nabehu |
397 |
if ((Vref<(Req))&&(PwmOut<30)) PwmOut++; // urychleni nabehu |
398 |
|
398 |
|
399 |
// nastaveni parametru PWM |
399 |
// nastaveni parametru PWM |
400 |
if (PwmOut>24) PwmOut=24; // saturace |
400 |
if (PwmOut>24) PwmOut=24; // saturace |
401 |
CCPR1L = PwmOut; // pouziti vystupu |
401 |
CCPR1L = PwmOut; // pouziti vystupu |
402 |
|
402 |
|
403 |
// zobrazeni |
403 |
// zobrazeni |
404 |
printf(Putc,"\nALG:%03u %03u %03u",Req,Vref,PwmOut); |
404 |
printf(Putc,"\nALG:%03u %03u %03u",Req,Vref,PwmOut); |
405 |
delay_ms(10); |
405 |
delay_ms(10); |
406 |
|
406 |
|
407 |
// rozjezd |
407 |
// rozjezd |
408 |
if (TimerIf()&&Run) |
408 |
if (TimerIf()&&Run) |
409 |
{ |
409 |
{ |
410 |
Run=0; |
410 |
Run=0; |
411 |
MotorStart(65); |
411 |
MotorStart(65); |
412 |
} |
412 |
} |
413 |
} |
413 |
} |
414 |
} |
414 |
} |
415 |
} |
415 |
} |