Blame | Last modification | View Log | Download
//----------------------------
// Sagitta - 9. 9. 2005
//----------------------------
#include ".\menic.h"
#define RAZENI 55 // Po kolika ms se bude menit rychlost pri rozjizdeni
#define REFSTART 120 // Hodnota komparatoru odpovidajici 1,7V pri
// nezatizenych solarnich clancich
#define DUTY1 2 // Delka sepnuti PWM v us pro sero
#define DUTY2 20 // Delka sepnuti PWM v us pro jednu zarovku 500W
// Tabulka napeti vuci referencni LED (cca 1,7V)
// hodnota prevodniku / napeti na clancich
// 250 1,6V
// 200 2,1V
// 150 2,8V
// 145 2,9V
// 120 3,6V
// 110 4,0V
#define MENIC PIN_B3 // Spinani tranzistoru menice
#define REFPWR PIN_B1 // Napajeni zdroje referencniho napeti
#define MOTOR PIN_B2 // Spinani tranzistoru motoru
#byte SSPBUF = 0x13 // Registry jednotky SSP
#byte SSPCON1 = 0x14
#byte SSPSTAT = 0x94
// Vzorky pro generovani PWM pomoci SSP
unsigned int8 const Pattern[8] = {0x02,0x06,0x0e,0x1e,0x3e,0x7e,0xfe,0xff};
unsigned int8 MotorPattern;
#INT_SSP
void IntSSP() // Vyvola se po odeslani znaku pres SSP
{
SSPBUF=MotorPattern; // znovu vysli stejnou hodnotu
}
void main()
{
int8 n;
int8 cekej;
int8 perioda;
int8 rozjezd;
// Inicializace casovacu a prevodniku
setup_timer_0(RTCC_INTERNAL);setup_wdt(WDT_1152MS);
setup_adc_ports(ADC_CLOCK_INTERNAL|sAN1|sAN4|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
setup_spi(FALSE);
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
output_low(MENIC); // Vsechno zastav
output_low(MOTOR);
output_low(REFPWR);
set_adc_channel(4); // Vyber AD kanal pro pomerne mereni napeti
set_pwm1_duty(0); // Spust PWM, ale zatim s trvalou 0 na vystupu
setup_ccp1(CCP_PWM); // PWM pro zatizeni clanku v seru
setup_timer_2(T2_DIV_BY_1,100,1); // perioda PWM
setup_oscillator(OSC_4MHZ|OSC_INTRC); // rozjed PIC (zvysi se odber)
// jsme v depu?
set_pwm1_duty(DUTY1); // delka sepnuti
do
{
output_low(REFPWR);
delay_ms(100);
output_high(REFPWR); // zapni napajeni napetove reference (LED)
delay_ms(20);
} while (read_adc()>REFSTART); // Odkryl starter clanky?
output_low(REFPWR);
// Precti trimr
set_adc_channel(1); // Zjisteni nastaveni trimru PWM
delay_us(100); // Pockej na prepnuti kanalu A/D prevodniku
perioda=(read_adc()>>1)+40; // rozsah: 40 az 167
set_pwm1_duty(0); // Zastav PWM, aby slo zmenit periodu
setup_timer_2(T2_DIV_BY_1,perioda,1); // Zapis nastavenou periodu
// nabíjíme
set_pwm1_duty(DUTY2); // delka sepnuti PWM
delay_ms(12500);
// rozjezd
SSPSTAT = 0; // inicializace SPI jednotky
SSPCON1 = 0x22; // SPI OSC/64
MotorPattern=Pattern[0];
SSPBUF=MotorPattern; // 1. data pro vyslani
enable_interrupts(global);
enable_interrupts(INT_SSP); // az budou vyslana, prijde preruseni
for(n=0; n<=7; n++) // razeni osmi rychlostnich stupnu
{
MotorPattern=Pattern[n];
delay_ms(RAZENI); // Pockej na dalsi razeni
};
SSPSTAT = 0;
SSPCON1 = 0; // SPI stop
disable_interrupts(INT_SSP); // zastav preruseni od SSP
// jedem co to da
output_high(MOTOR);
delay_ms(1300); // dyl jak 1,3s bysme nemeli jet :)
output_low(MOTOR); // zastav motor
// Menic je stale zapnut a zatezuje clanky
while(TRUE); // Cekej, dokud se neztrati svetlo,
// nebo prijde WatchDog
}