Subversion Repositories svnkaklik

Rev

Go to most recent revision | 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
}