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 (pro ladici vystupy) |
17 |
// Inicializace HW RS232 (pro ladici vystupy) |
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 rychlostniho stupne nastavi MotorPattern pro SSP |
40 |
// Na zaklade rychlostniho stupne 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 rychlosti |
141 |
unsigned int8 MotorDelay; // spozdeni mezi razenim rychlosti |
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 |
// Parametrem je prodleva mezi razenim rychlosti v ms |
147 |
// Parametrem je prodleva mezi razenim rychlosti v ms |
148 |
{ |
148 |
{ |
149 |
disable_interrupts(INT_RTCC); |
149 |
disable_interrupts(INT_RTCC); |
150 |
MotorGear=1; |
150 |
MotorGear=1; |
151 |
MotorDelay=Delay; |
151 |
MotorDelay=Delay; |
152 |
MotorTime=MotorDelay; |
152 |
MotorTime=MotorDelay; |
153 |
enable_interrupts(INT_RTCC); |
153 |
enable_interrupts(INT_RTCC); |
154 |
|
154 |
|
155 |
MotorPatternSet(1); |
155 |
MotorPatternSet(1); |
156 |
} |
156 |
} |
157 |
|
157 |
|
158 |
|
158 |
|
159 |
#INT_TIMER0 |
159 |
#INT_TIMER0 |
160 |
void IntT0() |
160 |
void IntT0() |
161 |
// Preruseni od casovace cca 1000x za sekundu |
161 |
// Preruseni od casovace cca 1000x za sekundu |
162 |
{ |
162 |
{ |
163 |
// Odpocitavani casovace |
163 |
// Odpocitavani casovace |
164 |
if (TimeTime) TimeTime--; |
164 |
if (TimeTime) TimeTime--; |
165 |
|
165 |
|
166 |
// Obsluha akcelerace |
166 |
// Obsluha akcelerace |
167 |
if (MotorTime) MotorTime--; // dekrementuj casovac rozjezdu |
167 |
if (MotorTime) MotorTime--; // dekrementuj casovac rozjezdu |
168 |
if ((MotorGear>0) && (MotorGear<8) && (!MotorTime)) // dalsi rychlostni stupen |
168 |
if ((MotorGear>0) && (MotorGear<8) && (!MotorTime)) // dalsi rychlostni stupen |
169 |
{ |
169 |
{ |
170 |
MotorTime=MotorDelay; // znovu nastav casovac |
170 |
MotorTime=MotorDelay; // znovu nastav casovac |
171 |
MotorGear++; // dalsi rychlost |
171 |
MotorGear++; // dalsi rychlost |
172 |
MotorPatternSet(MotorGear); // nastav rychlost |
172 |
MotorPatternSet(MotorGear); // nastav rychlost |
173 |
} |
173 |
} |
174 |
} |
174 |
} |
175 |
|
175 |
|
176 |
|
176 |
|
177 |
// Cteni dat z AD prevodniku, zadava se cislo kanalu |
177 |
// Cteni dat z AD prevodniku, zadava se cislo kanalu |
178 |
int8 ReadAD(int8 Ch) |
178 |
int8 ReadAD(int8 Ch) |
179 |
{ |
179 |
{ |
180 |
// Pokud merim Vref zapnu si jeho napajeni |
180 |
// Pokud merim Vref zapnu si jeho napajeni |
181 |
if (Ch==4) output_high(REFPOWER); |
181 |
if (Ch==4) output_high(REFPOWER); |
182 |
|
182 |
|
183 |
// Inicializace a cislo kanalu |
183 |
// Inicializace a cislo kanalu |
184 |
ADCON1=0x30; // Vref+-, bez deleni hodin, Left Justify |
184 |
ADCON1=0x30; // Vref+-, bez deleni hodin, Left Justify |
185 |
ADCON0=0x41+(Ch<<3); // on, Tosc/8, cislo kanalu |
185 |
ADCON0=0x41+(Ch<<3); // on, Tosc/8, cislo kanalu |
186 |
|
186 |
|
187 |
// Mereni |
187 |
// Mereni |
188 |
delay_us(50); // doba na prepnuti kanalu |
188 |
delay_us(50); // doba na prepnuti kanalu |
189 |
ADCON0 |= 4; // start prevodu |
189 |
ADCON0 |= 4; // start prevodu |
190 |
delay_us(50); // doba na prevod |
190 |
delay_us(50); // doba na prevod |
191 |
|
191 |
|
192 |
// Vypnu napajeni Vref (vzdycky) |
192 |
// Vypnu napajeni Vref (vzdycky) |
193 |
output_low(REFPOWER); |
193 |
output_low(REFPOWER); |
194 |
|
194 |
|
195 |
// Navrat hodnoty |
195 |
// Navrat hodnoty |
196 |
return ADRESH; |
196 |
return ADRESH; |
197 |
} |
197 |
} |
198 |
|
198 |
|
199 |
|
199 |
|
200 |
void main() |
200 |
void main() |
201 |
{ |
201 |
{ |
202 |
unsigned int8 Debug; // Promenna pro rezim cinnosti (stav prepinacu) |
202 |
unsigned int8 Debug; // Promenna pro rezim cinnosti (stav prepinacu) |
203 |
unsigned int8 i; |
203 |
unsigned int8 i; |
204 |
|
204 |
|
205 |
// Hodiny |
205 |
// Hodiny |
206 |
OSCCON = 0x62; // 4 MHz interni RC oscilator |
206 |
OSCCON = 0x62; // 4 MHz interni RC oscilator |
207 |
|
207 |
|
208 |
// Digitalni vystupy |
208 |
// Digitalni vystupy |
209 |
output_low(PWM); // PWM vystup |
209 |
output_low(PWM); // PWM vystup |
210 |
output_low(MOTOR); // Proud do motoru |
210 |
output_low(MOTOR); // Proud do motoru |
211 |
output_low(REFPOWER); // Napajeni Vref |
211 |
output_low(REFPOWER); // Napajeni Vref |
212 |
port_b_pullups(TRUE); // Zbyvajici vyvody portu B |
212 |
port_b_pullups(TRUE); // Zbyvajici vyvody portu B |
213 |
|
213 |
|
214 |
// Watch Dog |
214 |
// Watch Dog |
215 |
PSA=0; // preddelic prirazen casovaci |
215 |
PSA=0; // preddelic prirazen casovaci |
216 |
WDTCON=0x0E; // Watch Dog cca 130ms |
216 |
WDTCON=0x0E; // Watch Dog cca 130ms |
217 |
|
217 |
|
218 |
// Analogove vstupy |
218 |
// Analogove vstupy |
219 |
ANSEL = 0x1F; // AN0 az AN4 |
219 |
ANSEL = 0x1F; // AN0 az AN4 |
220 |
|
220 |
|
221 |
// nastaveni RS232 |
221 |
// nastaveni RS232 |
222 |
InitRS232(); // inicializace HW RS232 (nutno pockat cca 10ms) |
222 |
InitRS232(); // inicializace HW RS232 (nutno pockat cca 10ms) |
223 |
|
223 |
|
224 |
// Pipnuti (a cekani) |
224 |
// Pipnuti (a cekani) |
225 |
for (i=1;i<30;i++) // pocet 1/2 period |
225 |
for (i=1;i<30;i++) // pocet 1/2 period |
226 |
{ |
226 |
{ |
227 |
int1 beep; // stavova promenna pro pipak |
227 |
int1 beep; // stavova promenna pro pipak |
228 |
|
228 |
|
229 |
output_bit(BEEP0,beep); |
229 |
output_bit(BEEP0,beep); |
230 |
beep=~beep; |
230 |
beep=~beep; |
231 |
output_bit(BEEP1,beep); |
231 |
output_bit(BEEP1,beep); |
232 |
delay_us(1000); |
232 |
delay_us(1000); |
233 |
} |
233 |
} |
234 |
|
234 |
|
235 |
// Rozhodnuti o rezimu cinnosti (cteni stavu prepinacu) |
235 |
// Rozhodnuti o rezimu cinnosti (cteni stavu prepinacu) |
236 |
Debug=0; |
236 |
Debug=0; |
237 |
if (~input(SW0)) Debug|=1; // precti bit 0 |
237 |
if (~input(SW0)) Debug|=1; // precti bit 0 |
238 |
if (~input(SW1)) Debug|=2; // precti bit 1 |
238 |
if (~input(SW1)) Debug|=2; // precti bit 1 |
239 |
output_low(SW0); // nastav L aby se snizila spotreba |
239 |
output_low(SW0); // nastav L aby se snizila spotreba |
240 |
output_low(SW1); // na obou vstupech |
240 |
output_low(SW1); // na obou vstupech |
241 |
|
241 |
|
242 |
// Zobrazeni rezimu (na ladici seriovy vystup) |
242 |
// Zobrazeni rezimu (na ladici seriovy vystup) |
243 |
printf(Putc,"\fMode:%d",Debug); |
243 |
printf(Putc,"\fMode:%d",Debug); |
244 |
|
244 |
|
245 |
// Inicializace PWM |
245 |
// Inicializace PWM |
246 |
PR2 = 0x1F; // perioda PWM casovace |
246 |
PR2 = 0x1F; // perioda PWM casovace |
247 |
T2CON = 0x04; // povoleni casovace T2 bez preddelicu a postdelicu |
247 |
T2CON = 0x04; // povoleni casovace T2 bez preddelicu a postdelicu |
248 |
CCP1CON = 0x0C; // PWM mode, lsb bity nulove |
248 |
CCP1CON = 0x0C; // PWM mode, lsb bity nulove |
249 |
CCPR1L = 0; // na zacatku nulova data |
249 |
CCPR1L = 0; // na zacatku nulova data |
250 |
output_low(PWM); // PWM vystup |
250 |
output_low(PWM); // PWM vystup |
251 |
|
251 |
|
252 |
// Inicializace casovace |
252 |
// Inicializace casovace |
253 |
InitT0(); // nastav casovac na cca 1ms |
253 |
InitT0(); // nastav casovac na cca 1ms |
254 |
|
254 |
|
255 |
// Test menice PWM a rozjezdoveho PWM |
255 |
// Test menice PWM a rozjezdoveho PWM |
256 |
// ================================== |
256 |
// ================================== |
257 |
// P1 nastavuje primo stridu hlavniho PWM menice |
257 |
// P1 nastavuje primo stridu hlavniho PWM menice |
258 |
// P2 nastavuje rychlostni stupen spinace motoru (rychlostni stupne 0-8) |
258 |
// P2 nastavuje rychlostni stupen spinace motoru (rychlostni stupne 0-8) |
259 |
// Trvale nacita P1 a P2 a nastavuje podle nich akcni hodnoty menicu |
259 |
// Trvale nacita P1 a P2 a nastavuje podle nich akcni hodnoty menicu |
260 |
if (Debug==1) |
260 |
if (Debug==1) |
261 |
{ |
261 |
{ |
262 |
unsigned int8 Data1; // poteniometr P1 = PWM |
262 |
unsigned int8 Data1; // poteniometr P1 = PWM |
263 |
unsigned int8 Data2; // poteniometr P2 = Rozjezd |
263 |
unsigned int8 Data2; // poteniometr P2 = Rozjezd |
264 |
|
264 |
|
265 |
while (1) |
265 |
while (1) |
266 |
{ |
266 |
{ |
267 |
// watch dog |
267 |
// watch dog |
268 |
restart_wdt(); |
268 |
restart_wdt(); |
269 |
|
269 |
|
270 |
// mereni vstupu |
270 |
// mereni vstupu |
271 |
Data1=ReadAD(0); // nacti parametr pro PWM |
271 |
Data1=ReadAD(0); // nacti parametr pro PWM |
272 |
Data1>>=2; // redukuj rozsah na 0 az 63 |
272 |
Data1>>=2; // redukuj rozsah na 0 az 63 |
273 |
Data2=ReadAD(1); // nacti parametr pro rozjezd |
273 |
Data2=ReadAD(1); // nacti parametr pro rozjezd |
274 |
Data2>>=4; // redukuj rozsah na 0 az 15 |
274 |
Data2>>=4; // redukuj rozsah na 0 az 15 |
275 |
|
275 |
|
276 |
// zobrazeni |
276 |
// zobrazeni |
277 |
printf(Putc,"\nPWM:%03u RUN:%03u",Data1,Data2); |
277 |
printf(Putc,"\nPWM:%03u RUN:%03u",Data1,Data2); |
278 |
delay_ms(20); |
278 |
delay_ms(20); |
279 |
|
279 |
|
280 |
// nastaveni parametru PWM |
280 |
// nastaveni parametru PWM |
281 |
CCPR1L = Data1; |
281 |
CCPR1L = Data1; |
282 |
|
282 |
|
283 |
// nastaveni parametru RUN |
283 |
// nastaveni parametru RUN |
284 |
MotorSet(Data2); |
284 |
MotorSet(Data2); |
285 |
} |
285 |
} |
286 |
} |
286 |
} |
287 |
|
287 |
|
288 |
// Testovani rozjezdu |
288 |
// Testovani rozjezdu |
289 |
// ================== |
289 |
// ================== |
290 |
// P2 nastavuje cas mezi stupni razeni pro rozjezd v ms |
290 |
// P2 nastavuje cas mezi stupni razeni pro rozjezd v ms |
291 |
// Po resetu 2 sekundy pocka, 2 sekundy jede a nakonec zastavi motor |
291 |
// Po resetu 2 sekundy pocka, 2 sekundy jede a nakonec zastavi motor |
292 |
if (Debug==2) |
292 |
if (Debug==2) |
293 |
{ |
293 |
{ |
294 |
int8 Data; |
294 |
int8 Data; |
295 |
int8 Start; |
295 |
int8 Start; |
296 |
|
296 |
|
297 |
Start=0; // uvodni stav |
297 |
Start=0; // uvodni stav |
298 |
while(1) |
298 |
while(1) |
299 |
{ |
299 |
{ |
300 |
// Nacti a zobraz parametr |
300 |
// Nacti a zobraz parametr |
301 |
Data=ReadAD(1); // potenciometr P2 = rozjezd |
301 |
Data=ReadAD(1); // potenciometr P2 = rozjezd |
302 |
printf(Putc,"\nRUN: %3ums ",Data); // zobraz |
302 |
printf(Putc,"\nRUN: %3ums ",Data); // zobraz |
303 |
delay_ms(10); // prodleva pro terminal |
303 |
delay_ms(10); // prodleva pro terminal |
304 |
|
304 |
|
305 |
// Uvodni pauza |
305 |
// Uvodni pauza |
306 |
if (Start==0) // spousti se 1x na zacatku |
306 |
if (Start==0) // spousti se 1x na zacatku |
307 |
{ |
307 |
{ |
308 |
Start++; // dalsi stav je cekani |
308 |
Start++; // dalsi stav je cekani |
309 |
TimerSet(2000); // na dokonceni uvodni prodlevy |
309 |
TimerSet(2000); // na dokonceni uvodni prodlevy |
310 |
} |
310 |
} |
311 |
|
311 |
|
312 |
// Rozjezd |
312 |
// Rozjezd |
313 |
if ((Start==1) && TimerIf()) |
313 |
if ((Start==1) && TimerIf()) |
314 |
{ |
314 |
{ |
315 |
Start++; |
315 |
Start++; |
316 |
printf(Putc,"R"); |
316 |
printf(Putc,"R"); |
317 |
MotorStart(Data); // rozjezd s nastavenim prodlevy |
317 |
MotorStart(Data); // rozjezd s nastavenim prodlevy |
318 |
|
318 |
|
319 |
TimerSet(2000); // nastav celkovy cas jizdy |
319 |
TimerSet(2000); // nastav celkovy cas jizdy |
320 |
} |
320 |
} |
321 |
|
321 |
|
322 |
// Zastaveni |
322 |
// Zastaveni |
323 |
if ((Start==2) && TimerIf()) |
323 |
if ((Start==2) && TimerIf()) |
324 |
{ |
324 |
{ |
325 |
Start++; |
325 |
Start++; |
326 |
printf(Putc,"S"); |
326 |
printf(Putc,"S"); |
327 |
MotorSet(0); // pokud dobehl casovac zastav motor |
327 |
MotorSet(0); // pokud dobehl casovac zastav motor |
328 |
} |
328 |
} |
329 |
|
329 |
|
330 |
// watch dog |
330 |
// watch dog |
331 |
restart_wdt(); |
331 |
restart_wdt(); |
332 |
} |
332 |
} |
333 |
} |
333 |
} |
334 |
|
334 |
|
335 |
// Test nabijeciho algoritmu |
335 |
// Test nabijeciho algoritmu |
336 |
// ========================= |
336 |
// ========================= |
337 |
// P1 nastavuje pozadovane napeti na clancich (meri se Vref vuci napajeni) |
337 |
// P1 nastavuje pozadovane napeti na clancich (meri se Vref vuci napajeni) |
338 |
// Nacitani P1 probiha stale dokola, pro rizeni je pouzit stejny |
338 |
// Nacitani P1 probiha stale dokola, pro rizeni je pouzit stejny |
339 |
// algoritmus jako pro standardni beh |
339 |
// algoritmus jako pro standardni beh |
340 |
if (Debug==3) |
340 |
if (Debug==3) |
341 |
{ |
341 |
{ |
342 |
unsigned int8 PwmOut; // akcni hodnota pro PWM |
342 |
unsigned int8 PwmOut; // akcni hodnota pro PWM |
343 |
unsigned int8 Req; // pozadovana hodnota z P1 |
343 |
unsigned int8 Req; // pozadovana hodnota z P1 |
344 |
unsigned int8 Vref; // merena hodnota vref |
344 |
unsigned int8 Vref; // merena hodnota vref |
345 |
|
345 |
|
346 |
// Inicializace stavove promenne |
346 |
// Inicializace stavove promenne |
347 |
PwmOut=0; |
347 |
PwmOut=0; |
348 |
|
348 |
|
349 |
// Hlavni smycka |
349 |
// Hlavni smycka |
350 |
while (1) |
350 |
while (1) |
351 |
{ |
351 |
{ |
352 |
// watch dog |
352 |
// watch dog |
353 |
restart_wdt(); |
353 |
restart_wdt(); |
354 |
|
354 |
|
355 |
// pozadovana hodnota (potenciometr P1) |
355 |
// pozadovana hodnota (potenciometr P1) |
356 |
Req=ReadAD(0); |
356 |
Req=ReadAD(0); |
357 |
Req=50+(ReadAD(0)>>1); // 50 az 177 |
357 |
Req=50+(ReadAD(0)>>1); // 50 az 177 |
358 |
|
358 |
|
359 |
// napeti na napajeni (vref) |
359 |
// napeti na napajeni (vref) |
360 |
Vref=ReadAD(4); |
360 |
Vref=ReadAD(4); |
361 |
|
361 |
|
362 |
// ricici algoritmus |
362 |
// ricici algoritmus |
363 |
if ((Vref<Req) &&(PwmOut<30)) PwmOut++; |
363 |
if ((Vref<Req) &&(PwmOut<30)) PwmOut++; |
364 |
if ((Vref>=Req)&&(PwmOut> 0)) PwmOut--; |
364 |
if ((Vref>=Req)&&(PwmOut> 0)) PwmOut--; |
365 |
Vref+=10; |
365 |
Vref+=10; |
366 |
if ((Vref<(Req))&&(PwmOut<30)) PwmOut++; // urychleni nabehu |
366 |
if ((Vref<(Req))&&(PwmOut<30)) PwmOut++; // urychleni nabehu |
367 |
|
367 |
|
368 |
// nastaveni parametru PWM |
368 |
// nastaveni parametru PWM |
369 |
if (PwmOut>24) PwmOut=24; // saturace |
369 |
if (PwmOut>24) PwmOut=24; // saturace |
370 |
CCPR1L = PwmOut; // pouziti vystupu |
370 |
CCPR1L = PwmOut; // pouziti vystupu |
371 |
|
371 |
|
372 |
// zobrazeni |
372 |
// zobrazeni |
373 |
printf(Putc,"\nALG:%03u %03u %03u",Req,Vref,PwmOut); |
373 |
printf(Putc,"\nALG:%03u %03u %03u",Req,Vref,PwmOut); |
374 |
delay_ms(10); |
374 |
delay_ms(10); |
375 |
} |
375 |
} |
376 |
} |
376 |
} |
377 |
|
377 |
|
378 |
// Standardni beh |
378 |
// Standardni beh |
379 |
// ============== |
379 |
// ============== |
380 |
// P1 nastavuje pozadovane napeti na clancich |
380 |
// P1 nastavuje pozadovane napeti na clancich |
381 |
// Po resetu cca 14.5 sekundy akumuluje do kondenzatoru a pak provede |
381 |
// Po resetu cca 14.5 sekundy akumuluje do kondenzatoru a pak provede |
382 |
// rozjezd motoru. Po celou dobu probiha rizeni zateze slunecnich clanku. |
382 |
// rozjezd motoru. Po celou dobu probiha rizeni zateze slunecnich clanku. |
383 |
if (Debug==0) |
383 |
if (Debug==0) |
384 |
{ |
384 |
{ |
385 |
unsigned int8 PwmOut; // akcni hodnota pro PWM |
385 |
unsigned int8 PwmOut; // akcni hodnota pro PWM |
386 |
unsigned int8 Req; // pozadovana hodnota z P1 |
386 |
unsigned int8 Req; // pozadovana hodnota z P1 |
387 |
unsigned int8 Vref; // merena hodnota vref |
387 |
unsigned int8 Vref; // merena hodnota vref |
388 |
int1 Run; |
388 |
int1 Run; |
389 |
|
389 |
|
390 |
// Inicializace stavove promenne |
390 |
// Inicializace stavove promenne |
391 |
PwmOut=0; |
391 |
PwmOut=0; |
392 |
TimerSet(14000); // casovani startu |
392 |
TimerSet(14000); // casovani startu |
393 |
Run=1; |
393 |
Run=1; |
394 |
|
394 |
|
395 |
// Hlavni smycka |
395 |
// Hlavni smycka |
396 |
while (1) |
396 |
while (1) |
397 |
{ |
397 |
{ |
398 |
// watch dog |
398 |
// watch dog |
399 |
restart_wdt(); |
399 |
restart_wdt(); |
400 |
|
400 |
|
401 |
// pozadovana hodnota (potenciometr P1) |
401 |
// pozadovana hodnota (potenciometr P1) |
402 |
Req=ReadAD(0); |
402 |
Req=ReadAD(0); |
403 |
Req=50+(ReadAD(0)>>1); // 50 az 177 |
403 |
Req=50+(ReadAD(0)>>1); // 50 az 177 |
404 |
|
404 |
|
405 |
// napeti na napajeni (vref) |
405 |
// napeti na napajeni (vref) |
406 |
Vref=ReadAD(4); |
406 |
Vref=ReadAD(4); |
407 |
|
407 |
|
408 |
// ricici algoritmus |
408 |
// ricici algoritmus |
409 |
if ((Vref<Req) &&(PwmOut<30)) PwmOut++; |
409 |
if ((Vref<Req) &&(PwmOut<30)) PwmOut++; |
410 |
if ((Vref>=Req)&&(PwmOut> 0)) PwmOut--; |
410 |
if ((Vref>=Req)&&(PwmOut> 0)) PwmOut--; |
411 |
Vref+=10; |
411 |
Vref+=10; |
412 |
if ((Vref<(Req))&&(PwmOut<30)) PwmOut++; // urychleni nabehu |
412 |
if ((Vref<(Req))&&(PwmOut<30)) PwmOut++; // urychleni nabehu |
413 |
|
413 |
|
414 |
// nastaveni parametru PWM |
414 |
// nastaveni parametru PWM |
415 |
if (PwmOut>24) PwmOut=24; // saturace |
415 |
if (PwmOut>24) PwmOut=24; // saturace |
416 |
CCPR1L = PwmOut; // pouziti vystupu |
416 |
CCPR1L = PwmOut; // pouziti vystupu |
417 |
|
417 |
|
418 |
// zobrazeni |
418 |
// zobrazeni |
419 |
printf(Putc,"\nALG:%03u %03u %03u",Req,Vref,PwmOut); |
419 |
printf(Putc,"\nALG:%03u %03u %03u",Req,Vref,PwmOut); |
420 |
delay_ms(10); |
420 |
delay_ms(10); |
421 |
|
421 |
|
422 |
// rozjezd |
422 |
// rozjezd |
423 |
if (TimerIf()&&Run) |
423 |
if (TimerIf()&&Run) |
424 |
{ |
424 |
{ |
425 |
Run=0; |
425 |
Run=0; |
426 |
MotorStart(65); |
426 |
MotorStart(65); |
427 |
} |
427 |
} |
428 |
} |
428 |
} |
429 |
} |
429 |
} |
430 |
} |
430 |
} |