forked from stancecoke/BMSBattery_S_controllers_firmware
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathACAcontrollerState.c
More file actions
144 lines (126 loc) · 6.15 KB
/
ACAcontrollerState.c
File metadata and controls
144 lines (126 loc) · 6.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
* Copyright (c) 2018 Björn Schmidt
*
* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/*
* File: ACAcontrollerState.h
* Author: Björn Schmidt
*
* Created on August 30, 2018, 8:03 PM
*/
#include <stdio.h>
#include "config.h"
#include "stm8s.h"
#include "stm8s_itc.h"
#include "stm8s_gpio.h"
#include "gpio.h"
#include "ACAeeprom.h"
#include "ACAcontrollerState.h"
#include "ACAcommons.h"
// user controllable settings
uint8_t ui8_throttle_min_range = 32;
uint8_t ui8_throttle_max_range = 192;
uint8_t ui8_speedlimit_kph = 25; // normal limit
uint8_t ui8_speedlimit_without_pas_kph = 6; // limit without pas activity
uint8_t ui8_speedlimit_with_throttle_override_kph = 35; // limit with pas and throttle both active
uint8_t ui8_speedlimit_actual_kph; // dynamic speedlimit based on current state
uint8_t ui8_s_pas_direction = 0;
float flt_s_pas_threshold = 1.7;
float flt_s_pid_gain_p = 0.5;
float flt_s_pid_gain_i = 0.2;
float flt_torquesensorCalibration = 0.0;
uint16_t ui16_s_ramp_end = 1500;
uint8_t ui8_s_motor_angle = 214;
// internal
uint32_t uint32_icc_signals = 0;
uint8_t ui8_assistlevel_global = 3; // for debugging of display communication
uint8_t PAS_act = 3; //recent PAS direction reading
uint8_t PAS_dir = 0; //PAS direction flag
uint16_t ui16_sum_torque = 0; //sum of array elements
uint8_t ui8_offroad_state = 0; //state of offroad switching procedure
uint32_t uint32_current_target = 0; //target for PI-Control
uint16_t ui16_setpoint = 0;
uint16_t ui16_throttle_accumulated = 0;
uint16_t ui16_current_cal_b = 0;
uint8_t ui8_motor_state = 0;
uint8_t ui8_BatteryVoltage = 0; //Battery Voltage read from ADC
uint16_t ui16_motor_speed_erps = 0;
uint16_t ui16_BatteryCurrent = 0; //Battery Current read from ADC8
uint8_t ui8_position_correction_value = 127; // in 360/256 degrees
uint16_t ui16_ADC_iq_current = 0;
uint16_t ui16_ADC_iq_current_filtered = 0;
uint8_t ui8_control_state = 0;
uint8_t ui8_uptime = 0;
uint8_t uint8_t_hall_case[7];
uint8_t uint8_t_hall_order[6];
int8_t int8_t_hall_counter = 0;
uint8_t ui8_hall_order_counter = 5;
uint16_t ui16_speed_kph_to_erps_ratio = 0;
uint32_t ui32_SPEED_km_h; //global variable Speed
uint32_t ui32_SPEED_km_h_accumulated;
uint16_t ui16_time_ticks_between_speed_interrupt = 64000; //speed in timetics
uint16_t ui16_time_ticks_for_speed_calculation = 0; //time tics for speed measurement
uint8_t ui8_SPEED_Flag = 0; //flag for SPEED interrupt
uint8_t ui8_offroad_counter = 0; //counter for offroad switching procedure
uint8_t ui8_aca_flags = 0; //if throttle input should be bases on assist level and other flags
uint8_t ui8_adc_read_throttle_busy = 0;
uint16_t ui16_torque[NUMBER_OF_PAS_MAGS]; //array for torque values of one crank revolution
uint8_t ui8_torque_index = 0; //counter for torque array
uint16_t ui16_time_ticks_between_pas_interrupt_smoothed = 0;
uint16_t ui16_time_ticks_for_pas_calculation = 0; //time tics for cadence measurement
uint16_t ui16_PAS_High_Counter = 1; //time tics for direction detection
uint16_t ui16_time_ticks_between_pas_interrupt = 32000; //cadence in timetics
uint16_t ui16_PAS_High = 1; //number of High readings on PAS
uint8_t ui8_PAS_update_call_when_inactive_counter = 50; //increased when no pas change is detected (50Hz)
uint8_t ui8_PAS_Flag = 0;
void controllerstate_init(void) {
uint8_t di;
uint8_t eepromVal;
// convert static defines to volatile vars
ui8_aca_flags = ACA;
ui8_speedlimit_kph = limit;
ui8_speedlimit_actual_kph = limit;
ui8_throttle_min_range = ADC_THROTTLE_MIN_VALUE;
ui8_throttle_max_range = ADC_THROTTLE_MAX_VALUE;
ui8_s_pas_direction = PAS_DIRECTION;
flt_s_pas_threshold = PAS_THRESHOLD;
flt_s_pid_gain_p = P_FACTOR;
flt_s_pid_gain_i = I_FACTOR;
ui16_s_ramp_end = RAMP_END;
ui8_s_motor_angle = MOTOR_ROTOR_DELTA_PHASE_ANGLE_RIGHT;
// read in overrides from eeprom if they are > 0, assuming 0s are uninitialized
eepromVal = eeprom_read(OFFSET_MAX_SPEED_DEFAULT);
if (eepromVal > 0) ui8_speedlimit_kph = eepromVal;
eepromVal = eeprom_read(OFFSET_MAX_SPEED_WITHOUT_PAS);
if (eepromVal > 0) ui8_speedlimit_without_pas_kph = eepromVal;
eepromVal = eeprom_read(OFFSET_MAX_SPEED_WITH_THROTTLE_OVERRIDE);
if (eepromVal > 0) ui8_speedlimit_with_throttle_override_kph = eepromVal;
eepromVal = eeprom_read(OFFSET_ACA_FLAGS);
if (eepromVal > 0) ui8_aca_flags = eepromVal;
eepromVal = eeprom_read(OFFSET_ASSIST_LEVEL);
if (eepromVal > 0) ui8_assistlevel_global = eepromVal;
eepromVal = eeprom_read(OFFSET_THROTTLE_MIN_RANGE);
if (eepromVal > 0) ui8_throttle_min_range = eepromVal;
eepromVal = eeprom_read(OFFSET_THROTTLE_MAX_RANGE);
if (eepromVal > 0) ui8_throttle_max_range = eepromVal;
eepromVal = eeprom_read(OFFSET_PAS_DIRECTION);
if (eepromVal > 0) ui8_s_pas_direction = eepromVal;
eepromVal = eeprom_read(OFFSET_PAS_TRESHOLD);
if (eepromVal > 0) flt_s_pas_threshold = int2float(eepromVal, 4.0);
eepromVal = eeprom_read(OFFSET_PID_GAIN_P);
if (eepromVal > 0) flt_s_pid_gain_p = int2float(eepromVal, 2.0);
eepromVal = eeprom_read(OFFSET_PID_GAIN_I);
if (eepromVal > 0) flt_s_pid_gain_i = int2float(eepromVal, 2.0);
eepromVal = eeprom_read(OFFSET_RAMP_END);
if (eepromVal > 0) ui16_s_ramp_end = eepromVal << 4;
eepromVal = eeprom_read(OFFSET_MOTOR_ANGLE);
if (eepromVal > 0) ui8_s_motor_angle = eepromVal;
for (di = 0; di < 6; di++) {
uint8_t_hall_order[di] = 0;
}
}