aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hwdef-Sofirn-SP10S.h124
-rw-r--r--spaghetti-monster/anduril/MODELS1
-rw-r--r--spaghetti-monster/anduril/cfg-sofirn-sp10s.h30
-rw-r--r--spaghetti-monster/anduril/version.h2
-rw-r--r--spaghetti-monster/fsm-adc.c4
5 files changed, 160 insertions, 1 deletions
diff --git a/hwdef-Sofirn-SP10S.h b/hwdef-Sofirn-SP10S.h
new file mode 100644
index 0000000..4e33246
--- /dev/null
+++ b/hwdef-Sofirn-SP10S.h
@@ -0,0 +1,124 @@
+#ifndef HWDEF_SOFIRN_SP10S_H
+#define HWDEF_SOFIRN_SP10S_H
+
+/* gChart's PIC12 to ATTINY1616 v1 adapter for the SP10S
+https://oshpark.com/shared_projects/rljCF1NN
+
+EDIT: modify the PCB, cutting the Pin 6 trace and use an airwire to route it to SOIC Pin 2 (PA5)
+NOTE: a v2 (no airwire) is on the way and this HWDEF file will need to be updated accordingly
+
+PIC12 Pinout:
+1 - VDD
+2 - No Connect
+3 - Low Channel FET (series 4.7K Ohms)
+4 - Switch
+5 - High Channel FET (main PWM)
+6 - Voltage Divider (300K:100K Ohms)
+7 - Boost chip enable
+8 - GND
+
+ATTINY1616 Mapping:
+2 - PA5 : ADC0 - AIN5
+3 - PB5 : TCA0 - WO2 Alternate MUX
+4 - PB4
+5 - PB0 : TCA0 - WO0
+7 - PA1
+
+*/
+
+
+#define LAYOUT_DEFINED
+
+#ifdef ATTINY
+#undef ATTINY
+#endif
+#define ATTINY 1616
+#include <avr/io.h>
+
+#ifndef SWITCH_PIN
+#define SWITCH_PIN 4
+#define SWITCH_PORT VPORTB.IN
+#define SWITCH_ISC_REG PORTB.PIN4CTRL
+#define SWITCH_VECT PORTB_PORT_vect
+#define SWITCH_INTFLG VPORTB.INTFLAGS
+#endif
+
+#define PWM_CHANNELS 2
+
+// Small channel
+#ifndef PWM1_PIN
+#define PWM1_PIN PB5
+#define PWM1_LVL TCA0.SINGLE.CMP2 // PB5 is Alternate MUX for TCA Compare 2
+#endif
+
+// Big channel
+#ifndef PWM2_PIN
+#define PWM2_PIN PB0
+#define PWM2_LVL TCA0.SINGLE.CMP0 // PB0 is TCA Compare 0
+#endif
+
+#define LED_ENABLE_PIN PIN1_bp
+#define LED_ENABLE_PORT PORTA_OUT
+
+#define USE_VOLTAGE_DIVIDER // use a dedicated pin, not VCC, because VCC input is flattened
+#define DUAL_VOLTAGE_FLOOR 20 // for AA/14500 boost drivers, don't indicate low voltage if below this level
+#define DUAL_VOLTAGE_LOW_LOW 07 // the lower voltage range's danger zone 0.7 volts
+#define ADMUX_VOLTAGE_DIVIDER ADC_MUXPOS_AIN5_gc // which ADC channel to read
+
+// Raw ADC readings at 4.4V and 2.2V
+// calibrate the voltage readout here
+// estimated / calculated values are:
+// (voltage - D1) * (R2/(R2+R1) * 1024 / 1.1)
+// Resistors are 300,000 and 100,000
+#ifndef ADC_44
+#define ADC_44 1023 // raw value at 4.40V
+#endif
+#ifndef ADC_22
+#define ADC_22 512 // raw value at 2.20V
+#endif
+
+
+
+// with so many pins, doing this all with #ifdefs gets awkward...
+// ... so just hardcode it in each hwdef file instead
+inline void hwdef_setup() {
+
+ // set up the system clock to run at 5 MHz instead of the default 3.33 MHz
+ _PROTECTED_WRITE( CLKCTRL.MCLKCTRLB, CLKCTRL_PDIV_4X_gc | CLKCTRL_PEN_bm );
+
+ VPORTA.DIR = PIN1_bm; // Boost enable pin
+ VPORTB.DIR = PIN0_bm | PIN5_bm; // PWM pins as output
+ //VPORTC.DIR = ...;
+
+
+ // enable pullups on the input pins to reduce power
+ PORTA.PIN0CTRL = PORT_PULLUPEN_bm;
+ //PORTA.PIN1CTRL = PORT_PULLUPEN_bm; // Boost enable pin
+ PORTA.PIN2CTRL = PORT_PULLUPEN_bm;
+ PORTA.PIN3CTRL = PORT_PULLUPEN_bm;
+ PORTA.PIN4CTRL = PORT_PULLUPEN_bm;
+ //PORTA.PIN5CTRL = PORT_PULLUPEN_bm; // Voltage divider
+ PORTA.PIN6CTRL = PORT_PULLUPEN_bm;
+ PORTA.PIN7CTRL = PORT_PULLUPEN_bm;
+
+ //PORTB.PIN0CTRL = PORT_PULLUPEN_bm; // Big PWM channel
+ PORTB.PIN1CTRL = PORT_PULLUPEN_bm;
+ PORTB.PIN2CTRL = PORT_PULLUPEN_bm;
+ PORTB.PIN3CTRL = PORT_PULLUPEN_bm;
+ PORTB.PIN4CTRL = PORT_PULLUPEN_bm | PORT_ISC_BOTHEDGES_gc; // Switch
+ //PORTB.PIN5CTRL = PORT_PULLUPEN_bm; // Small PWM channel
+
+ //PORTC.PIN0CTRL = PORT_PULLUPEN_bm; connected to the ADC via airwire
+ PORTC.PIN1CTRL = PORT_PULLUPEN_bm;
+ PORTC.PIN2CTRL = PORT_PULLUPEN_bm;
+ PORTC.PIN3CTRL = PORT_PULLUPEN_bm;
+
+ // set up the PWM
+ PORTMUX.CTRLC = PORTMUX_TCA02_ALTERNATE_gc; // Use alternate pin for TCA0:WO2
+ TCA0.SINGLE.CTRLB = TCA_SINGLE_CMP0EN_bm | TCA_SINGLE_CMP2EN_bm | TCA_SINGLE_WGMODE_SINGLESLOPE_gc;
+ TCA0.SINGLE.PER = 255;
+ TCA0.SINGLE.CTRLA = TCA_SINGLE_CLKSEL_DIV1_gc | TCA_SINGLE_ENABLE_bm;
+}
+
+
+#endif
diff --git a/spaghetti-monster/anduril/MODELS b/spaghetti-monster/anduril/MODELS
index 4ad4635..0972e8b 100644
--- a/spaghetti-monster/anduril/MODELS
+++ b/spaghetti-monster/anduril/MODELS
@@ -36,6 +36,7 @@ Model numbers:
0611 blf-q8
0612 sofirn-sp36
0621 blf-lantern
+0622 sofirn-sp10s
1618 gchart-fet1-t16
Duplicates:
Missing:
diff --git a/spaghetti-monster/anduril/cfg-sofirn-sp10s.h b/spaghetti-monster/anduril/cfg-sofirn-sp10s.h
new file mode 100644
index 0000000..5747cc4
--- /dev/null
+++ b/spaghetti-monster/anduril/cfg-sofirn-sp10s.h
@@ -0,0 +1,30 @@
+// gChart's custom SP10S driver config options for Anduril
+#define MODEL_NUMBER "0622"
+#include "hwdef-Sofirn-SP10S.h"
+// ATTINY: 1616
+
+#undef BLINK_AT_RAMP_MIDDLE
+
+#define BATTCHECK_VpT
+
+#define USE_DYNAMIC_UNDERCLOCKING
+
+#define RAMP_LENGTH 150
+#define PWM1_LEVELS 20,30,41,54,69,87,106,128,152,179,209,242,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0
+#define PWM2_LEVELS 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,3,3,3,4,4,4,5,5,5,6,6,7,7,8,8,9,9,10,10,11,12,12,13,14,14,15,16,17,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,33,34,35,36,38,39,41,42,43,45,46,48,50,51,53,55,56,58,60,62,64,66,68,70,72,74,76,78,80,83,85,87,90,92,94,97,99,102,105,107,110,113,116,119,121,124,127,130,133,137,140,143,146,150,153,156,160,164,167,171,174,178,182,186,190,194,198,202,206,210,214,219,223,227,232,236,241,246,250,255
+
+#define MAX_1x7135 13
+#define HALFSPEED_LEVEL 14
+#define QUARTERSPEED_LEVEL 6
+
+#define RAMP_SMOOTH_FLOOR 1
+#define RAMP_SMOOTH_CEIL 120
+#define RAMP_DISCRETE_FLOOR 10
+#define RAMP_DISCRETE_CEIL RAMP_SMOOTH_CEIL
+#define RAMP_DISCRETE_STEPS 7
+
+// stop panicking at ~30% power
+#define THERM_FASTER_LEVEL 105
+
+// enable 2 click turbo
+#define USE_2C_MAX_TURBO
diff --git a/spaghetti-monster/anduril/version.h b/spaghetti-monster/anduril/version.h
index 8cc1e77..5afe62a 100644
--- a/spaghetti-monster/anduril/version.h
+++ b/spaghetti-monster/anduril/version.h
@@ -1 +1 @@
-#define VERSION_NUMBER "20201219"
+#define VERSION_NUMBER "20210112"
diff --git a/spaghetti-monster/fsm-adc.c b/spaghetti-monster/fsm-adc.c
index 2818731..975d12e 100644
--- a/spaghetti-monster/fsm-adc.c
+++ b/spaghetti-monster/fsm-adc.c
@@ -341,7 +341,11 @@ static inline void ADC_voltage_handler() {
if (lvp_timer) {
lvp_timer --;
} else { // it has been long enough since the last warning
+ #ifdef DUAL_VOLTAGE_FLOOR
+ if (((voltage < VOLTAGE_LOW) && (voltage > DUAL_VOLTAGE_FLOOR)) || (voltage < DUAL_VOLTAGE_LOW_LOW)) {
+ #else
if (voltage < VOLTAGE_LOW) {
+ #endif
// send out a warning
emit(EV_voltage_low, 0);
// reset rate-limit counter