extern void timerStop(timer * pTimer) { switch(pTimer->m_TimerNumber) { case 1: CloseTimer1(); break; case 2: CloseTimer2(); break; case 3: CloseTimer3(); break; case 4: CloseTimer4(); break; case 5: CloseTimer5(); break; } }
void fis_stop_expFis(void){ //ISR DisableIntT5; DisableIntT4; DisableIntADC1; #if (SCH_FISICA_VERBOSE>=1) con_printf("expFis ISRs are down..\r\n"); #endif //Modules CloseTimer4(); CloseTimer5(); CloseADC10(); }
char Stepper_End(void) { if (stepperState == off) return ERROR; dbprintf("\nTerminating Stepper module"); T3CONbits.ON = 0; // halt timer3 stepperState = off; ShutDownDrive(); // turn hardware pins back to inputs TRIS_COIL_A_DIRECTION = 1; TRIS_COIL_A_ENABLE = 1; TRIS_COIL_B_DIRECTION = 1; TRIS_COIL_B_ENABLE = 1; // reset module variables stepCount = 0; overflowReps = 0; coilState = step_one; // turn off timer and interrupt CloseTimer5(); return SUCCESS; }
void vMBPortTimersDisable(void){ /* Disable any pending timers. */ CloseTimer5(); }
/**************************************************************************** Function: Timer5IntHandler Parameters: None. Returns: None. Description Implements the Stepper motor FULL STEP drive state machine. Notes Author: Gabriel Hugh Elkaim, 2011.12.15 16:42 ****************************************************************************/ void __ISR(_TIMER_3_VECTOR, ipl4) Timer3IntHandler(void) { static unsigned short timerLoopCount = 0; LED_BANK1_0 ^= 1; if (++timerLoopCount > overflowReps) { timerLoopCount = 0; LED_BANK1_1 ^= 1; // execute Stepper Drive state machine here switch(stepperState) { case off: // should not get here dbprintf("\noff"); T5CONbits.ON = 0; // halt timer5 ShutDownDrive(); CloseTimer5(); break; case inited: case halted: case waiting: ShutDownDrive(); if (stepCount < 0) stepCount = 0; LED_BANK1_2 ^= 1; break; //------------------- Full-Step -------------------------- case stepping: switch(stepperMode) { case full: if (--stepCount <= 0) stepperState = waiting; LED_BANK1_3 ^= 1; TurnOnDrive(); // enable both coils switch(coilState) { case step_one: // coil drive both forward ADirectionOn(); BDirectionOn(); if (stepDir == FORWARD) coilState = step_two; else coilState = step_four; break; case step_two: // coil drive A forward, B reverse ADirectionOn(); BDirectionOff(); if (stepDir == FORWARD) coilState = step_three; else coilState = step_one; break; case step_three: // coil drive both reverse ADirectionOff(); BDirectionOff(); if (stepDir == FORWARD) coilState = step_four; else coilState = step_two; break; case step_four: // coild drive A reverse, B forward ADirectionOff(); BDirectionOn(); if (stepDir == FORWARD) coilState = step_one; else coilState = step_three; break; } // end of full-step drive break; //------------------- Wave Drive ------------------------ case wave: if (--stepCount <= 0) stepperState = waiting; LED_BANK1_3 ^= 1; switch(coilState) { case step_one: // coil drive both forward AEnable(); BDisable(); ADirectionOn(); if (stepDir == FORWARD) coilState = step_two; else coilState = step_four; printf("\nStep one, wave"); break; case step_two: // coil drive A forward, B reverse ADisable(); BEnable(); BDirectionOff(); if (stepDir == FORWARD) coilState = step_three; else coilState = step_one; printf("\nStep two, wave"); break; case step_three: // coil drive both reverse AEnable(); BDisable(); ADirectionOff(); if (stepDir == FORWARD) coilState = step_four; else coilState = step_two; printf("\nStep three, wave"); break; case step_four: // coild drive A reverse, B forward ADisable(); BEnable(); BDirectionOn(); if (stepDir == FORWARD) coilState = step_one; else coilState = step_three; printf("\nStep four, wave"); break; } // end of wave drive break; //------------------- Half Step -------------------------- case half: if (--stepCount <= 0) stepperState = waiting; LED_BANK1_3 ^= 1; switch(coilState) { case step_one: // coil drive both forward AEnable(); BEnable(); ADirectionOn(); BDirectionOn(); if (stepDir == FORWARD) coilState = step_two; else coilState = step_eight; break; case step_two: // coil drive A forward, B reverse AEnable(); BDisable(); ADirectionOn(); BDirectionOff(); if (stepDir == FORWARD) coilState = step_three; else coilState = step_one; break; case step_three: // coil drive both reverse AEnable(); BEnable(); ADirectionOn(); if (stepDir == FORWARD) coilState = step_four; else coilState = step_two; break; case step_four: // coild drive A reverse, B forward ADisable(); BEnable(); BDirectionOff(); if (stepDir == FORWARD) coilState = step_five; else coilState = step_three; break; case step_five: // coil drive both forward AEnable(); BEnable(); ADirectionOff(); // ? BDirectionOff(); if (stepDir == FORWARD) coilState = step_six; else coilState = step_four; break; case step_six: // coil drive A forward, B reverse AEnable(); BDisable(); ADirectionOff(); if (stepDir == FORWARD) coilState = step_seven; else coilState = step_five; break; case step_seven: // coil drive both reverse AEnable(); BEnable(); ADirectionOff(); BDirectionOn(); if (stepDir == FORWARD) coilState = step_eight; else coilState = step_six; break; case step_eight: // coild drive A reverse, B forward ADisable(); BEnable(); BDirectionOn(); if (stepDir == FORWARD) coilState = step_one; else coilState = step_seven; break; } // end of half-step drive break; } // end of switch(stepperMode) } // end of switch(stepperState) } mT3ClearIntFlag(); }
int main(int argc, char** argv) { /*Configuring POSC with PLL, with goal FOSC = 80 MHZ */ // Configure PLL prescaler, PLL postscaler, PLL divisor // Fin = 8 Mhz, 8 * (40/2/2) = 80 PLLFBD = 18; // M=40 // change to 38 for POSC 80 Mhz - this worked only on a single MCU for uknown reason CLKDIVbits.PLLPOST = 0; // N2=2 CLKDIVbits.PLLPRE = 0; // N1=2 // Initiate Clock Switch to Primary Oscillator with PLL (NOSC=0b011) //__builtin_write_OSCCONH(0x03); // tune FRC OSCTUN = 23; // 23 * 0.375 = 8.625 % -> 7.37 Mhz * 1.08625 = 8.005Mhz // Initiate Clock Switch to external oscillator NOSC=0b011 (alternative use FRC with PLL (NOSC=0b01) __builtin_write_OSCCONH(0b011); __builtin_write_OSCCONL(OSCCON | 0x01); // Wait for Clock switch to occur while (OSCCONbits.COSC!= 0b011); // Wait for PLL to lock while (OSCCONbits.LOCK!= 1); // local variables in main function int status = 0; int i = 0; int ax = 0, ay = 0, az = 0; int statusProxi[8]; int slowLoopControl = 0; UINT16 timerVal = 0; float timeElapsed = 0.0; //extern UINT8 pwmMotor; extern UINT16 speakerAmp_ref; extern UINT16 speakerFreq_ref; extern UINT8 proxyStandby; UINT16 dummy = 0x0000; setUpPorts(); delay_t1(50); PWMInit(); delay_t1(50); ctlPeltier = 0; PeltierVoltageSet(ctlPeltier); FanCooler(0); diagLED_r[0] = 100; diagLED_r[1] = 0; diagLED_r[2] = 0; LedUser(diagLED_r[0], diagLED_r[1],diagLED_r[2]); // Speaker initialization - set to 0,1 spi1Init(2, 0); speakerAmp_ref = 0; speakerAmp_ref_old = 10; speakerFreq_ref = 1; speakerFreq_ref_old = 10; int count = 0; UINT16 inBuff[2] = {0}; UINT16 outBuff[2] = {0}; while (speakerAmp_ref != speakerAmp_ref_old) { if (count > 5 ) { // Error ! //LedUser(100, 0, 0); break; } inBuff[0] = (speakerAmp_ref & 0x0FFF) | 0x1000; chipSelect(slaveVib); status = spi1TransferWord(inBuff[0], outBuff); chipDeselect(slaveVib); chipSelect(slaveVib); status = spi1TransferWord(inBuff[0], &speakerAmp_ref_old); chipDeselect(slaveVib); count++; } count = 0; while (speakerFreq_ref != speakerFreq_ref_old) { if (count > 5 ) { // Error ! //LedUser(0, 100, 0); break; } inBuff[0] = (speakerFreq_ref & 0x0FFF) | 0x2000; chipSelect(slaveVib); status = spi1TransferWord(inBuff[0], outBuff); chipDeselect(slaveVib); chipSelect(slaveVib); status = spi1TransferWord(inBuff[0], &speakerFreq_ref_old); chipDeselect(slaveVib); count++; } accPin = aSlaveR; accPeriod = 1.0 / ACC_RATE * 1000000.0; // in us; for ACC_RATE = 3200 Hz it should equal 312.5 us status = adxl345Init(accPin); ax = status; delay_t1(5); /* Init FFT coefficients */ TwidFactorInit(LOG2_FFT_BUFF, &Twiddles_array[0],0); delta_freq = (float)ACC_RATE / FFT_BUFF; // read 100 values to calculate bias int m; int n = 0; for (m = 0; m < 100; m++) { status = readAccXYZ(accPin, &ax, &ay, &az); if (status <= 0) { // } else { ax_b_l += ax; ay_b_l += ay; az_b_l += az; n++; } delay_t1(1); } ax_b_l /= n; ay_b_l /= n; az_b_l /= n; _SI2C2IE = 0; _SI2C2IF = 0; // Proximity sensors initalization I2C1MasterInit(); status = VCNL4000Init(); // Cooler temperature sensors initalization status = adt7420Init(0, ADT74_I2C_ADD_mainBoard); delay_t1(1); muxCh = I2C1ChSelect(1, 6); status = adt7420Init(0, ADT74_I2C_ADD_flexPCB); // Temperature sensors initialization statusTemp[0] = adt7320Init(tSlaveF, ADT_CONT_MODE | ADT_16_BIT); delay_t1(5); statusTemp[1] = adt7320Init(tSlaveR, ADT_CONT_MODE | ADT_16_BIT); delay_t1(5); statusTemp[2] = adt7320Init(tSlaveB, ADT_CONT_MODE | ADT_16_BIT); delay_t1(5); statusTemp[3] = adt7320Init(tSlaveL, ADT_CONT_MODE | ADT_16_BIT); delay_t1(5); // Temperature estimation initialization for (i = 0; i < 50; i++) { adt7320ReadTemp(tSlaveF, &temp_f); delay_t1(1); adt7320ReadTemp(tSlaveL, &temp_l); delay_t1(1); adt7320ReadTemp(tSlaveB, &temp_b); delay_t1(1); adt7320ReadTemp(tSlaveR, &temp_r); delay_t1(1); } tempBridge[0] = temp_f; tempBridge[1] = temp_r; tempBridge[2] = temp_b; tempBridge[3] = temp_l; if (statusTemp[0] != 1) temp_f = -1; if (statusTemp[1] != 1) temp_r = -1; if (statusTemp[2] != 1) temp_b = -1; if (statusTemp[3] != 1) temp_l = -1; // CASU ring average temperature temp_casu = 0; tempNum = 0; tempSensors = 0; for (i = 0; i < 4; i++) { if (statusTemp[i] == 1 && tempBridge[i] > 20 && tempBridge[i] < 60) { tempNum++; temp_casu += tempBridge[i]; tempSensors++; } } if (tempNum > 0) temp_casu /= tempNum; else temp_casu = -1; temp_casu1 = temp_casu; temp_wax = temp_casu; temp_wax1 = temp_casu; temp_model = temp_wax; temp_old[0] = temp_f; temp_old[1] = temp_r; temp_old[2] = temp_b; temp_old[3] = temp_l; temp_old[4] = temp_flexPCB; temp_old[5] = temp_pcb; temp_old[6] = temp_casu; temp_old[7] = temp_wax; for (i = 0; i < 4; i++) { uref_m[i] = temp_wax; } // Configure i2c2 as a slave device and interrupt priority 5 I2C2SlaveInit(I2C2_CASU_ADD, BB_I2C_INT_PRIORITY); // delay for 2 sec for(i = 0; i < 4; i ++) { delay_t1(500); ClrWdt(); } while (i2cStarted == 0) { delay_t1(200); ClrWdt(); } dma0Init(); dma1Init(); CloseTimer4(); ConfigIntTimer4(T4_INT_ON | TEMP_LOOP_PRIORITY); OpenTimer4(T4_ON | T4_PS_1_256, ticks_from_ms(2000, 256)); CloseTimer5(); ConfigIntTimer5(T5_INT_ON | FFT_LOOP_PRIORITY); OpenTimer5(T5_ON | T5_PS_1_256, ticks_from_ms(1000, 256)); diagLED_r[0] = 0; diagLED_r[1] = 0; diagLED_r[2] = 0; LedUser(diagLED_r[0], diagLED_r[1],diagLED_r[2]); start_acc_acquisition(); while(1) { ConfigIntTimer2(T2_INT_OFF); // Disable timer interrupt IFS0bits.T2IF = 0; // Clear interrupt flag OpenTimer2(T2_ON | T2_PS_1_256, 65535); // Configure timer if (!proxyStandby) { statusProxi[0] = I2C1ChSelect(1, 2); // Front proxy_f = VCNL4000ReadProxi(); delay_t1(1); statusProxi[1] = I2C1ChSelect(1, 4); // Back right proxy_br = VCNL4000ReadProxi(); delay_t1(1); statusProxi[2] = I2C1ChSelect(1, 3); // Front right proxy_fr = VCNL4000ReadProxi(); delay_t1(1); statusProxi[3] = I2C1ChSelect(1, 5); // Back proxy_b = VCNL4000ReadProxi(); delay_t1(1); statusProxi[4] = I2C1ChSelect(1, 0); // Back left proxy_bl = VCNL4000ReadProxi(); delay_t1(1); statusProxi[5] = I2C1ChSelect(1, 1); // Front left proxy_fl = VCNL4000ReadProxi(); delay_t1(1); } else { proxy_f = 0; // Front proxy_br = 0; // Back right proxy_fr = 0; // Front right proxy_b = 0; // Back proxy_bl = 0; // Back left proxy_fl = 0; // Front left } if (timer4_flag == 1) { // every 2 seconds CloseTimer4(); ConfigIntTimer4(T4_INT_ON | TEMP_LOOP_PRIORITY); timer4_flag = 0; if (dma_spi2_started == 0) { OpenTimer4(T4_ON | T4_PS_1_256, ticks_from_ms(2000, 256)); skip_temp_filter++; tempLoop(); } else { OpenTimer4(T4_ON | T4_PS_1_256, ticks_from_ms(50, 256)); } } if (dma_spi2_done == 1) { fftLoop(); dma_spi2_done = 0; } if ((timer5_flag == 1) || (new_vibration_reference == 1)) { // every 1 seconds CloseTimer5(); ConfigIntTimer5(T5_INT_ON | FFT_LOOP_PRIORITY); OpenTimer5(T5_ON | T5_PS_1_256, ticks_from_ms(1000, 256)); timer5_flag = 0; if (new_vibration_reference == 1) { //if(1){ CloseTimer3(); dma0Stop(); dma1Stop(); spi2Init(2, 0); dma0Init(); dma1Init(); chipDeselect(aSlaveR); IFS0bits.DMA0IF = 0; delay_t1(30); // transient response } new_vibration_reference = 0; start_acc_acquisition(); } // Cooler fan control if (fanCtlOn == 1) { if (temp_pcb >= 25 && fanCooler == FAN_COOLER_OFF) fanCooler = FAN_COOLER_ON; else if (temp_pcb <= 24 && fanCooler == FAN_COOLER_ON) fanCooler = FAN_COOLER_OFF; // In case of I2C1 fail turn on the fan if ((proxy_f == 0xFFFF) && (proxy_fr == 0xFFFF) && (proxy_br == 0xFFFF) && (proxy_b == 0xFFFF) && (proxy_bl == 0xFFFF) && (proxy_fl == 0xFFFF)) fanCooler = FAN_COOLER_ON; } else if (fanCtlOn == 2) fanCooler = FAN_COOLER_ON; else fanCooler = FAN_COOLER_OFF; //TEST // temp_f = temp_model; // if (temp_ref < 30) { // temp_r = smc_parameters[0] * 10; // } // else { // temp_r = smc_parameters[0] / 2.0 * 10.0; // } // temp_r = alpha*10; // temp_b = sigma_m * 10; // temp_l = sigma * 10; //temp_flexPCB = temp_ref_ramp; /* proxy_f = dma_spi2_started; proxy_fl = dma_spi2_done; proxy_bl = new_vibration_reference; proxy_b = timer5_flag; proxy_br = timer4_flag; */ int dummy_filt = 0; for (i = 0; i < 8; i++) { if (index_filter[i] > 0){ dummy_filt++; } } if (dummy_filt > 0) { filtered_glitch = dummy_filt; //for (i = 0; i< 8; index_filter[i++] = 0); } else { filtered_glitch = 0; } updateMeasurements(); timerVal = ReadTimer2(); CloseTimer2(); timeElapsed = ms_from_ticks(timerVal, 256); //if (timeElapsed < MAIN_LOOP_DUR) // delay_t1(MAIN_LOOP_DUR - timeElapsed); ClrWdt(); //Clear watchdog timer } // end while(1) return (EXIT_SUCCESS); }
/**************************************************************************** Function: Timer5IntHandler Parameters: None. Returns: None. Description Implements the Stepper motor FULL STEP drive state machine. Notes Author: Gabriel Hugh Elkaim, 2011.12.15 16:42 ****************************************************************************/ void __ISR(_TIMER_3_VECTOR, ipl4) Timer3IntHandler(void) { static unsigned short timerLoopCount = 0; LED_BANK1_0 ^= 1; if (++timerLoopCount > overflowReps) { timerLoopCount = 0; LED_BANK1_1 ^= 1; // execute Stepper Drive state machine here switch(stepperState) { case off: // should not get here dbprintf("\noff"); T5CONbits.ON = 0; // halt timer5 ShutDownDrive(); CloseTimer5(); break; case inited: case halted: case waiting: ShutDownDrive(); if (stepCount < 0) stepCount = 0; LED_BANK1_2 ^= 1; break; case stepping: if (--stepCount <= 0) stepperState = waiting; LED_BANK1_3 ^= 1; TurnOnDrive(); switch(coilState) { case step_one: // coil drive both forward COIL_A_DIRECTION = 1; COIL_B_DIRECTION = 1; if (stepDir == FORWARD) coilState = step_two; else coilState = step_four; break; case step_two: // coil drive A forward, B reverse COIL_A_DIRECTION = 1; COIL_B_DIRECTION = 0; if (stepDir == FORWARD) coilState = step_three; else coilState = step_one; break; case step_three: // coil drive both reverse COIL_A_DIRECTION = 0; COIL_B_DIRECTION = 0; if (stepDir == FORWARD) coilState = step_four; else coilState = step_two; break; case step_four: // coild drive A reverse, B forward COIL_A_DIRECTION = 0; COIL_B_DIRECTION = 1; if (stepDir == FORWARD) coilState = step_one; else coilState = step_three; break; } break; } } mT3ClearIntFlag(); }