stmbl/shared/common.h

164 lines
3.9 KiB
C

/*
* This file is part of the stmbl project.
*
* Copyright (C) 2013-2017 Rene Hopf <renehopf@mac.com>
* Copyright (C) 2013-2017 Nico Stute <crinq@crinq.de>
*
* 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, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <stdint.h>
#include "stmbl_talk.h"
#if __GNUC__ < 5
#error gcc to old (< 5.0)
#endif
#define DATABAUD 3000000 //baudrate used for communication
#pragma pack(push, 1)
typedef struct {
stmbl_talk_header_t header;
uint32_t addr;
uint32_t value;
enum {
BOOTLOADER_OPCODE_NOP = 0,
BOOTLOADER_OPCODE_READ,
BOOTLOADER_OPCODE_WRITE, // MEM[addr] = value
BOOTLOADER_OPCODE_PAGEERASE, // clear PAGE[addr]
BOOTLOADER_OPCODE_CRCCHECK, // CRC(APP) == 0
} cmd : 8;
enum {
BOOTLOADER_STATE_OK = 0,
BOOTLOADER_STATE_NAK,
} state : 8;
uint16_t padding;
} packet_bootloader_t;
_Static_assert(sizeof(packet_bootloader_t) == 24, "packet_bootloader_t size error");
//process data from f3 to f4
typedef struct {
stmbl_talk_header_t header;
float d_fb;
float q_fb;
uint8_t fault;
uint8_t buf;
uint16_t padding;
} packet_from_hv_t;
_Static_assert(sizeof(packet_from_hv_t) == 24, "packet_from_hv_t size error");
//process data from f4 to f3
typedef struct {
stmbl_talk_header_t header;
float d_cmd;
float q_cmd;
float pos;
float vel;
union {
struct {
uint8_t buf;
uint32_t enable : 1;
enum packet_to_hv_cmd_type_t {
VOLT_MODE = 0,
CURRENT_MODE,
} cmd_type : 1;
enum packet_to_hv_phase_type_t {
PHASE_90_3PH = 0,
PHASE_90_4PH,
PHASE_120_3PH,
PHASE_180_2PH,
PHASE_180_3PH,
} phase_type : 3;
uint32_t ignore_fault_pin : 1;
} flags;
uint32_t padding;
};
} packet_to_hv_t;
_Static_assert(sizeof(packet_to_hv_t) == 32, "packet_to_hv_t size error");
//config data for f3
typedef union {
struct f3_config_data_temp {
float r;
float l;
float psi;
float cur_p;
float cur_i;
float cur_ff;
float cur_ind;
float max_y;
float max_cur;
float dac;
} pins;
float data[sizeof(struct f3_config_data_temp) / 4];
} f3_config_data_t;
//status reply from f3
typedef union {
struct f3_state_data_temp {
float u_fb;
float v_fb;
float w_fb;
float hv_temp;
float mot_temp;
float core_temp;
float dc_volt;
float pwm_volt;
float y;
} pins;
float data[sizeof(struct f3_state_data_temp) / 4];
} f3_state_data_t;
#pragma pack(pop)
//fault state
typedef enum {
DISABLED = 0,
ENABLED,
PHASING,
SOFT_FAULT,
HARD_FAULT,
LED_TEST,
} state_t;
//fault error codes
typedef enum {
NO_ERROR = 0,
CMD_ERROR,
MOT_FB_ERROR,
COM_FB_ERROR,
JOINT_FB_ERROR,
POS_ERROR,
SAT_ERROR,
MOT_TEMP_ERROR,
HV_CRC_ERROR,
HV_TIMEOUT_ERROR,
HV_TEMP_ERROR,
HV_VOLT_ERROR,
HV_FAULT_ERROR,
HV_CURRENT_OFFSET_FAULT,
HV_OVERCURRENT_RMS,
HV_OVERCURRENT_PEAK,
HV_OVERCURRENT_HW,
} fault_t;
//check if structs can be send at 5kHz with DATABAUD
_Static_assert(sizeof(packet_to_hv_t) <= DATABAUD / 11 / 5000 - 1 - 5, "to_hv struct to large");
_Static_assert(sizeof(packet_from_hv_t) <= DATABAUD / 11 / 5000 - 1 - 5, "from_hv struct to large");
//check if structs are word aligned
_Static_assert(!(sizeof(packet_to_hv_t) % 4), "to_hv struct not word aligned");
_Static_assert(!(sizeof(packet_from_hv_t) % 4), "from_hv struct not word aligned");