166 lines
4.5 KiB
C
166 lines
4.5 KiB
C
/******************************************************************************\
|
|
|
|
This file is part of the Buildbotics firmware.
|
|
|
|
Copyright (c) 2015 - 2018, Buildbotics LLC
|
|
All rights reserved.
|
|
|
|
This file ("the software") is free software: you can redistribute it
|
|
and/or modify it under the terms of the GNU General Public License,
|
|
version 2 as published by the Free Software Foundation. You should
|
|
have received a copy of the GNU General Public License, version 2
|
|
along with the software. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
The software 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
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the software. If not, see
|
|
<http://www.gnu.org/licenses/>.
|
|
|
|
For information regarding this software email:
|
|
"Joseph Coffland" <joseph@buildbotics.com>
|
|
|
|
\******************************************************************************/
|
|
|
|
#pragma once
|
|
|
|
#include "pins.h"
|
|
|
|
|
|
#define VERSION 6
|
|
|
|
|
|
// Pins
|
|
enum {
|
|
AREF_PIN = PORT_A << 3,
|
|
PA1_PIN, // NC
|
|
PA2_PIN, // NC
|
|
CS1_PIN,
|
|
CS2_PIN,
|
|
CS3_PIN,
|
|
CS4_PIN,
|
|
VOUT_REF_PIN,
|
|
|
|
VIN_REF_PIN = PORT_B << 3,
|
|
PWR_MOSI_PIN,
|
|
PWR_MISO_PIN,
|
|
SHUNT_PIN,
|
|
|
|
MOTOR_PIN = PORT_C << 3, // IN1
|
|
PWR_SCK_PIN,
|
|
PC2_PIN, // NC
|
|
PWR_RESET,
|
|
LOAD2_PIN, // IN3
|
|
LOAD1_PIN, // IN4
|
|
};
|
|
|
|
|
|
// ADC channels
|
|
enum {
|
|
CS1_ADC, // Motor current
|
|
CS2_ADC, // Vdd current
|
|
CS3_ADC, // Load 2 current
|
|
CS4_ADC, // Load 1 current
|
|
VOUT_ADC, // Motor voltage
|
|
VIN_ADC, // Input voltage
|
|
NC6_ADC,
|
|
NC7_ADC,
|
|
NC8_ADC,
|
|
NC9_ADC,
|
|
NC10_ADC,
|
|
NC11_ADC,
|
|
NC12_ADC,
|
|
NC13_ADC,
|
|
TEMP_ADC, // Temperature
|
|
};
|
|
|
|
|
|
#define SHUNT_FAIL_VOLTAGE 5
|
|
#define CAP_CHARGE_TIME 20 // ms
|
|
#define VOLTAGE_MIN 11
|
|
#define VOLTAGE_MAX 39
|
|
#define CURRENT_MAX 25
|
|
#define CURRENT_OVERTEMP 19 // Should read ~21A but > 11.86A is error
|
|
#define LOAD_OVERTEMP_MAX 10
|
|
#define MOTOR_SHUTDOWN_THRESH 15
|
|
#define VOLTAGE_SETTLE_COUNT 5
|
|
#define VOLTAGE_SETTLE_PERIOD 20 // ms
|
|
#define VOLTAGE_SETTLE_TOLERANCE 0.01
|
|
#define VOLTAGE_EXP 0.01
|
|
|
|
#define SHUNT_WATTS 5
|
|
#define SHUNT_OHMS 5.1
|
|
#define SHUNT_PERIOD 65000 // ms
|
|
#define SHUNT_JOULES 25 // Power per shunt period
|
|
#define SHUNT_JOULES_PER_MS ((float)SHUNT_JOULES / SHUNT_PERIOD)
|
|
#define SHUNT_MIN_V 2
|
|
|
|
#define VOLTAGE_REF 1.1
|
|
#define VOLTAGE_REF_R1 37400
|
|
#define VOLTAGE_REF_R2 1000
|
|
#define CURRENT_REF_R2 137
|
|
#define CURRENT_REF_MUL (100.0 * 2700 / CURRENT_REF_R2) // 2700 from datasheet
|
|
#define CAP_PRECHARGE_PERIOD 50 // ms
|
|
|
|
#define REG_SCALE 100
|
|
#define AVG_SCALE 3
|
|
#define BUCKETS (1 << AVG_SCALE)
|
|
|
|
// Addresses 0x60 to 0x67
|
|
#define I2C_ADDR 0x60
|
|
#define I2C_MASK 0b00001111
|
|
|
|
#define I2C_ERROR_BM (1 << TWBE)
|
|
#define I2C_DATA_INT_BM (1 << TWDIF)
|
|
#define I2C_READ_BM (1 << TWDIR)
|
|
#define I2C_ADDRESS_STOP_INT_BM (1 << TWASIF)
|
|
#define I2C_ADDRESS_MATCH_BM (1 << TWAS)
|
|
|
|
|
|
typedef enum {
|
|
TEMP_REG,
|
|
VIN_REG,
|
|
VOUT_REG,
|
|
MOTOR_REG,
|
|
LOAD1_REG,
|
|
LOAD2_REG,
|
|
VDD_REG,
|
|
FLAGS_REG,
|
|
VERSION_REG,
|
|
NUM_REGS
|
|
} regs_t;
|
|
|
|
|
|
enum {
|
|
// Fatal
|
|
UNDER_VOLTAGE_FLAG = 1 << 0,
|
|
OVER_VOLTAGE_FLAG = 1 << 1,
|
|
OVER_CURRENT_FLAG = 1 << 2,
|
|
SENSE_ERROR_FLAG = 1 << 3,
|
|
SHUNT_OVERLOAD_FLAG = 1 << 4,
|
|
MOTOR_OVERLOAD_FLAG = 1 << 5,
|
|
|
|
// Non fatal
|
|
LOAD1_SHUTDOWN_FLAG = 1 << 6,
|
|
LOAD2_SHUTDOWN_FLAG = 1 << 7,
|
|
MOTOR_UNDER_VOLTAGE_FLAG = 1 << 8,
|
|
SHUNT_ERROR_FLAG = 1 << 15,
|
|
|
|
// Sense errors
|
|
MOTOR_VOLTAGE_SENSE_ERROR_FLAG = 1 << 9,
|
|
MOTOR_CURRENT_SENSE_ERROR_FLAG = 1 << 10,
|
|
LOAD1_SENSE_ERROR_FLAG = 1 << 11,
|
|
LOAD2_SENSE_ERROR_FLAG = 1 << 12,
|
|
VDD_CURRENT_SENSE_ERROR_FLAG = 1 << 13,
|
|
|
|
// State flags
|
|
POWER_SHUTDOWN_FLAG = 1 << 14,
|
|
};
|
|
|
|
|
|
#define FATAL_FLAGS 0x003f
|
|
#define SENSE_ERROR_FLAGS 0x3e00
|