Jelajahi Sumber

1. 加入扭矩速度查表DQ电流,通过线性插值,先做扭矩插值,再做速度插值
2. 加入SN读写
3. 加入扭矩速度查找表的配置

Signed-off-by: huhui <huhui@sharkgulf.com>

huhui 3 tahun lalu
induk
melakukan
51212c16f3

+ 94 - 8
Applications/app/nv_storage.c

@@ -8,6 +8,7 @@
 static motor_params_t m_params;
 static foc_params_t   foc_params;
 static mc_gear_config_t gear_config;
+static int _write_position = 0;
 
 motor_params_t *nv_get_motor_params(void) {
 	return &m_params;
@@ -56,13 +57,15 @@ static void nv_default_foc_params(void) {
 	foc_params.n_brkShutPower = CONFIG_BRK_SHUT_POWER_ENABLE;
 	foc_params.s_LimitiDC = CONFIG_DEFAULT_IDC_LIM;
 	foc_params.s_iDCeBrkLim = CONFIG_DEFAULT_EBRK_IDC_LIM;
-	foc_params.n_minThroVol = CONFIG_THROTTLE_LOW_VALUE;
-	foc_params.n_maxThroVol = CONFIG_THROTTLE_MAX_VALUE;
+	foc_params.n_startThroVol = CONFIG_THROTTLE_START_VALUE;
+	foc_params.n_endThroVol = CONFIG_THROTTLE_END_VALUE;
 	foc_params.n_autoHold = CONFIG_AUTOHOLD_ENABLE;
 	foc_params.n_acc_time = CONFIG_ACC_TIME;
 	foc_params.n_dec_time = CONFIG_DEC_TIME;
 	foc_params.n_ebrk_time = CONFIG_EBRK_RAMP_TIME;
 	foc_params.n_FwEnable  = CONFIG_DEFAULT_FW_ENABLE;
+	foc_params.f_minThroVol = CONFIG_THROTTLE_MIN_VALUE;
+	foc_params.f_maxThroVol = CONFIG_THROTTLE_MAX_VALUE;
 	foc_params.pid_conf[PID_D_id].kp = (foc_params.n_currentBand * MOTOR_Ld);
 	foc_params.pid_conf[PID_D_id].ki = (MOTOR_R/MOTOR_Ld);
 	foc_params.pid_conf[PID_D_id].kb = 0;
@@ -295,8 +298,8 @@ void nv_set_hwbrake_mode(u8 mode) {
 }
 
 void nv_set_throttle_vol(float min, float max) {
-	foc_params.n_minThroVol = min;
-	foc_params.n_maxThroVol = max;
+	foc_params.n_startThroVol = min;
+	foc_params.n_endThroVol = max;
 }
 
 void nv_set_ebrake_current(float phase_curr, float dc_curr) {
@@ -304,14 +307,14 @@ void nv_set_ebrake_current(float phase_curr, float dc_curr) {
 	foc_params.s_iDCeBrkLim = dc_curr;
 }
 
-torque_lut_t *nv_get_trq_tlb(void) {
-	torque_lut_t *tbl = (torque_lut_t *)fmc_get_addr(trq_Tbl_idx);
+trq2dq_table_t *_trq2dq_table(int idx) {
+	trq2dq_table_t *tbl = (trq2dq_table_t *)fmc_get_addr(idx);
 
 	if (tbl->magic != 0x5AA5) {
 		sys_error("trq tlb magic error, 0x%x\n", tbl->magic);
 		return NULL;
 	}
-	u16 crc = crc16_get((u8 *)tbl, sizeof(torque_lut_t) - 2);
+	u16 crc = crc16_get((u8 *)tbl, sizeof(trq2dq_table_t) - 4);
 	if (crc != tbl->crc16) {
 		sys_error("trq tlb crc16 error\n");
 		return NULL;
@@ -319,6 +322,89 @@ torque_lut_t *nv_get_trq_tlb(void) {
 	return tbl;
 }
 
+trq2dq_table_t *nv_get_trq2dq_table(void) {
+	trq2dq_table_t *tbl = _trq2dq_table(trq_Tbl_idx0);
+	if (tbl == NULL) {
+		tbl = _trq2dq_table(trq_Tbl_idx1);
+	}
+	return tbl;
+}
+
+void nv_write_trq_table_begin(int index) {
+	fmc_write_trq_table_begin(fmc_get_addr(index==0?trq_Tbl_idx0:trq_Tbl_idx1));
+	_write_position = 0;
+}
+
+int nv_write_trq_table_continue(uint8_t *data, int len){
+	int w_pos = decode_u24(data);
+
+	if (w_pos == _write_position && len > 3) {
+		fmc_write_trq_table_continue(data + 3, len - 3);
+		_write_position += len - 3;
+	}
+
+	return _write_position;
+}
+
+static int nv_write_trq_table1(void) {
+	nv_write_trq_table_begin(1);
+	nv_write_trq_table_continue((u8 *)fmc_get_addr(trq_Tbl_idx1), sizeof(trq2dq_table_t));
+	fmc_write_trq_table_end();
+
+	return _trq2dq_table(trq_Tbl_idx1) == NULL ? 1: 0;
+}
+
+int nv_write_trq_table_check(u8 *data, int len, int index) {
+	uint32_t size, checksum;
+	size = decode_u24(data);
+	checksum = decode_u32(data + 3);
+	u16 magic = 0x5AA5;
+	fmc_write_trq_table_continue((u8 *)&magic, sizeof(magic));
+	fmc_write_trq_table_continue((u8 *)&checksum, sizeof(checksum));
+	fmc_write_trq_table_end();
+
+	u16 fmc_checksum = crc16_get((const u8 *)fmc_get_addr(index==0?trq_Tbl_idx0:trq_Tbl_idx1), size);
+	if ((checksum == fmc_checksum) && (NULL != _trq2dq_table(index==0?trq_Tbl_idx0:trq_Tbl_idx1))) {
+		if (nv_write_trq_table1()) { //write back error
+			return 1;
+		}
+		return 0;
+	}
+
+	return 1;
+}
+
+int nv_write_sn(u8 *data, int len) {
+	mc_sn_t sn;
+	memset(&sn, 0, sizeof(sn));
+	len = min(ARRAY_SIZE(sn.sn), len);
+	memcpy(sn.sn, data, len);
+	sn.len = len;
+	sn.crc = crc16_get(data, len);
+	fmc_write_data(sn_page_index, (u8 *)&sn, sizeof(sn));
+	fmc_write_data(sn_idx_back, (u8 *)&sn, sizeof(sn));
+	return len;
+}
+int nv_read_sn(u8 *data, int len) {
+	mc_sn_t *sn;
+	memset(&sn, 0, sizeof(sn));
+	len = min(ARRAY_SIZE(sn->sn), len);
+	
+	sn = (mc_sn_t *)fmc_get_addr(sn_page_index);
+	u16 crc16 = crc16_get(sn->sn, min(32, sn->len));
+	if (crc16 == sn->crc) {
+		memcpy(data, sn->sn, len);
+		return len;
+	}
+	sn = (mc_sn_t *)fmc_get_addr(sn_idx_back);
+	crc16 = crc16_get(sn->sn, min(32, sn->len));
+	if (crc16 == sn->crc) {
+		memcpy(data, sn->sn, len);
+		return len;
+	}
+	return 0;
+}
+
 
 void nv_storage_init(void) {
 	nv_read_motor_params();
@@ -334,6 +420,6 @@ void nv_storage_init(void) {
 #if CONFIG_MOT_TYPE==MOTOR_BLUESHARK_NEW1
 	m_params.offset = 0.0f; //编码器做了零位置校准
 #endif
-	sys_debug("current band %f\n", foc_params.n_currentBand);
+	sys_debug("current band %f -- %d\n", foc_params.n_currentBand, sizeof(foc_params_t));
 }
 

+ 34 - 16
Applications/app/nv_storage.h

@@ -17,8 +17,8 @@ typedef struct {
 	float s_iDCeBrkLim;
 	float s_LimitiDC;
 	float n_currentBand; //电流环带宽
-	float n_minThroVol;
-	float n_maxThroVol;
+	float n_startThroVol;
+	float n_endThroVol;
 	u8    n_brkShutPower;
 	u8    n_autoHold;
 	u32   n_acc_time;
@@ -26,6 +26,9 @@ typedef struct {
 	u32   n_ebrk_time;
 	u8    n_FwEnable;
 	pid_conf_t pid_conf[PID_Max_id];
+	float f_minThroVol;
+	float f_maxThroVol;
+	u8    res[2048 - 161];
 	u16   crc16;
 }foc_params_t;
 
@@ -58,33 +61,45 @@ typedef struct {
 	u16   crc16;
 }mc_gear_config_t;
 
-#define MAX_TRQ_POINTS 60
-#define MAX_SPD_POINTS 100
-#define TBL_TRQ_INTVAL 10
-#define TBL_SPD_INTVAL 100
-struct lut_dq {
+#define MAX_TRQ_POINTS 20
+#define MAX_SPD_POINTS 40
+#define TBL_SPD_INTVAL 250
+
+typedef struct trq2dq {
+	s16 torque;
 	s16 d;
 	s16 q;
-};
+}trq2dq_t;
+
 typedef struct {
-	struct lut_dq dq[MAX_TRQ_POINTS][MAX_SPD_POINTS];
+	struct trq2dq tdq[MAX_SPD_POINTS][MAX_TRQ_POINTS];
 	u16  magic;
 	u16  crc16;
-}torque_lut_t;
+}trq2dq_table_t;
 
 #pragma pack(pop)
 
+typedef struct {
+	u8 sn[32];
+	u16 len;
+	u16 crc;
+}mc_sn_t;
+
+
 #define motorParam_idx_0 3
 #define motorParam_idx_1 (motorParam_idx_0 + 1)
 #define focParam_idx_0 (motorParam_idx_0 + 2)
 #define focParam_idx_1 (motorParam_idx_0 + 3)
 
-#define trq_Tbl_idx (focParam_idx_1 + 1)
-#define trq_Tbl_size (30)
+#define trq_Tbl_size (4)
+#define trq_Tbl_idx0 (focParam_idx_1 + 1)
+#define trq_Tbl_idx1 (trq_Tbl_idx0 + 4)
 
-#define gear_config_idx_0 (trq_Tbl_idx + trq_Tbl_size)
+#define gear_config_idx_0 (trq_Tbl_idx1 + trq_Tbl_size)
 #define gear_config_idx_1 (gear_config_idx_0 + 1)
 
+#define sn_idx_back       (gear_config_idx_1 + 1)
+
 void nv_storage_init(void);
 motor_params_t *nv_get_motor_params(void);
 foc_params_t *nv_get_foc_params(void);
@@ -102,8 +117,11 @@ void nv_set_throttle_vol(float min, float max);
 void nv_set_ebrake_current(float phase_curr, float dc_curr);
 bool nv_set_gear_config(u8 mode4896, u8 gear, u16 rpm, u16 torque, u16 idc, u16 acc);
 bool nv_get_gear_config(u8 mode4896, u8 gear, u16 *rpm, u16 *torque, u16 *idc, u16 *acc);
-
-torque_lut_t *nv_get_trq_tlb(void);
-
+trq2dq_table_t *nv_get_trq2dq_table(void);
+void nv_write_trq_table_begin(int index);
+int nv_write_trq_table_continue(uint8_t *data, int len);
+int nv_write_trq_table_check(u8 *data, int len, int index);
+int nv_write_sn(u8 *data, int len);
+int nv_read_sn(u8 *data, int len);
 #endif /* _NV_Storage_H__ */
 

+ 1 - 1
Applications/bsp/board_mc100_v1.h

@@ -331,7 +331,7 @@
 #endif
 #define DEBUG_PORT_UART2
 
-#define CONFIG_MOT_TYPE MOTOR_BLUESHARK_NEW1
+#define CONFIG_MOT_TYPE MOTOR_BLUESHARK_ZD_100
 
 //#define CONFIG_DQ_STEP_RESPONSE
 

+ 100 - 31
Applications/bsp/fmc_flash.c

@@ -7,38 +7,43 @@
 #define FMC_FLAG_END  FMC_FLAG_BANK0_END
 #endif
 
-#define one_page_size 2048
 
-#define data_bk_page_index 4
-#define data_page_index 3
-#define sn_page_index 2
-#define magic_page_index 1 //must is the last page in 256K eara
 static void _fmc_write_data(uint32_t addr, uint8_t *data, int len);
 static void _fmc_read_data(uint32_t addr, uint8_t *data, int len);
+static void _fmc_erase_addr(uint32_t addr, int len);
+static void _fmc_read_data(uint32_t addr, uint8_t *data, int len);
+static void _fmc_erase_write_data(uint32_t addr, uint8_t *data, int len);
+
 static uint32_t _sn_addr(void);
 static uint32_t _data_addr(int index);
 static uint32_t _maigc_addr(void);
 
+static uint32_t _nv_tbl_write_addr = 0;
+
+static u8 _nv_tbl_write_cache[4];
+static u8 _nv_tbl_write_remain;
+
 void fmc_write_sn(uint8_t *sn, int len){
-	_fmc_write_data(_sn_addr(), sn, len);
+	_fmc_erase_write_data(_sn_addr(), sn, len);
 }
 
 void fmc_read_sn(uint8_t *sn, int len){
-	_fmc_read_data(_sn_addr(), sn, len);
+	_fmc_erase_write_data(_sn_addr(), sn, len);
 }
 
 void fmc_write_data(int index, uint8_t *data, int len){
-	_fmc_write_data(_data_addr(index), data, len);
+	_fmc_erase_write_data(_data_addr(index), data, len);
 }
 
 void fmc_read_data(int index, uint8_t *data, int len){
-	_fmc_read_data(_data_addr(index), data, len);
+	_fmc_erase_write_data(_data_addr(index), data, len);
 }
 
 static __inline__ void _fmc_flag_clear(void) {
 	fmc_flag_clear(FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END);
 }
 
+
 void fmc_write_magic(uint32_t magic){
 	uint32_t address = _maigc_addr();
 	uint32_t length, checksum, value;
@@ -111,39 +116,103 @@ uint32_t fmc_get_addr(int page) {
 	return 0x08000000 + (_flash_capatity() - one_page_size * page);
 }
 
+void fmc_erase_trq_table(int addr, int len){
+	_fmc_erase_addr(addr, len);
+	_nv_tbl_write_addr = 0;
+}
+void fmc_write_trq_table(int addr, uint8_t *data, int len){
+	_fmc_write_data(addr + _nv_tbl_write_addr, data, len);
+	_nv_tbl_write_addr += len;
+}
+
+void fmc_write_trq_table_begin(int addr)
+{
+	_nv_tbl_write_addr = addr;
+	_nv_tbl_write_remain = 0;
+}
+
+static void fmc_write_trq_table_flush(void)
+{
+	u32 value = *(u32 *) _nv_tbl_write_cache;
+
+	if ((_nv_tbl_write_addr % one_page_size) == 0) {
+		fmc_flag_clear(FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END);
+		fmc_page_erase(_nv_tbl_write_addr);
+	}
 
-static void _fmc_write_data(uint32_t addr, uint8_t *data, int len){
-	int page_count = (len + (one_page_size-1))/one_page_size;
-	fmc_unlock();
 	fmc_flag_clear(FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END);
-	for (int i = 0; i < page_count; i++) {
+	fmc_word_program(_nv_tbl_write_addr, value);
+
+	_nv_tbl_write_addr += _nv_tbl_write_remain;
+	_nv_tbl_write_remain = 0;
+}
+
+void fmc_write_trq_table_continue(const u8 *data, int len)
+{
+	const u8 *data_end;
+
+	fmc_unlock();
+
+	for (data_end = data + len; data < data_end; data++) {
+		if (_nv_tbl_write_remain >= sizeof(_nv_tbl_write_cache)) {
+			fmc_write_trq_table_flush();
+		}
+
+		_nv_tbl_write_cache[_nv_tbl_write_remain] = *data;
+		_nv_tbl_write_remain++;
+	}
+
+	fmc_lock();
+}
+
+void fmc_write_trq_table_end(void)
+{
+	if (_nv_tbl_write_remain > 0) {
+		fmc_unlock();
+		fmc_write_trq_table_flush();
+		fmc_lock();
+	}
+}
+
+extern void wdog_reload(void);
+static void _fmc_erase_addr(uint32_t addr, int len){
+	fmc_unlock();
+	uint32_t pages = len/one_page_size + (((len % one_page_size) > 0)?1:0);
+	for (int i = 0; i < pages; i++){
+		fmc_flag_clear(FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END);
 		fmc_page_erase(addr + i * one_page_size);
+		wdog_reload();
 	}
-	int total_words = len>>2;
+	fmc_lock();
+}
+
+static void _fmc_write_data(uint32_t addr, uint8_t *data, int len){
+	fmc_unlock();
+	int total_words = len / 4;
 	uint32_t *p_u32_data = (uint32_t *)data;
 	int i;
 	for (i = 0; i < total_words; i++){
 		fmc_flag_clear(FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END);
-		fmc_word_program(addr + i * 4, p_u32_data[i]);
+		fmc_word_program(addr, p_u32_data[i]);
+		data += 4;
+		addr += 4;
 	}
-	data += i * 4;
-	addr += i * 4;
-	total_words = len - total_words * 4;
-	if (total_words > 0){
-		if (total_words == 1){
-			uint16_t half = *data;
-			fmc_flag_clear(FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END);
-			fmc_halfword_program(addr, half);
-		}else if (total_words == 2){
-			uint16_t half = *((uint16_t *)data);
-			fmc_flag_clear(FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END);
-			fmc_halfword_program(addr, half);
-		}else {
-			uint32_t words = *((uint32_t *)data);
-			fmc_flag_clear(FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END);
-			fmc_word_program(addr, words);
+
+	int remain_len = len - total_words * 4;
+	if (remain_len > 0){
+		uint32_t words = 0;
+		for (int i = 0; i < remain_len; i++){
+			words |= data[i] << (8*i);
 		}
+		fmc_flag_clear(FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END);
+		fmc_word_program(addr, words);
 	}
 	fmc_lock();
 }
 
+
+static void _fmc_erase_write_data(uint32_t addr, uint8_t *data, int len){
+	_fmc_erase_addr(addr, len);
+	_fmc_write_data(addr, data, len);
+}
+

+ 10 - 0
Applications/bsp/fmc_flash.h

@@ -2,6 +2,13 @@
 #define _FMC_FLASH_H__
 #include <stdint.h>
 
+#define one_page_size 2048
+
+#define data_bk_page_index 4
+#define data_page_index 3
+#define sn_page_index 2
+#define magic_page_index 1 //must is the last page in 256K eara
+
 void fmc_write_sn(uint8_t *sn, int len);
 void fmc_read_sn(uint8_t *sn, int len);
 
@@ -10,6 +17,9 @@ void fmc_read_data(int index, uint8_t *data, int len);
 void fmc_write_magic(uint32_t magic);
 uint32_t fmc_read_magic(void);
 uint32_t fmc_get_addr(int page);
+void fmc_write_trq_table_begin(int addr);
+void fmc_write_trq_table_continue(const u8 *data, int len);
+void fmc_write_trq_table_end(void);
 
 #endif /* _FMC_FLASH_H__ */
 

+ 45 - 6
Applications/foc/commands.c

@@ -383,10 +383,10 @@ static void process_foc_command(foc_cmd_body_t *command) {
 			if (mc_is_start()) {
 				erroCode = FOC_NotAllowed;
 			}else {
-				u16 min = decode_u16((u8 *)command->data);
-				u16 max = decode_u16((u8 *)command->data + 2);
-				nv_get_foc_params()->n_minThroVol = (float)min/100.0f;
-				nv_get_foc_params()->n_maxThroVol = (float)max/100.0f;
+				u16 start = decode_u16((u8 *)command->data);
+				u16 end = decode_u16((u8 *)command->data + 2);
+				nv_get_foc_params()->n_startThroVol = (float)start/100.0f;
+				nv_get_foc_params()->n_endThroVol = (float)end/100.0f;
 				nv_save_foc_params();
 			}
 			break;
@@ -418,8 +418,8 @@ static void process_foc_command(foc_cmd_body_t *command) {
 				nv_get_foc_params()->s_PhaseCurreBrkLim = decode_s16((u8 *)command->data + 4);
 				nv_get_foc_params()->s_iDCeBrkLim = decode_s16((u8 *)command->data + 6);
 				nv_get_foc_params()->s_LimitiDC = decode_s16((u8 *)command->data + 8);
-				nv_get_foc_params()->n_minThroVol = (float)decode_s16((u8 *)command->data + 10)/100.0f;
-				nv_get_foc_params()->n_maxThroVol = (float)decode_s16((u8 *)command->data + 12)/100.0f;
+				nv_get_foc_params()->n_startThroVol = (float)decode_s16((u8 *)command->data + 10)/100.0f;
+				nv_get_foc_params()->n_endThroVol = (float)decode_s16((u8 *)command->data + 12)/100.0f;
 				nv_get_foc_params()->s_maxEpmRPM = decode_s16((u8 *)command->data + 14);
 				nv_get_foc_params()->s_maxEpmPhaseCurrLim = decode_s16((u8 *)command->data + 16);
 				nv_get_foc_params()->n_brkShutPower = decode_u8((u8 *)command->data + 18);
@@ -440,6 +440,11 @@ static void process_foc_command(foc_cmd_body_t *command) {
 		}
 		case Foc_Set_eBrake_Throld:
 		{
+			if (command->len >= 4) {
+				nv_get_foc_params()->s_iDCeBrkLim = decode_s16((u8 *)command->data);
+				nv_get_foc_params()->s_LimitiDC = decode_s16((u8 *)command->data + 2);
+				nv_save_foc_params();
+			}
 			break;
 		}
 		case Foc_Use_SensorLess_Angle:
@@ -454,6 +459,40 @@ static void process_foc_command(foc_cmd_body_t *command) {
 			}
 			break;
 		}
+		case Foc_Start_Write_TRQ_Table:
+		{
+			nv_write_trq_table_begin(0);
+			break;
+		}
+		case Foc_Write_TRQ_Table:
+		{
+			u32 pos = nv_write_trq_table_continue((u8 *)command->data, command->len);
+			encode_u24(response+3, pos);
+			len += 3;
+			break;
+		}
+		case Foc_End_Write_TRQ_Table:
+		{
+			erroCode = nv_write_trq_table_check((u8 *)command->data, command->len, 0)?FOC_CRC_Err:FOC_Success;
+			break;
+		}
+		case Foc_SN_Write:
+		{
+			if (command->len < 18) {
+				erroCode = FOC_Param_Err;
+			}else{
+				erroCode = nv_write_sn((u8 *)command->data, len)>0?0:1 ;
+			}
+			break;
+		}
+		case Foc_SN_Read:
+		{
+			if (nv_read_sn(response + 3, 18) == 0) {
+				memset(response + 3, '0', 18);
+			}
+			len += 18;
+			break;
+		}
 		default:
 		{
 			erroCode = FOC_Unknow_Cmd;

+ 5 - 0
Applications/foc/commands.h

@@ -35,6 +35,11 @@ typedef enum {
 	Foc_Use_SensorLess_Angle,
 	Foc_Force_Open_Run,
 	Foc_Enc_Zero_Cali_Result,
+	Foc_Start_Write_TRQ_Table,
+	Foc_Write_TRQ_Table,
+	Foc_End_Write_TRQ_Table,
+	Foc_SN_Write,
+	Foc_SN_Read,
 	Foc_Hall_Phase_Cali_Result = 160,
 	Foc_Hall_Offset_Cali_Result,
 	Foc_Report_Speed,

+ 1 - 1
Applications/foc/core/PMSM_FOC_Core.c

@@ -534,7 +534,7 @@ static __INLINE void PMSM_FOC_idq_Assign(void) {
 			gFoc_Ctrl.in.s_targetIdq.q = gFoc_Ctrl.in.s_targetCurrent;
 		}
 	}else if ((gFoc_Ctrl.out.n_RunMode == CTRL_MODE_TRQ) || (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_SPD)) {
-		torque_get_idq(gFoc_Ctrl.in.s_targetTorque, gFoc_Ctrl.in.s_motRPM, &gFoc_Ctrl.in.s_targetIdq);
+		trq2dq_lookup((int)gFoc_Ctrl.in.s_motRPM, gFoc_Ctrl.in.s_targetTorque, &gFoc_Ctrl.in.s_targetIdq);
 		PMSM_FOC_FieldWeak();
 	}
 	u32 mask = cpu_enter_critical();

+ 2 - 0
Applications/foc/core/PMSM_FOC_Core.h

@@ -44,6 +44,7 @@ typedef enum {
 	FOC_NotCruiseMode,
 	FOC_Param_Err,
 	FOC_MEM_Err,
+	FOC_CRC_Err,
 	FOC_Unknow_Cmd,
 }FOC_ErrCode_t;
 
@@ -63,6 +64,7 @@ typedef enum {
 	FOC_CRIT_MOS_TEMP_Err,
 	FOC_CRIT_Fan1_Err,
 	FOC_CRIT_Fan2_Err,
+	FOC_CRIT_THRO_Err,
 	FOC_CRIT_Err_Max = 32,	
 }FOC_CritiCal_Ebit_t;
 

+ 4 - 37
Applications/foc/core/torque.c

@@ -19,10 +19,9 @@ static rpm_trq_map_t gear_torques[5][5] = {
 /*
 通过查表获取对应扭矩和速度时的Id和IQ的分配
 */
-static torque_lut_t *torque_lkup_table = NULL;
+
 static torque_manager_t torque_ctrl;
 void torque_init(void) {
-	torque_lkup_table = nv_get_trq_tlb();
 	torque_reset();
 }
 
@@ -30,38 +29,6 @@ void torque_reset(void) {
 	memset(&torque_ctrl, 0, sizeof(torque_ctrl));
 }
 
-void torque_get_idq(float torque, float rpm, DQ_t *dq_out) {
-	if ((torque_lkup_table == NULL) || (torque < 0 || rpm < 0)) {
-		dq_out->d = 0;
-		dq_out->q = torque;
-		return;
-	}
-	int trq_idx = (int)torque / TBL_TRQ_INTVAL;
-	int rpm_idx = (int)rpm / TBL_SPD_INTVAL;
-	if (trq_idx >= MAX_TRQ_POINTS) {
-		trq_idx = MAX_TRQ_POINTS -1;
-	}
-	if (rpm_idx >= MAX_SPD_POINTS) {
-		rpm_idx = MAX_SPD_POINTS -1;
-	}
-	s16 d = torque_lkup_table->dq[trq_idx][rpm_idx].d;
-	s16 q = torque_lkup_table->dq[trq_idx][rpm_idx].q;
-	if (trq_idx < MAX_TRQ_POINTS - 1) {
-		trq_idx += 1;
-	}
-	if (rpm_idx < MAX_SPD_POINTS - 1) {
-		rpm_idx += 1;
-	}
-	s16 d_delta = torque_lkup_table->dq[trq_idx][rpm_idx].d - d;
-	s16 q_delta = torque_lkup_table->dq[trq_idx][rpm_idx].q - q;
-	float comp_ceof = 0.5f * ((torque - torque/TBL_TRQ_INTVAL*TBL_TRQ_INTVAL)/(float)TBL_TRQ_INTVAL + (rpm - rpm/TBL_SPD_INTVAL*TBL_SPD_INTVAL)/(float)TBL_SPD_INTVAL);
-
-	dq_out->d = d + d_delta * comp_ceof;
-	dq_out->q = q + q_delta * comp_ceof;
-
-}
-
-
 float torque_max_from_gear_rpm(void) {
 	u8 gear = mc_get_gear();
 	if (gear > 4) {
@@ -92,12 +59,12 @@ float torque_max_from_gear_rpm(void) {
 
 /* 获取油门开度 */
 static float throttle_ration(float f_throttle) {
-	if (f_throttle <= nv_get_foc_params()->n_minThroVol) {
+	if (f_throttle <= nv_get_foc_params()->n_startThroVol) {
 		return 0;
 	}
-	float delta = f_throttle - (nv_get_foc_params()->n_minThroVol);
+	float delta = f_throttle - (nv_get_foc_params()->n_startThroVol);
 
-	int ration = (delta * 100.0f) / (nv_get_foc_params()->n_maxThroVol - nv_get_foc_params()->n_minThroVol);
+	int ration = (delta * 100.0f) / (nv_get_foc_params()->n_endThroVol - nv_get_foc_params()->n_startThroVol);
 	
 	return ((float)ration)/100.0f;
 }

+ 1 - 1
Applications/foc/core/torque.h

@@ -12,7 +12,7 @@ typedef struct {
 }torque_manager_t;
 void torque_init(void);
 void torque_reset(void);
-void torque_get_idq(float torque, float rpm, DQ_t *dq_out);
+void trq2dq_lookup(int rpm, float torque, DQ_t *dq_out);
 void throttle_process(u8 run_mode, float f_throttle);
 void request_torque(float thro_ration);
 #endif /*_TORQUE_LUT_H__ */

+ 106 - 0
Applications/foc/core/trq2dq_table.c

@@ -0,0 +1,106 @@
+#include "os/os_types.h"
+#include "foc/core/PMSM_FOC_Core.h"
+#include "app/nv_storage.h"
+#include "libs/logger.h"
+
+#define RPM_I_MAX MAX_SPD_POINTS
+#define TRQ_I_MAX MAX_TRQ_POINTS
+#define RPM_INTVAL TBL_SPD_INTVAL
+#define IDX2RPM(I) ((I)*RPM_INTVAL + RPM_INTVAL)
+static trq2dq_t **table_map = NULL;
+//x -> rpm
+//z -> torque
+static void intp_line2(float frac_x, float z, trq2dq_t **map, DQ_t *dq_out) {
+	float frac_z1 = 0; //对应x1索引的t_maps
+	float frac_z2 = 0; //对应x2索引的t_maps
+
+	sys_debug("low --> %d %d\n", map[1]->torque, map[0]->torque);
+	if ((map[1]->torque != map[0]->torque)) {
+		frac_z1 = (float)(z - map[0]->torque)/(map[1]->torque - map[0]->torque);
+	}
+	sys_debug("high --> %d %d\n", map[3]->torque, map[2]->torque);
+	if ((map[3]->torque != map[2]->torque)) {
+		frac_z2 = (float)(z - map[2]->torque)/(map[3]->torque - map[2]->torque);
+	}
+	
+	sys_debug("%f -- %f -- %f\n", frac_x, frac_z1, frac_z2);
+
+	float c1 = (1.0f - frac_z1) * map[0]->d + frac_z1 * map[1]->d; //第一行插值
+	float c2 = (1.0f - frac_z2) * map[2]->d + frac_z2 * map[3]->d; //第二行插值
+	dq_out->d = c1 * (1.0f - frac_x) + c2 * frac_x;                //两行插值
+	
+	c1 = (1.0f - frac_z1) * map[0]->q + frac_z1 * map[1]->q;
+	c2 = (1.0f - frac_z2) * map[2]->q + frac_z2 * map[3]->q;
+	dq_out->q = c1 * (1.0f - frac_x) + c2 * frac_x;
+}
+
+static void get_torque_range(float z, int index, int max_index, int *left, int *right) {
+	int low_left = max_index - 1, low_right = max_index - 1;
+	if (z < table_map[index][0].torque) {
+		low_right = low_left = 0;
+	}else if (z > table_map[index][max_index - 1].torque) {
+		low_right = low_left = max_index - 1;
+	}else {
+		for (int i = 0; i < max_index; i++) {
+			sys_debug("index %d, trq %d\n", i, table_map[index][i].torque);
+			if (z >= table_map[index][i].torque) {
+				low_left = i;
+				low_right = i + 1;
+				if (i == max_index - 1) {
+					low_right = low_left;
+					break;
+				}
+			}
+		}
+	}
+	*left = low_left;
+	*right = low_right;
+}
+
+void trq2dq_lookup(int rpm, float torque, DQ_t *dq_out) {
+	if (table_map == NULL) {
+		trq2dq_table_t *table = nv_get_trq2dq_table();
+		if (table != NULL) {
+			table_map = (trq2dq_t **)&table->tdq[0][0];
+		}
+		if (table_map == NULL) {
+			dq_out->d = 0;
+			dq_out->q = torque;
+		}
+		return;
+	}
+	
+	int low = 0, high = 0;
+
+	low = rpm / RPM_INTVAL - 1;
+
+	if (low >= RPM_I_MAX) {
+		low = RPM_I_MAX - 1;
+	}
+	if ((low < 0) || low == (RPM_I_MAX-1))  {
+		high = low = 0;
+	}else {
+		high = low + 1;
+	}
+	sys_debug("speed %d-%d\n", low, high);
+
+	int low_left = TRQ_I_MAX - 1, low_right = TRQ_I_MAX - 1;
+	get_torque_range(torque, low, TRQ_I_MAX, &low_left, &low_right);
+	sys_debug("low speed torque %d-%d\n", low_left, low_right);
+	
+	int high_left = TRQ_I_MAX - 1, high_right = TRQ_I_MAX - 1;
+	get_torque_range(torque, high, TRQ_I_MAX, &high_left, &high_right);
+	sys_debug("high speed torque %d-%d\n", high_left, high_right);
+	trq2dq_t *maps[4];
+	maps[0] = &table_map[low][low_left];
+	maps[1] = &table_map[low][low_right];
+	maps[2] = &table_map[high][high_left];
+	maps[3] = &table_map[high][high_right];
+	float frac_x = 0;
+	int x1 = IDX2RPM(low);
+	int x2 = IDX2RPM(high);
+	if (x1 != x2) {
+		frac_x = (float)(rpm - x1)/(x2 - x1);
+	}	
+	intp_line2(frac_x, torque, maps, dq_out);
+}

+ 6 - 3
Applications/foc/foc_config.h

@@ -10,15 +10,18 @@
 
 #define CONFIG_DEFAULT_EPM_PHASE_CURR 50
 #define CONFIG_DEFAULT_EPM_RPM        200
-#define CONFIG_DEFAULT_EBRK_PHASE_CURR 10.0F //0:means disable ebrake
+#define CONFIG_DEFAULT_EBRK_PHASE_CURR 0 //0:means disable ebrake
 #define CONFIG_DEFAULT_EBRK_IDC_LIM 15
 #define CONFIG_SVM_MODULATION       1.0f//(1.0F/SQRT3_BY_2)
 #define CONFIG_BRK_SHUT_POWER_ENABLE 1
 #define CONFIG_AUTOHOLD_ENABLE 1
 #define CONFIG_DEFAULT_FW_ENABLE 1
 /* 转把 */
-#define CONFIG_THROTTLE_LOW_VALUE 1.2f /* 转把最小值 */
-#define CONFIG_THROTTLE_MAX_VALUE 3.8f /* 转把最大值 */
+#define CONFIG_THROTTLE_MIN_VALUE 0.4F   /* 转把最小电压,低于这个值,不给启动 */
+#define CONFIG_THROTTLE_START_VALUE 1.2f /* 转把启动电压 */
+#define CONFIG_THROTTLE_END_VALUE 3.8f /* 转把停止电压 */
+#define CONFIG_THROTTLE_MAX_VALUE 4.8F /* 转把最大电压,大于这个值,不给启动 */
+
 #define CONFIG_THROTTLE_MIN_RPM   10   /* 转把对应最小的速度 */
 #define CONFIG_THROTTLE_MIN_IDQ   20   /* 转把对应最小的扭矩电流 Q轴 */
 #define CONFIG_MIN_CRUISE_RPM 	  1000   /* 能启动定速巡航的最小速度 */

+ 5 - 1
Applications/foc/motor/motor.c

@@ -77,6 +77,9 @@ static void MC_Check_MosVbusThrottle(void) {
 	if (vbus_vol > nv_get_foc_params()->s_maxDCVol) {
 		mc_set_critical_error(FOC_CRIT_OV_Vol_Err);
 	}
+	if ((get_throttle_float() < nv_get_foc_params()->f_minThroVol) || (get_throttle_float() > nv_get_foc_params()->f_maxThroVol)) {
+		mc_set_critical_error(FOC_CRIT_THRO_Err);
+	}
 	if (abc[0] > vbus_vol/2 || abc[1] > vbus_vol/2 || abc[2] > vbus_vol/2) {
 		mc_set_critical_error(FOC_CRIT_H_MOS_Err);
 	}else if (abc[0] < 0.001f){
@@ -423,6 +426,7 @@ void mc_set_throttle_r(u8 r) {
 
 	if (r > 0) {
 		motor.b_ignor_throttle = true;
+		mc_clr_critical_error(FOC_CRIT_THRO_Err);
 	}else {
 		motor.b_ignor_throttle = false;		
 	}
@@ -681,7 +685,7 @@ bool mc_throttle_released(void) {
 	if (motor.b_ignor_throttle) {
 		return motor.u_throttle_ration == 0;
 	}
-	return get_throttle_float() <= nv_get_foc_params()->n_minThroVol;
+	return get_throttle_float() <= nv_get_foc_params()->n_startThroVol;
 }
 
 static bool mc_is_gpio_mlock(void) {

+ 1 - 1
Applications/foc/ntc.c

@@ -24,7 +24,7 @@ s16 ntc_get_mos_temp(u16 r) {
 		}
 	}
 	if (i == 0) {
-		return -10;
+		return -40;
 	}else if (i >= ARRAY_SIZE(ntc_table)) {
 		return 251;
 	}else if (r == ntc_table[i]) {

+ 2 - 2
Applications/prot/can_foc_msg.c

@@ -98,8 +98,8 @@ void can_report_mpta_values(u8 can) {
 	}
 	encoder_can_key(data, CMD_2_CAN_KEY(Foc_Report_MTPA_DQ_Angle));
 	encode_s16(data + 2, S16Q5(PMSM_FOC_Get()->out.s_RealCurrent));
-	encode_s16(data + 4, S16Q5(PMSM_FOC_Get()->in.s_targetIdq.d));
-	encode_s16(data + 6, S16Q5(PMSM_FOC_Get()->in.s_targetIdq.q));
+	encode_s16(data + 4, S16Q5(PMSM_FOC_Get()->out.s_FilterIdq.d));
+	encode_s16(data + 6, S16Q5(PMSM_FOC_Get()->out.s_FilterIdq.q));
 	can_send_message(get_indicator_can_id(can), data, sizeof(data), 0);
 }
 

+ 70 - 58
Project/MC100.uvoptx

@@ -386,6 +386,18 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>15</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\Applications\foc\core\trq2dq_table.c</PathWithFileName>
+      <FilenameWithoutPath>trq2dq_table.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>
@@ -396,7 +408,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>15</FileNumber>
+      <FileNumber>16</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -408,7 +420,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>16</FileNumber>
+      <FileNumber>17</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -420,7 +432,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>17</FileNumber>
+      <FileNumber>18</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -432,7 +444,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>18</FileNumber>
+      <FileNumber>19</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -444,7 +456,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>19</FileNumber>
+      <FileNumber>20</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -456,7 +468,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>20</FileNumber>
+      <FileNumber>21</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -476,7 +488,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>21</FileNumber>
+      <FileNumber>22</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -488,7 +500,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>22</FileNumber>
+      <FileNumber>23</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -500,7 +512,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>23</FileNumber>
+      <FileNumber>24</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -512,7 +524,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>24</FileNumber>
+      <FileNumber>25</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -532,7 +544,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>25</FileNumber>
+      <FileNumber>26</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -544,7 +556,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>26</FileNumber>
+      <FileNumber>27</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -556,7 +568,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>27</FileNumber>
+      <FileNumber>28</FileNumber>
       <FileType>4</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -568,7 +580,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>28</FileNumber>
+      <FileNumber>29</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -588,7 +600,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>29</FileNumber>
+      <FileNumber>30</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -600,7 +612,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>30</FileNumber>
+      <FileNumber>31</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -612,7 +624,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>31</FileNumber>
+      <FileNumber>32</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -624,7 +636,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>32</FileNumber>
+      <FileNumber>33</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -636,7 +648,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>33</FileNumber>
+      <FileNumber>34</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -648,7 +660,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>34</FileNumber>
+      <FileNumber>35</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -660,7 +672,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>35</FileNumber>
+      <FileNumber>36</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -672,7 +684,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>36</FileNumber>
+      <FileNumber>37</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -684,7 +696,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>37</FileNumber>
+      <FileNumber>38</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -696,7 +708,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>38</FileNumber>
+      <FileNumber>39</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -708,7 +720,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>39</FileNumber>
+      <FileNumber>40</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -720,7 +732,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>40</FileNumber>
+      <FileNumber>41</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -732,7 +744,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>41</FileNumber>
+      <FileNumber>42</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -744,7 +756,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>42</FileNumber>
+      <FileNumber>43</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -756,7 +768,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>43</FileNumber>
+      <FileNumber>44</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -768,7 +780,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>44</FileNumber>
+      <FileNumber>45</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -780,7 +792,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>45</FileNumber>
+      <FileNumber>46</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -800,7 +812,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>46</FileNumber>
+      <FileNumber>47</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -812,7 +824,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>47</FileNumber>
+      <FileNumber>48</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -824,7 +836,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>48</FileNumber>
+      <FileNumber>49</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -836,7 +848,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>49</FileNumber>
+      <FileNumber>50</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -848,7 +860,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>50</FileNumber>
+      <FileNumber>51</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -860,7 +872,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>51</FileNumber>
+      <FileNumber>52</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -880,7 +892,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>52</FileNumber>
+      <FileNumber>53</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -892,7 +904,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>53</FileNumber>
+      <FileNumber>54</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -904,7 +916,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>54</FileNumber>
+      <FileNumber>55</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -924,7 +936,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>55</FileNumber>
+      <FileNumber>56</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -936,7 +948,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>56</FileNumber>
+      <FileNumber>57</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -948,7 +960,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>57</FileNumber>
+      <FileNumber>58</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -960,7 +972,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>58</FileNumber>
+      <FileNumber>59</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -972,7 +984,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>59</FileNumber>
+      <FileNumber>60</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -984,7 +996,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>60</FileNumber>
+      <FileNumber>61</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -996,7 +1008,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>61</FileNumber>
+      <FileNumber>62</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1008,7 +1020,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>62</FileNumber>
+      <FileNumber>63</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1020,7 +1032,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>63</FileNumber>
+      <FileNumber>64</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1032,7 +1044,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>64</FileNumber>
+      <FileNumber>65</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1044,7 +1056,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>65</FileNumber>
+      <FileNumber>66</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1056,7 +1068,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>66</FileNumber>
+      <FileNumber>67</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1068,7 +1080,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>67</FileNumber>
+      <FileNumber>68</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1080,7 +1092,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>68</FileNumber>
+      <FileNumber>69</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1092,7 +1104,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>69</FileNumber>
+      <FileNumber>70</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1104,7 +1116,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>70</FileNumber>
+      <FileNumber>71</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1124,7 +1136,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>10</GroupNumber>
-      <FileNumber>71</FileNumber>
+      <FileNumber>72</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1136,7 +1148,7 @@
     </File>
     <File>
       <GroupNumber>10</GroupNumber>
-      <FileNumber>72</FileNumber>
+      <FileNumber>73</FileNumber>
       <FileType>2</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>

+ 5 - 0
Project/MC100.uvprojx

@@ -458,6 +458,11 @@
               <FileType>1</FileType>
               <FilePath>..\Applications\foc\core\foc_observer.c</FilePath>
             </File>
+            <File>
+              <FileName>trq2dq_table.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\Applications\foc\core\trq2dq_table.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>

TEMPAT SAMPAH
Simulink/Test_motor_map.xls


TEMPAT SAMPAH
Simulink/untitled.slx.autosave