Beispiel #1
0
//100ms
void TIM7_IRQHandler(void)
{
	float pwm1, pwm2;
	if(TIM_GetITStatus(TIM7, TIM_IT_Update) == SET)
	{
		TIM_ClearITPendingBit(TIM7, TIM_IT_Update);
		//printf("counter: %d, %d\r\n", left_counter, right_counter);
		if(control_flag == 1 && adc_flag == 1){
			if(pos_flag == 1){
				pwm1 = 0;
				pwm2 = 0;
				left_pos_counter += left_counter;
				right_pos_counter += right_counter;
				if(left_pos_counter < left_pos_target_counter){
					pwm1 = 90*left_dir;
				}
				if(right_pos_counter < right_pos_target_counter){
					pwm2 = 90*right_dir;
				}
				motor_set_pwm(pwm1, pwm2);
				//printf("counter:%d,%d;  pos:%d,%d;  target:%d,%d;  pwm:%6.1f,%6.1f\r\n", left_counter, right_counter, left_pos_counter, right_pos_counter, left_pos_target_counter, right_pos_target_counter, pwm1, pwm2);
				if(pwm1==0&&pwm2==0){
					left_dir = 1;
					right_dir = 1;
					pos_flag = 0;
				}
			}
			else{
				left_speed_pid.feedback = left_counter;
				right_speed_pid.feedback = right_counter;
				left_pwm += pid_calc(&left_speed_pid);
				right_pwm += pid_calc(&right_speed_pid);
				left_pwm = range(left_pwm, 0, 100);
				right_pwm = range(right_pwm, 0, 100);
				motor_set_pwm(left_pwm*left_dir, right_pwm*right_dir);
			}
		}
		else{
			motor_set_pwm(0, 0);
		}
		left_counter = 0;
		right_counter = 0;
	}
}
Beispiel #2
0
int main()
{
	printf("System test begin \n");
	pid_t* tset;
	float real = 0;

	tset = pid_init(35,0,0,0);
	while(k < 100)
	{
		real = pid_calc(tset);
		printf("%f\n",real);
		k++;
	}

	free(tset);
	return 0;
}
Beispiel #3
0
int main()
{
	printf("System test begin \n");

	pid_t* tset;
	int count = 0;
	float real = 0;

	tset = pid_init(23,0,0,0,0,0,0,0);

	while(count < 100)
	{
		real = pid_calc(tset);
		printf("%f\n",real);
		count++;
	}

	free(tset);
	return 0;
}
Beispiel #4
0
int main( int argc, char *argv[] )
{
    float temp;
    uint32 cur_time;
    uint32 start_time;
    float duty_cycle;
    float target_temp;
    char print_string[ 200 ];

    util_print_procId();

    force_stop = FALSE;
    door_open = FALSE;

    timer_init();

    if( argc != 2 )
    {
        util_print_debug( "Error: The only argument is the path to the JSON file.\n" );
        return( -1 );
    }

    //Set up signal handler:
    if( signal( SIGINT, signalHandler ) == SIG_ERR )
    {
        util_print_debug( "MPU: Error setting up ctrl-c interrupt.\n" );
        return( -1 );
    }

    util_print_debug( argv[ 1 ] );

    if( !pid_init( argv[ 1 ] ) )
    {
        util_print_debug( "Error: There was an error loading the profile.\n" );
        return( -1 );
    }

    pruIo *io = pruio_new(PRUIO_DEF_ACTIVE, 0x98, 0, 1);

    start_time = 0;
    cur_time = 0;
    duty_cycle = 1.0;

    if( pruio_config( io, 1, 0x1FE, 0, 4 ) )
    {
        sprintf( print_string, "config failed (%s)\n", io->Errr );
        util_print_debug( print_string );
        return( -1 );
    }
    
    pruio_pwm_setValue( io, P_OUT, PWM_FREQ, duty_cycle );
    pruio_pwm_setValue( io, SERVO_PIN, SERVO_FREQ, SERVO_DUTY_CLOSE ); //close door

    while( !force_stop )
    {
        temp = util_calc_temp( io->Adc->Value[ 1 ] );
        target_temp = pid_find_target( cur_time / 1000.0 );
        duty_cycle = pid_calc( target_temp, temp );
        pruio_pwm_setValue( io, SERVO_PIN, SERVO_FREQ, SERVO_DUTY_IDLE );

        if( duty_cycle == -1 )
        {
            force_stop = TRUE;
        }

        // DOOR CRACKING CODE
        if ( ( temp - target_temp) > 5.0 )
        {
          // OPEN DOOR
            pruio_pwm_setValue( io, SERVO_PIN, SERVO_FREQ, SERVO_DUTY_OPEN );
            door_open = TRUE;
        }

        else if ( ( duty_cycle > 0.0 ) && door_open )
        {
          // CLOSE DOOR
            pruio_pwm_setValue( io, SERVO_PIN, SERVO_FREQ, SERVO_DUTY_CLOSE );
            door_open = FALSE;
        }

        pruio_pwm_setValue( io, P_OUT, -1, duty_cycle );

        util_print_point( cur_time / 1000, target_temp, temp );

        //block for 2 seconds.
        while( ( cur_time - start_time <= PWM_PERIOD_MS ) && !force_stop )
        {
            if( !timer_get( &cur_time ) )
            {
                printf( "There was an error with the timer.\n" );
                return( 0 );
            }
        }

        start_time = start_time + PWM_PERIOD_MS;
    }

    // I WISH WE COULD WAIT UNTIL THE OVEN IS AT 100 DEGREES C TO CLOSE THIS DOWN
    pruio_pwm_setValue( io, P_OUT, -1, 0.0f );
    pruio_pwm_setValue( io, SERVO_PIN, SERVO_FREQ, SERVO_DUTY_CLOSE ); // CLOSE THE DOOR
    
    // STALL BEFORE SHUTTING DOWN PWM
    timer_get( &start_time );
    cur_time = start_time;
    while( ( cur_time - start_time ) < 500 )
    {
        timer_get( &cur_time );
    }

    pruio_destroy(io);       /* destroy driver structure */ 
    
    return 0;
}