// #define __dsPIC33FJ64MC202__ #include #include #include //#include "slnode11dspic.c" #include "slnode.h" #include "adc.h" // Three phase driver test // option bits, -> .h _FBS(RBS_NO_RAM & BSS_NO_BOOT_CODE & BWRP_WRPROTECT_OFF); // no change _FSS(RSS_NO_RAM & SSS_NO_FLASH & SWRP_WRPROTECT_OFF); // no change _FGS(GSS_OFF & GCP_OFF & GWRP_OFF); // probably no change _FOSCSEL(FNOSC_PRI & IESO_ON); // clock option 1 _FOSC(FCKSM_CSECMD & IOL1WAY_OFF & OSCIOFNC_ON & POSCMD_HS); // clk opt main _FWDT(FWDTEN_OFF & WINDIS_OFF & WDTPRE_PR128 & WDTPOST_PS32768); // WDT _FPOR(PWMPIN_ON & HPOL_OFF & LPOL_OFF // PWM init state, should be condidered & ALTI2C_OFF & FPWRT_PWR64); // not significant _FICD(JTAGEN_OFF & ICS_PGD3); // ICS should be set to using PG port _FUID0(0x19); _FUID1(0x74); _FUID2(0x03); _FUID3(0x31); // user id void OnPWMCycle(void); // include sub soruce #include "MouseHardware.c" // void ClockUp(void) : staring up PLL clock // void IORemapping(void) : remapping for UART to RP8 & 9 // void SetupMCPWM(void) : init MCPWM // void SetDutyCycle(unsigned int ph1,unsigned int ph2,unsigned int ph3) : set PWM, 0- raw // void SetOutput(int ph1,int ph2,int ph3) : set output +-500 // void DisablePWM(void) // void EnablePWM(void) // int SetupADC(void) : setup AD with DMA // int Cosine(int x) : 16bit input 16bit output quasi-cosine volatile long PWMsysclock=0; volatile long AD[4]; // called on each PWM cycle void OnPWMCycle(void) { // y=(1-r)y+ru // y=y+r(u-y) //AD+=(ADC<>N //AD+=(ADC-AD>>N) #define ADS 1 #define ADFLT(d,s) d=d-((d+0x1ff)>>7)+(signed int)(s) //AD[0]=ADCbufferA[0]; //AD[1]=ADCbufferA[1]; //AD[2]=ADCbufferA[2]; //AD[3]=ADCbufferA[3]; ADFLT(AD[0],ADCbufferA[0]); ADFLT(AD[1],ADCbufferA[1]); ADFLT(AD[2],ADCbufferA[2]); ADFLT(AD[3],ADCbufferA[3]); PWMsysclock++; } #include "ADNS6010srom.c" #define MNCS0 LATBbits.LATB3 #define MNCS1 LATBbits.LATB2 #define MNCS2 LATBbits.LATB1 #define MNCS3 LATBbits.LATB0 #define MNCSM 0x000f #define SETMNCS LATB=LATB|MNCSM #define CLRMNCS LATB=LATB&(~MNCSM) #define MMISO0 PORTBbits.RB12 #define MMISO1 PORTBbits.RB13 #define MMISO2 PORTBbits.RB14 #define MMISO3 PORTBbits.RB15 #define MSCLK LATBbits.LATB11 #define MMOSI LATBbits.LATB10 #define MRESET LATBbits.LATB4 #define MNPD LATBbits.LATB7 #define MTRIS 0xf360 // IS NPD,RES,NCS,SCLK,MOSI=out(0) 1111 0011 01100000 #define DEBUGPIN LATAbits.LATA4 #define PINDON DEBUGPIN=1; #define PINDOFF DEBUGPIN=0; unsigned char AR0,AR1,AR2,AR3; void ReadValues(unsigned char addr) { int i; long ns; PINDON; TRISB=MTRIS; // IS NCS,SCLK,MOSI=out 10 0010 11 addr=addr&0x7f; for(i=0;i<10;i++) SETMNCS; for(i=0;i<10;i++) CLRMNCS; for(i=0;i<8;i++) { MSCLK=0; MSCLK=0; MMOSI=(addr&0x80)?1:0; addr=addr<<1; MSCLK=0; MSCLK=1; MSCLK=1; MSCLK=1; } ns=PWMsysclock; while(PWMsysclock TPHardware.c LATB=0x0; LATA=0x0; TRISA=0xffef; // RA4 out //TRISB=0x037f; // RB10-15 out(PWM), RB7=out(test point, debug) //TRISA=0x000f; // RA4 out(Fault clear) //PORTAbits.RA4=1; ClockUp(); IORemapping(); SetupMCPWM(); DisablePWM(); SetupADC(); InitializeSerialLoop(1,SLB115200,4,"ADNSSensorNode"); for(i=0;i<16;i++) ADCbufferA[i]=i*0x11; for(i=0;i<16;i++) { RegFileS[i]=0; RegFileL[i]=0; } i=0; c=0; l=0; DeviceReset(); DownloadROM(); InitParams(); for(i=0;iPWMsysclock) ; DownloadROM(); SLReply32(63,1,0x12345678); while(1) { // lock to 1kHz, 20kHz 20cycle. cyclerest=ns-PWMsysclock; // it should be >=0 anytime, but single -1 should be fine while(ns>PWMsysclock) ; ns+=20; RegFileL[0]++; c++; l++; MotionRead(); for(i=0;i>ADS; y[3]=AD[1]>>ADS; } // report cycle info (not necessary) if(c>=(RegFileS[2]&0x1ff)) { switch(RegFileS[2]&0xc00) { case 0x000: case 0x400: // req x if(RegFileS[2]&0x1000) SLReply16(63,4,x[0]); if(RegFileS[2]&0x2000) SLReply16(63,5,x[1]); if(RegFileS[2]&0x4000) SLReply16(63,6,x[2]); if(RegFileS[2]&0x8000) SLReply16(63,7,x[3]); break; case 0x800: // req y if(RegFileS[2]&0x1000) SLReply16(63,4,y[0]); if(RegFileS[2]&0x2000) SLReply16(63,5,y[1]); if(RegFileS[2]&0x4000) SLReply16(63,6,y[2]); if(RegFileS[2]&0x8000) SLReply16(63,7,y[3]); break; case 0xc00: // req x&y if(RegFileS[2]&0x1000) SLReply32(63,4,((unsigned long)(y[0])<<16)|((unsigned long)(x[0])&0xffff)); if(RegFileS[2]&0x2000) SLReply32(63,5,((unsigned long)(y[1])<<16)|((unsigned long)(x[1])&0xffff)); if(RegFileS[2]&0x4000) SLReply32(63,6,((unsigned long)(y[2])<<16)|((unsigned long)(x[2])&0xffff)); if(RegFileS[2]&0x8000) SLReply32(63,7,((unsigned long)(y[3])<<16)|((unsigned long)(x[3])&0xffff)); break; } c=0; } if((RegFileS[2]&0x200)&&((l&0xfff)==(0xfff))) { { SLReply32(63,15,cyclerest); SLReply32(63,14,PWMsysclock-lastclock); SLReply16(63,13,(ReadValue(0x0d)<<8)|ReadValue(0x0c)); SLReply16(63,12,(ReadValue(0x11)<<8)|ReadValue(0x10)); SLReply16(63,11,(ReadValue(0x1a)<<8)|ReadValue(0x19)); SLReply16(63,10,(ReadValue(0x1c)<<8)|ReadValue(0x1b)); SLReply16(63, 9,(ReadValue(0x1e)<<8)|ReadValue(0x1d)); SLReply16(63, 8,ReadValue(0x1f)); SLReply16(63, 7,(ReadValue(0x2d)<<8)|ReadValue(0x2c)); SLReply16(63, 6,(ReadValue(0x0b)<<8)|ReadValue(0x0a)); } lastclock=PWMsysclock; } } }