Project

General

Profile

Statistics
| Revision:

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

History | View | Annotate | Download (2.83 KB)

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

    
4
#include "comm_robot.h"
5

    
6
// NB don't produce overflows!
7
#define vel_min 100
8
#define vel_max 250
9
#define vel_inc 10
10
#define vel_delay 200
11

    
12
static void test_motors_direction_velocity (uint8_t direction1, uint8_t direction2, uint8_t velocity)
13
{
14
        robot_set_motors (direction1, velocity, direction2, velocity);
15
        delay_ms (vel_delay);
16

    
17
        //        wait (steady)
18
        //        
19
        //        reset_encoders ();
20
        //        for (measurements)
21
        //        {
22
        //                measure left/right
23
        //                wait
24
        //        }
25
}
26

    
27

    
28
#define acceleration_increasing 1
29
#define acceleration_decreasing 2
30

    
31
// TODO: pass number of steps instead
32
static void test_motors_direction_acceleration (uint8_t direction1, uint8_t direction2, uint8_t vel_start, uint8_t vel_end, int8_t vel_step, char *acceleration_string)
33
{
34
        // Use 16 bit variable for vel to avoid problems with overflow (if vel=250 and 10 is added, it would be 260-256=4
35
        // which is still smaller than vel_max). There are more elegant solutions to this problem, but this one is
36
        // easy and performance is not an issue here anyway.
37

    
38
        // Distinguish between start>=end/start<end because we have to use the corresponding stop condition.
39
        if (vel_end>=vel_start)
40
                for (uint16_t vel=vel_start; vel<=vel_end; vel+=vel_step)
41
                        test_motors_direction_velocity (direction1, direction2, vel);
42
        else
43
                for (uint16_t vel=vel_start; vel>=vel_end; vel+=vel_step)
44
                        test_motors_direction_velocity (direction1, direction2, vel);
45
        
46

    
47
        // Send data
48
        for (uint8_t i=1; i<=2; ++i)
49
        {
50
                uint8_t direction=(i==1)?direction1:direction2;
51
                
52
                if (direction!=motor_direction_off)
53
                {
54
                        usb_puts ("data motor ");
55
                        usb_puti (i);
56
                        usb_puts (" ");
57
                        usb_puts (motor_direction_string (direction));
58
                        usb_puts (" ");
59
                        usb_puts (acceleration_string);
60
                        usb_puts (" ");
61
                                
62
                        usb_puts (" 160/100 170/200 180/300 190/400 200/500 210/600 220/700" NL);
63
                }
64
        }
65
}
66

    
67
static void test_motors_direction (uint8_t direction1, uint8_t direction2)
68
{
69
        test_motors_direction_acceleration (direction1, direction2, vel_min, vel_max, vel_inc, "increasing");
70
        test_motors_direction_acceleration (direction1, direction2, vel_max, vel_min, -vel_inc, "decreasing");
71
}
72

    
73

    
74
void test_motor_all (void)
75
{
76
        usb_puts("# Testing motors" NL);
77

    
78
        test_motors_direction (motor_direction_forward, motor_direction_backward);
79
        test_motors_direction (motor_direction_backward, motor_direction_forward);
80

    
81
        robot_set_motors_off ();
82

    
83
        usb_puts("# Testing motors finished" NL);
84
}
85

    
86
void test_motor (uint8_t num)
87
{
88
        if (num==1)
89
        {
90
                test_motors_direction (motor_direction_forward, motor_direction_off);
91
                test_motors_direction (motor_direction_backward, motor_direction_off);
92
        }
93
        else if (num==2)
94
        {
95
                test_motors_direction (motor_direction_off, motor_direction_forward);
96
                test_motors_direction (motor_direction_off, motor_direction_backward);
97
        }
98
}