コード例 #1
0
ファイル: motor.c プロジェクト: matthieutdo/PiBoat
static int set_motor_speed(shared_data_t *data, int speed_m1, int speed_m2)
{
	/* The adjustment is used if the speed is the same for both motors. */
	if (speed_m1 == speed_m2){
		if (speed_m1 < 0)
			speed_m1 += motor_1.adjust;
		else
			speed_m1 -= motor_1.adjust;

		if (speed_m2 < 0)
			speed_m2 += motor_2.adjust;
		else
			speed_m2 -= motor_2.adjust;
	}

	syslog(LOG_DEBUG, "Real speed: %i %i\n", speed_m1, speed_m2);

	/* Switch direction */
	if ((motor_1.cur_speed < 0 && speed_m1 > 0) ||
	    (motor_1.cur_speed > 0 && speed_m1 < 0))
		motor_switch_direction(motor_1);
	if ((motor_2.cur_speed < 0 && speed_m2 > 0) ||
	    (motor_2.cur_speed > 0 && speed_m2 < 0))
		motor_switch_direction(motor_2);

	/* Update speed */
	motor_speed(data, &motor_1, speed_m1);
	motor_speed(data, &motor_2, speed_m2);

	return 0;
}
コード例 #2
0
ファイル: pid.c プロジェクト: haakonelf/TTK4155
uint16_t pid_find_max_encoder_value(void){
		uint16_t enc_val = 0, prev_enc_val = -1;
		motor_speed(75);
		
		//Stop at left end
		while(enc_val != prev_enc_val){
			printf("In while\n");
			enc_val = motor_encoder_read();
			_delay_ms(100);
			prev_enc_val = motor_encoder_read();
		}
		printf("Out of while\n");
		motor_speed(0);
		motor_encoder_reset();
		
		//Stop at right end and set max
		motor_speed(-75);
		enc_val = 0, prev_enc_val = -1;
		while(enc_val != prev_enc_val){
			enc_val = motor_encoder_read();
			_delay_ms(100);
			prev_enc_val = motor_encoder_read();
		}
		motor_speed(0);
		
		//Max value of encoder.
		return enc_val;
}
コード例 #3
0
ファイル: motor.c プロジェクト: elleveldy/byggern
//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);
	}
}
コード例 #4
0
ファイル: motor.c プロジェクト: elleveldy/byggern
//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);
	}
}
コード例 #5
0
ファイル: main.c プロジェクト: Robot2014/platform
int main(void)
{
    int status;
    memset(RX_BUF,0,4);
    led_init();
    nRF24L01_init();
    motor_init();			//电机初始化
    QuadCopter_init(&QuadCopter);
    uart_init(115200);

    status = nRF_Check(); 	   	 	/*检测NRF模块与MCU的连接*/
    if(status == SUCCESS)			/*判断连接状态*/
        uart_printf("\r\n      NRF与MCU连接成功!\r\n");
    else
        uart_printf("\r\n  NRF与MCU连接失败,请重新检查接线。\r\n");
    nRF_RX_Mode();
    LED_OFF;
    while(1)
    {

        nRF_RX_Mode();
        nRF_Rx_Dat(RX_BUF);
        status=RX_BUF[2];

        switch(status)
        {
        case Q_ON:
            LED_ON;
            QuadCopter.Status=Q_ON;
            QuadCopter.BaseSpeed=300;
            motor_speed(QuadCopter.BaseSpeed,QuadCopter.BaseSpeed,QuadCopter.BaseSpeed,QuadCopter.BaseSpeed ) ;
            break;
        case Q_UP:
            QuadCopter_up(&QuadCopter);
            break;
        case Q_DOWN:
            QuadCopter_down(&QuadCopter);
            break;
        case Q_OFF:
            LED_OFF;
            QuadCopter.Status=Q_OFF;
            motor_speed(0,0,0,0 ) ;
            break;
        default:
            break;
        }
    }

}
コード例 #6
0
ファイル: event.c プロジェクト: AndreasFMueller/Focuser
/**
 * \brief Get the current focuser state
 *
 * The GET request returns a single byte containing the state of all
 * the output ports.
 */
void	process_get() {
	Endpoint_ClearSETUP();
	unsigned short	v[3];
	v[0] = motor_current();
	v[1] = motor_target();
	v[2] = motor_speed();
	Endpoint_Write_Control_Stream_LE((void *)v, 6);
	Endpoint_ClearOUT();
}
コード例 #7
0
ファイル: motor.c プロジェクト: elleveldy/byggern
//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));
}
コード例 #8
0
ファイル: motor.c プロジェクト: elleveldy/byggern
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));
	}
	
}
コード例 #9
0
ファイル: motor.c プロジェクト: elleveldy/byggern
uint8_t motor_speed_controller(uint8_t speed){
	
	uint8_t tilt = abs(input_joystick_x() - 127);
	
	if((tilt < 70) && tilt > 30){
		motor_speed(90);
	}
	else if(tilt >= 70){
		motor_speed(130);
	}
	else{
		motor_speed(0);
	}
	
	if(input_joystick_x() > 127){
		motor_speed(right);
	}
	else{
		motor_speed(left);
	}
	
}
コード例 #10
0
ファイル: motor_driver.c プロジェクト: ottolote/PingPong
//	Initializes the motor in port C
void motor_init() {
	max520_init(MAX520_TWI_ADDRESS);
	
	DDRC |= (1<<PC3) | (1<<PC4) | (1<<PC5) | (1<<PC6) | (1<<PC7);
	
	DDRK = 0;
	
	motor_output_enable(ENABLE);
	motor_encoder_reset();
	motor_encoder_select_byte(ENCODER_HIGH);
	motor_speed(0);
	motor_enable(ENABLE);
}
コード例 #11
0
ファイル: motor_controller.c プロジェクト: rokrust/Byggern
uint16_t controller_init(){
	motor_speed(75);
	uint16_t enc_val = 0, prev_enc_val = -1;
	while(enc_val != prev_enc_val){
		enc_val = motor_encoder_read();
		_delay_ms(100);
		prev_enc_val = motor_encoder_read();
	}
	motor_speed(0);
	motor_encoder_reset();
	
	motor_speed(-75);
	enc_val = 0, prev_enc_val = -1;
	while(enc_val != prev_enc_val){
		enc_val = motor_encoder_read();
		_delay_ms(100);
		prev_enc_val = motor_encoder_read();
	}
	motor_speed(0);
	
	//Find max value of encoder.
	return enc_val;
}
コード例 #12
0
ファイル: LimitSpeedT.c プロジェクト: weimingtom/stm32-gui
 void OnButtonRTClicked(WM_MESSAGE * pMsg)
 {
	motor_speed(0);
	if((get_data.e_work_state != START_TEST)&&(get_data.e_work_state != GET_V1))
	{
	
    if(ttpars.dir == 1)
	{
	BUTTON_SetText(WM_GetDialogItem(pMsg->hWin,GUI_ID_BUTTON_TRT),"反转");
	ttpars.dir = 2;
	}else {
	BUTTON_SetText(WM_GetDialogItem(pMsg->hWin,GUI_ID_BUTTON_TRT),"正转");	
	ttpars.dir = 1;
	}
	motor_dir(ttpars.dir);
	}
 }