void doSensHome(){ switch(position){ case POS_START: printf("I'm about to start for the first time, I can start !!\n\r"); position = POS_HOME; sleep(2); pwmOn(); turnSX(); printf("I look for the line on the central line sensor\n\r"); break; case POS_LINE: printf("I arrive on the starting point\n\r"); position = POS_HOME; pwmOff(); sleep(2); pwmOn(); turnSX(); break; case POS_HOME: break; // I still turn to look for the line default: printf("unforeseen\n\r"); position=POS_BAD; break; // unforeseen } }
void ruotaDX() { printf("DX\n\r"); pwmOff(); pwmOn(); system("echo 1450000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle"); system("echo 1450000 > /sys/class/pwm/pwmchip0/pwm1/duty_cycle"); }
void indietro() { printf("INDIETRO\n\r"); pwmOff(); pwmOn(); system("echo 15500000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle"); system("echo 1450000 > /sys/class/pwm/pwmchip0/pwm1/duty_cycle"); }
void forward() { printf("AVANTI\n\r"); pwmOff(); //rampa pwmOn(); system("echo 1450000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle"); system("echo 1550000 > /sys/class/pwm/pwmchip0/pwm1/duty_cycle"); usleep(D_MARCIA); system("echo 1300000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle"); system("echo 1700000 > /sys/class/pwm/pwmchip0/pwm1/duty_cycle"); usleep(D_MARCIA); system("echo 1100000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle"); system("echo 1900000 > /sys/class/pwm/pwmchip0/pwm1/duty_cycle"); usleep(D_MARCIA); }
// ------------------------------------------------------------------------------------- int main(void) { setup(); //WDTCR &= 0b11011000; // set for 16ms timeout //WDTCR |= (1<<WDE); // enable watchdog timer pwmOn(); while(1) { //wdt_reset(); processComparator(); } return 0; }
// ------------------------------------------------------------------------------------- // Process the data from the ADC static void processComparator(void) { // check comparator - we'll do simple skip-mode type PWM. // If the voltage is higher, skip a cycle. If the voltage is lower, // don't skip a cycle. We'll skip by turning the PWM output // on and off (by setting OC1B to either 0 or the PWM value) if ((ACSR & (1<<ACO)) == 0) { // comparater output is 0 - positive input is greater than negative input // AIN < REF // Enable PWM output because voltage is too low pwmOff(); } else { // comparator output is 1 - positive input is less than negative input // AIN > REF // Disable PWM output because voltage is too high pwmOn(); } }
// // main // int main( void ) { // Endless loop // while ( 1 ) { // Switch states // switch ( newState ) { case StateInit: // Init system // init(); newState = StateIdle; break; case StateIdle: if ( programmingActive ) { if ( (ticks - levelRampTime) >= LEVEL_RAMP_TIME ) { levelRampTime = ticks; percent += levelSteps; if ( 100 < percent ) { levelSteps = -1; percent = 99; } if ( 1 > percent ) { levelSteps = 1; percent = 2; } pwm( percent ); } } else if ( (strobeTimerActive) && (ticks >= strobeTimer) ) { strobeTimer = ticks + STROBE_TIME; if ( strobeFlag ) { strobeFlag = 0; pwm( percent ); } else { strobeFlag = 1; pwm( 0 ); } } go2sleep( SLEEP_MODE_IDLE ); break; case StatePowerDownDetected: if ( powerUpDebouncing ) { // Discard state change. // newState = StatePowerUpDebouncing; } else { if ( 1 == programmingActive ) { eeprom_write_byte( (uint8_t *) (EEPROM_PWM_VALUES + currentPWMMode), percent ); pwmValues[currentPWMMode] = percent; programmingActive = 0; } powerDownDebouncing = 1; debounceTimer = ticks + DEBOUNCE_TIME; newState = StatePowerDownDebouncing; pwmOff(); } break; case StatePowerDownDebouncing: if ( ticks >= debounceTimer ) { powerDownDebouncing = 0; if ( !(PINB & (1 << PB0)) ) { newState = StatePowerDown; } else { newState = StateIdle; } } else { go2sleep( SLEEP_MODE_PWR_DOWN ); } break; case StatePowerDown: if ( 0 == powerDownTimerRunning ) { powerDownTimerRunning = 1; powerDownTimer = ticks; } go2sleep( SLEEP_MODE_PWR_DOWN ); break; case StatePowerUpDetected: if ( powerDownDebouncing ) { // Discard state change. // newState = StatePowerDownDebouncing; } else { powerUpDebouncing = 1; debounceTimer = ticks + DEBOUNCE_TIME; newState = StatePowerUpDebouncing; } break; case StatePowerUpDebouncing: if ( ticks >= debounceTimer ) { powerUpDebouncing = 0; if ( (PINB & (1 << PB0)) ) { newState = StatePowerUp; } else { newState = StateIdle; } } else { go2sleep( SLEEP_MODE_IDLE ); } break; case StatePowerUp: pwmOn(); if ( programmingActive ) { // Do nothing! } else { if ( (ticks - powerDownTimer) <= MAX_PROG_SWITCH_TIME ) { fastClicks++; if ( CLICKS_TO_PROG_MODE <= fastClicks ) { fastClicks = 0; powerDownTimerRunning = 0; powerDownTimer = 0; percent = 1; levelSteps = 1; levelRampTime = ticks; programmingActive = 1; pwm( percent ); } newState = StateIdle; } else if ( (ticks - powerDownTimer) <= MAX_MODE_SWITCH_TIME ) { clicks++; if ( CLICKS_TO_SWITCH_MODE <= clicks ) { clicks = 0; powerDownTimerRunning = 0; powerDownTimer = 0; currentPWMMode++; if ( NUM_PWM_VALUES <= currentPWMMode ) { currentPWMMode = 0; } percent = pwmValues[ currentPWMMode ]; strobeTimerActive = percent & 0x80; if ( strobeTimerActive ) { strobeTimer = ticks + STROBE_TIME; } percent &= 0x7F; pwm( percent ); } newState = StateIdle; } else { clicks = 0; fastClicks = 0; powerDownTimerRunning = 0; powerDownTimer = 0; newState = StateIdle; } } break; default: break; } } }