Project

General

Profile

Statistics
| Revision:

root / trunk / code / projects / diagnostic_station / station / test_motors.c @ 1214

History | View | Annotate | Download (2.8 KB)

1
#include "test_motors.h"
2
#include "global.h"
3

    
4
#include "comm_robot.h"
5
#include "hardware_encoders.h"
6

    
7
static void send_motor_data (uint8_t num, uint8_t direction, char *acceleration_string,
8
        uint8_t num_steps, uint8_t *data_pwm, int16_t *data_velocity)
9
{
10
        if (direction!=motor_direction_off)
11
        {
12
                usb_puts ("data motor ");
13
                usb_puti (num);
14
                usb_puts (" ");
15
                usb_puts (motor_direction_string (direction));
16
                usb_puts (" ");
17
                usb_puts (acceleration_string);
18
                usb_puts (" ");
19
                        
20
                for (uint8_t i=0; i<num_steps; ++i)
21
                {
22
                        usb_putc (' ');
23
                        usb_puti (data_pwm[i]);
24
                        usb_putc ('/');
25
                        usb_puti (data_velocity[i]);
26
                }
27

    
28
                usb_puts (NL);
29
        }
30
}
31

    
32
static void test_motors_direction_acceleration (uint8_t direction1, uint8_t direction2, uint8_t pwm_start, uint8_t num_steps, int8_t pwm_step, char *acceleration_string)
33
{
34
        // Allocate space for the data on the stack
35
        uint8_t  *data_pwm       =malloc (num_steps*sizeof (uint8_t ));
36
        int16_t *data_velocity_l =malloc (num_steps*sizeof (uint16_t));
37
        int16_t *data_velocity_r =malloc (num_steps*sizeof (uint16_t));
38

    
39
        uint8_t pwm=pwm_start;
40
        for (uint8_t i=0; i<num_steps; ++i)
41
        {
42
                robot_set_motors (direction1, pwm, direction2, pwm);
43
// TODO better
44
#define vel_delay 400
45
                delay_ms (vel_delay); // TODO wait steady
46

    
47
                data_pwm[i]=pwm;
48

    
49
                encoders_reset ();
50
                // TODO delay
51
                encoders_read (&(data_velocity_l[i]), &(data_velocity_r[i]));
52
        
53
                pwm+=pwm_step;
54
        }
55

    
56
        send_motor_data (0, direction1, acceleration_string, num_steps, data_pwm, data_velocity_l);
57
        send_motor_data (1, direction2, acceleration_string, num_steps, data_pwm, data_velocity_r);
58

    
59
        robot_set_motors (motor_direction_off, 0, motor_direction_off, 0);
60

    
61
        free (data_velocity_r);
62
        free (data_velocity_l);
63
        free (data_pwm);
64
}
65

    
66
static void test_motors_direction (uint8_t direction1, uint8_t direction2)
67
{
68
        #define vel_inc 10
69
        #define vel_steps 10
70
        #define vel_min 140
71
        #define vel_max 250
72
        
73
        test_motors_direction_acceleration (direction1, direction2, vel_min, vel_steps, vel_inc, "increasing");
74
        test_motors_direction_acceleration (direction1, direction2, vel_max, vel_steps, -vel_inc, "decreasing");
75
}
76

    
77

    
78
void test_motor_all (void)
79
{
80
        usb_puts("# Testing motors" NL);
81

    
82
        test_motors_direction (motor_direction_forward, motor_direction_backward);
83
        test_motors_direction (motor_direction_backward, motor_direction_forward);
84

    
85
        robot_set_motors_off ();
86

    
87
        usb_puts("# Testing motors finished" NL);
88
}
89

    
90
void test_motor (uint8_t num)
91
{
92
        if (num==1)
93
        {
94
                test_motors_direction (motor_direction_forward, motor_direction_off);
95
                test_motors_direction (motor_direction_backward, motor_direction_off);
96
        }
97
        else if (num==2)
98
        {
99
                test_motors_direction (motor_direction_off, motor_direction_forward);
100
                test_motors_direction (motor_direction_off, motor_direction_backward);
101
        }
102
}