Project

General

Profile

Revision 0bd4bb32

ID0bd4bb32e635bcc968c90d896920bf6618df9f48
Parent bc628a35
Child b67a9f36

Added by Thomas Mullins about 12 years ago

Added motor code for forklift, and fixed analog and i2c code after testing.

View differences:

forklift/code/forklift.c
12 12
 */
13 13
 
14 14
#include "twi.h"
15
#include "analog.h"
15
#include "analog.h"
16
#include "motor.h"
17
#include <avr/io.h>
18
#include <avr/interrupt.h>
16 19

  
17 20
#define TRACKING_ID 0x41
18 21
#define SERIAL_NUMBER 0x12
19 22

  
20 23
// indicies for forklift internal data
21
#define FORKLIFT_TRACKING_ID     0
22
#define FORKLIFT_SERIAL_NUMBER   1
23
#define FORKLIFT_HEIGHT          2
24
#define FORKLIFT_HEIGHT_SETPOINT 3 // only one that's r/w
25
#define FORKLIFT_LINEPOS         4
24
#define FORKLIFT_TRACKING_ID       0
25
#define FORKLIFT_SERIAL_NUMBER     1
26
#define FORKLIFT_HEIGHT            2
27
#define FORKLIFT_HEIGHT_SETPOINT   3 // r/w
28
#define FORKLIFT_LINE_POS          4
29
#define FORKLIFT_LINE_THRESH_HIGH  5 // r/w
30
#define FORKLIFT_LINE_THRESH_LOW   6 // r/w
26 31

  
27
#define FORKLIFT_DATA_LEN        5
32
#define FORKLIFT_DATA_LEN          7
33

  
34

  
35
#define PROP(X,Y,Z)                (((X)*(Y))/(Z))
28 36

  
29 37
uint8_t internal_index = 0;
30 38
uint8_t internal_data[] = {
......
32 40
  SERIAL_NUMBER,
33 41
  0,
34 42
  0,
35
  0
43
  0,
44
  0,
45
  150
36 46
};
37

  
47
int error;
48
int i_term;
49

  
50

  
51
void init_int0(void)
52
{
53
  TCCR0B = (1<<CS02)|(1<<CS00); //Timer clock = system clock / 1024
54
  TIFR0 = 1<<TOV0; //Clear TOV0  clear pending interrupts
55
  TIMSK0 = 1<<TOIE0; //Enable Timer0 Overflow Interrupt
56
  
57
}
38 58
void slave_rx(uint8_t* data, int len)
39 59
{
40 60
  if (len > 0 && data[0] < FORKLIFT_DATA_LEN)
41 61
  {
42 62
    internal_index = data[0];
43
    if (len > 1 && internal_index == FORKLIFT_HEIGHT_SETPOINT)
44
      internal_data[internal_index] = data[1];
63
    if (len > 1)
64
	{
65
	  if (internal_index == FORKLIFT_HEIGHT_SETPOINT)
66
        internal_data[internal_index] = data[1];
67
      else if (internal_index == FORKLIFT_LINE_THRESH_HIGH)
68
	  {
69
	    internal_data[internal_index] = data[1];
70
		line_set_threshold_high(data[1]);
71
	  }
72
      else if (internal_index == FORKLIFT_LINE_THRESH_LOW)
73
	  {
74
	    internal_data[internal_index] = data[1];
75
		line_set_threshold_low(data[1]);
76
	  }
77
	}
45 78
  }
46 79
}
47 80

  
......
52 85
  if (internal_index >= FORKLIFT_DATA_LEN)
53 86
    internal_index = 0;
54 87
}
88

  
89
void update_height(void)
90
//Call to update the forklift height point. Should be called each loop
91
{
92
	internal_data[FORKLIFT_HEIGHT] = analog_read(ADC_HEIGHT);
93
}
94

  
95

  
96
int clamp(int min, int max, int val)
97
{
98
	if(val>max) return max;
99
	if(val<min) return min;
100
	return val;
101
}
102

  
103
SIGNAL(TIMER0_OVF_vect)
104
{
105
	error = (int)internal_data[FORKLIFT_HEIGHT]
106
						-(int)internal_data[FORKLIFT_HEIGHT_SETPOINT];
107
	i_term = i_term +  error/10;
108
	set_motor(clamp(-127,127, i_term/10 + (error*2)/5));
109
}
55 110

  
56 111
int main()
57
{
58
  twi_init();
59
  twi_setAddress(TRACKING_ID);
112
{
113
  error = 0;
114
  i_term = 0;
115
  init_int0();
116
  sei();
60 117
  twi_attachSlaveRxEvent(slave_rx);
61 118
  twi_attachSlaveTxEvent(slave_tx);
62
  analog_init();
119
  twi_setAddress(TRACKING_ID);
120
  twi_init();
121
  analog_init();
122
  motor_init();
63 123
  while (1)
64
  {
65
    // do motor stuff
66
    internal_data[FORKLIFT_LINEPOS] = line_read_pos();
67
    internal_data[FORKLIFT_HEIGHT] = analog_read(ADC_HEIGHT);
124
  {
125
  	/*error = PROP((int)internal_data[FORKLIFT_HEIGHT]
126
						-(int)internal_data[FORKLIFT_HEIGHT_SETPOINT],2,5);
127
		set_motor(clamp(-127,127,error));*/
128
    // do motor stuff
129
	internal_data[FORKLIFT_LINE_POS] = (analog_read(ADC_LINE)>>2);//line_read_pos();
130
    internal_data[FORKLIFT_HEIGHT] = (analog_read(ADC_HEIGHT)>>2);
68 131
  }
69 132
  return 0;
70 133
}

Also available in: Unified diff