/* Program utilizare sensor de acceleratie pentru control turatie motor de curent continuu de tractiune. Conexiuni: AN4 - intrare analogica pentru sensor acceleratie RD8 - Generare soft PWM control motor */ #include #define x _LATD8 // comanda motor _FGS(GWRP_OFF & GCP_OFF); _FOSCSEL(FNOSC_FRC); _FOSC(FCKSM_CSECMD & OSCIOFNC_ON & POSCMD_NONE); _FWDT(FWDTEN_OFF); int i,j,k; int duty; // nivel culoare Red int Countxa = 0; // durata in 1 int Countxb = 0; // Perioada void initadc(void) // initializeza modul AD canal 4 pt poz. volan { _TRISB4=1; // AN4 este conectat la RB4 pin 12 ADPCFG=0xFFEF ; // activare canal 4 AD1CON1bits.AD12B = 1; // Convertor pe 12 biti AD1CON1bits.FORM = 0; // Intreg aliniat dreapta AD1CON1bits.SSRC = 0; // conversie contraolata cu SAMP AD1CON1bits.SIMSAM = 0; AD1CON1bits.ASAM = 0; AD1CHS0=0x04; // selectie canal 4 AD1CON3=0x0005; // T conversie este 5*Tcy AD1CON2=0 ; // fara scanare , IFS0bits.AD1IF = 0; // Clear the A/D int flag IEC0bits.AD1IE = 0; // Desactivare int AD1CON1bits.ADON = 1; // Activare convertor A/D } int readadc() // returneaza valoare ADC1BUF0 { int val; AD1CON1bits.SAMP=1; // start sample for(j=0;j<2;j++); //delay AD1CON1bits.SAMP=0; // start conversie while(!AD1CON1bits.DONE); // astept sfirsit conversie val=ADC1BUF0; IFS0bits.AD1IF = 0; // Readuce contor buffer la zero return (val); } void Init_Timer1( void ) { T1CON = 0; // TCKPS=0, TCS=0, TGATE=0 // clok intern(FRC) 7,37tMhz, perioda de 135,6 nanosecunde // clock timer1 Fcy=2*135,6=271,2 nanosecunde IFS0bits.T1IF = 0; // Reset Timer1 interrupt flag TMR1= 0x0000; // valoare initiala in contor PR1 = 0x001A; // Valoare comparator, intrerupere //la 25 microsecunde IPC0bits.T1IP = 6; // Timer1 int. priority level=4 T1CONbits.TON = 1; // Pornire timer1 IEC0bits.T1IE = 1; // Activare interrupere timer1 } void __attribute__((interrupt,no_auto_psv)) _T1Interrupt( void ) { // survine la 25 microsecunde // IEC0bits.T1IE = 0; // desactibez validare timer 1 IFS0bits.T1IF = 0; //desactivez intrerupere timer T1CONbits.TON = 0; // opresc Timer1 Countxa++; if(Countxa == duty) // Durata in 1 { Countxa = 0; x=0; // } Countxb++; if(Countxb==3000) // T=45 ms { Countxb=0; Countxa = 0; x=1; // } TMR1 = 0; //reincarc timer T1CONbits.TON = 1; // pornesc timer } void delay() { for(i=0;i<2;i=i+1) // delay aprox 27 milisecunde pt i=100 j=0; } void delay1() { for(i=0;i<300;i=i+1) // delay aprox 27 milisecunde pt i=100 j=0; } void main (void) { initadc(); _TRISD8=0; // sens port B<8> Init_Timer1(); for (;;) { k=readadc(); // lectura sensor acceleratie duty=k; // stabileste viteza motor } }