Project

General

Profile

Statistics
| Revision:

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

History | View | Annotate | Download (2.57 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
static void test_motors_direction (uint8_t direction1, uint8_t direction2)
28
{
29
        // Use 16 bit variable for vel to avoid problems with overflow (if vel=250 and 10 is added, it would be 260-256=4
30
        // which is still smaller than vel_max). There are more elegant solutions to this problem, but this one is
31
        // easy and performance is not an issue here anyway.
32
        
33
        for (uint16_t vel=vel_min; vel<=vel_max; vel+=vel_inc)
34
                test_motors_direction_velocity (direction1, direction2, vel);
35

    
36
        // Send data
37
        for (uint8_t i=1; i<=2; ++i)
38
        {
39
                uint8_t direction=(i==1)?direction1:direction2;
40
                
41
                if (direction!=motor_direction_off)
42
                {
43
                        usb_puts ("data motor ");
44
                        usb_puti (i);
45
                        usb_puts (" ");
46
                        usb_puts (motor_direction_string (direction));
47
                        usb_puts (" increasing ");
48
                        usb_puts (" 160/100 170/200 180/300 190/400 200/500 210/600 220/700" NL);
49
                }
50
        }
51

    
52
        // TODO code duplication
53
        
54
        for (uint16_t vel=vel_max; vel>=vel_min; vel-=vel_inc)
55
                test_motors_direction_velocity (direction1, direction2, vel);
56
                
57
        // Send data
58
        for (uint8_t i=1; i<=2; ++i)
59
        {
60
                uint8_t direction=(i==1)?direction1:direction2;
61

    
62
                if (direction!=motor_direction_off)
63
                {
64
                        usb_puts ("data motor ");
65
                        usb_puti (i);
66
                        usb_puts (" ");
67
                        usb_puts (motor_direction_string (direction));
68
                        usb_puts (" decreasing ");
69
                        usb_puts (" 220/700 210/600 200/500 190/400 180/300 170/200 160/100" NL);
70
                }
71
        }
72
        
73

    
74
}
75

    
76

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

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

    
84
        robot_set_motors_off ();
85

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

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