View difference between Paste ID: K65wBKPE and rRvN6GCB
SHOW: | | - or go back to the newest paste.
1
	// PID parameters 
2
	int const Kp = (int)( 10.0000 * (1 << 16) ) ;
3
	int const Ki = (int)(  1.0000 * (1 << 16) ) ;
4
	int const Kd = (int)(  0.0000 * (1 << 16) ) ;
5
6
	uint32_t const reference_position = *position_var; // initial reading from decoder
7
8-
	int control_signal = 0;
8+
	int error_accum = 0;
9
	int prev_error = 0;
10-
	int prev_error_change = 0;
10+
11
12
	while (true) {
13
		// wait for and receive load cell measurement
14
		int16_t force = receive_measurement();
15
16
		// sample motor position decoder
17
		uint32_t position = *position_var;
18
		int relative_position = position - reference_position;
19
20
		// get target position
21
		int input_signal = shmem.signal[ signal_index++ ];
22
		if( signal_index == sizeof(shmem.signal)/sizeof(shmem.signal[0]) )
23
			signal_index = 0;
24
25
		// PID control loop
26
		int error = input_signal - relative_position;
27
		error_accum += error;
28
		int error_change = error - prev_error;
29-
		int error_change_change = error_change - prev_error_change;
29+
		int control_signal = Ki * error_accum + Kp * error + Kd * error_change;
30-
		control_signal += Ki * error + Kp * error_change + Kd * error_change_change;
30+
31
32-
		prev_error_change = error_change;
32+
33
		if (control_signal < 0) {
34
			// place lower bound on control signal
35
			if( control_signal < -(4000 << 16) )
36
				control_signal = -(4000 << 16);
37
			EPWM1A = (-control_signal) >> 16;
38
			gpio_set_one_low( &GPIO0, 31 );
39
		} else {
40
			// place upper bound on control signal 
41
			if (control_signal > (4000 << 16)) 
42
				control_signal = (4000 << 16);
43
			EPWM1A = control_signal >> 16;
44
			gpio_set_one_high(&GPIO0,31);
45
		}
46
47
		// report to python
48
		send_message( ++id, force, position, input_signal, control_signal );
49
	}