//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; } }
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; }
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; }
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; }