//0 is to the right, and position increases leftward void motor_crude_controller(uint16_t current_position, uint16_t reference){ //if requested position is out of reach if(reference > max_left){ motor_crude_controller(max_left, reference); } //if we're close to ref if(abs(current_position - reference) < 300){ motor_speed(0); return; } //too far left if(current_position > reference){ motor_direction(right); motor_speed(100); } //too far right else{ motor_direction(left); motor_speed(100); } }
void motor_test(void){ motor_direction(right); _delay_ms(500); motor_direction(left); _delay_ms(500); }
//MOTOR SPEED NEEDS TO BE TUNED FOR INDIVIDUAL GAME BOARD void motor_controller_calibrate_by_reset(){ uint8_t speed = 65; motor_init(); uint16_t position; uint16_t prev_position; motor_speed(speed); motor_direction(right); _delay_ms(150); position = motor_encoder_read(); //go right until stopped, then set encoder to zero while(position != prev_position){ position = motor_encoder_read(); _delay_ms(100); prev_position = position; position = motor_encoder_read(); printf("position: %u\tPrev: %u\n", position, prev_position); } motor_encoder_reset(); motor_speed(speed); motor_direction(left); _delay_ms(150); //go left until stopped, set max left to current position do{ position = motor_encoder_read(); _delay_ms(100); prev_position = position; position = motor_encoder_read(); printf("position: %d\n", position); } while(position != prev_position); max_left = position; motor_speed(0); motor_speed(speed); motor_direction(right); _delay_ms(100); while(motor_encoder_read() > 4500){ _delay_ms(100); } }
//negative speed to the right to make transition to encoder values easier void motor_speed_direction(int16_t speed){ if(speed < 0){ motor_direction(right); } else{ motor_direction(left); } motor_speed(abs(speed)); }
void motor_speed(int16_t speed){ if (speed > 0) { motor_direction(MOTOR_LEFT); } else { motor_direction(MOTOR_RIGHT); } speed = abs(speed); if (speed > MOTOR_MAX_SPEED) { speed = MOTOR_MAX_SPEED; } //else if (speed < MOTOR_MIN_SPEED) { speed = 1; } max520_write(MAX520_CHANNEL_MOTOR, (uint8_t)speed); }
void motor_speed_direction_cap(int16_t speed, uint8_t cap){ if(speed < 0){ motor_direction(right); } else{ motor_direction(left); } if(abs(speed) > cap){ motor_speed(abs(cap)); } }
void motor_speed(int16_t speed){ if(speed > 0){ motor_direction(right); } else{ motor_direction(left); speed = abs(speed); } if(speed > max_speed){ speed = max_speed; } dac_write(0, speed); }