Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ddf9d263b1 | |||
| 02cb3a9c70 | |||
| 7aa7edba33 | |||
| 8f8a80f05f | |||
| 299429cb92 |
21
.gitignore
vendored
21
.gitignore
vendored
@@ -1,3 +1,23 @@
|
|||||||
|
# Ignore list for Atmel studio files
|
||||||
|
# Hidden folder
|
||||||
|
.vs/
|
||||||
|
|
||||||
|
#Build Directories
|
||||||
|
Debug/
|
||||||
|
Release/
|
||||||
|
|
||||||
|
#Build Results
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.eep
|
||||||
|
*.elf
|
||||||
|
*.hex
|
||||||
|
*.map
|
||||||
|
*.srec
|
||||||
|
|
||||||
|
#User Specific Files
|
||||||
|
*.atsuo
|
||||||
|
|
||||||
# Ignore list for Altium temp files
|
# Ignore list for Altium temp files
|
||||||
History/
|
History/
|
||||||
__Previews/
|
__Previews/
|
||||||
@@ -9,3 +29,4 @@ Project Logs for*
|
|||||||
# Ignore list for Generated output files
|
# Ignore list for Generated output files
|
||||||
*.step
|
*.step
|
||||||
OUTPUTS/
|
OUTPUTS/
|
||||||
|
|
||||||
|
|||||||
BIN
docs/MCU_Pinout.pdf
Normal file
BIN
docs/MCU_Pinout.pdf
Normal file
Binary file not shown.
BIN
docs/MCU_Pinout.xlsx
Normal file
BIN
docs/MCU_Pinout.xlsx
Normal file
Binary file not shown.
BIN
docs/atmega328PB_datasheet.pdf
Normal file
BIN
docs/atmega328PB_datasheet.pdf
Normal file
Binary file not shown.
120
firmware/devices/analog.c
Normal file
120
firmware/devices/analog.c
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
/**** Includes ****/
|
||||||
|
#include "hal/udccd_hal.h"
|
||||||
|
#include "analog.h"
|
||||||
|
|
||||||
|
/**** Private variables ****/
|
||||||
|
static const uint8_t ICOIL_MUL = 215;
|
||||||
|
static const uint8_t ICOIL_DIV = 22;
|
||||||
|
static const int16_t ICOIL_OFF = 0;
|
||||||
|
static const uint8_t ICOIL_CNT = 1;
|
||||||
|
|
||||||
|
static const uint8_t UCOIL_MUL = 20;
|
||||||
|
static const uint8_t UCOIL_DIV = 1;
|
||||||
|
static const int16_t UCOIL_OFF = 0;
|
||||||
|
static const uint8_t UCOIL_CNT = 1;
|
||||||
|
|
||||||
|
static const uint8_t UBAT_MUL = 20;
|
||||||
|
static const uint8_t UBAT_DIV = 1;
|
||||||
|
static const int16_t UBAT_OFF = 0;
|
||||||
|
static const uint8_t UBAT_CNT = 1;
|
||||||
|
|
||||||
|
static const uint8_t IBAT_MUL = 235;
|
||||||
|
static const uint8_t IBAT_DIV = 6;
|
||||||
|
static const int16_t IBAT_OFF = 0;
|
||||||
|
static const uint8_t IBAT_CNT = 1;
|
||||||
|
|
||||||
|
static const uint8_t POT_MUL = 215;
|
||||||
|
static const uint8_t POT_DIV = 44;
|
||||||
|
static const int16_t POT_OFF = 0;
|
||||||
|
static const uint8_t POT_CNT = 1;
|
||||||
|
|
||||||
|
static const uint8_t MODE_MUL = 215;
|
||||||
|
static const uint8_t MODE_DIV = 44;
|
||||||
|
static const int16_t MODE_OFF = 0;
|
||||||
|
static const uint8_t MODE_CNT = 1;
|
||||||
|
|
||||||
|
|
||||||
|
/**** Private function declarations ****/
|
||||||
|
static uint16_t ConvertSIntShort(int32_t in);
|
||||||
|
static uint16_t ConvertUintShort(uint32_t in);
|
||||||
|
static uint16_t read_ch(adcCh_t ch, uint16_t gnd_raw, uint8_t mul, uint8_t div, int16_t offset, uint8_t samples);
|
||||||
|
|
||||||
|
/**** Public function definitions ****/
|
||||||
|
void Analog_UpdateAll(analog_t* meas)
|
||||||
|
{
|
||||||
|
uint16_t gnd_lvl = HAL_ADC_Read(ADC_GND);
|
||||||
|
|
||||||
|
meas->hb_currnet = read_ch(ADC_ICOIL, 0, ICOIL_MUL, ICOIL_DIV, ICOIL_OFF, ICOIL_CNT ); //mA
|
||||||
|
meas->hb_voltage = read_ch(ADC_UCOIL, 0, UCOIL_MUL, UCOIL_DIV, UCOIL_OFF, UCOIL_CNT ); //mV
|
||||||
|
meas->supply_current = read_ch(ADC_IBAT , 0, IBAT_MUL , IBAT_DIV , IBAT_OFF , IBAT_CNT ); //mA
|
||||||
|
meas->supply_voltage = read_ch(ADC_UBAT , 0, UBAT_MUL , UBAT_DIV , UBAT_OFF , UBAT_CNT ); //mV
|
||||||
|
meas->pot_voltage = read_ch(ADC_POT , 0, POT_MUL , POT_DIV , POT_OFF , POT_CNT ); //mV
|
||||||
|
meas->mode_voltage = read_ch(ADC_MODE , 0, MODE_MUL , MODE_DIV , MODE_OFF , MODE_CNT ); //mV
|
||||||
|
|
||||||
|
// Calculate derived measurements
|
||||||
|
// Halfbridge output power
|
||||||
|
uint32_t temp = (uint32_t)meas->hb_currnet * (uint32_t)meas->hb_voltage;
|
||||||
|
temp /= 1000;
|
||||||
|
meas->hb_power = ConvertUintShort(temp);
|
||||||
|
|
||||||
|
// Halfbridge output resistance
|
||||||
|
if(meas->hb_currnet == 0) meas->hb_resistance = 0xFFFF;
|
||||||
|
else if(meas->hb_voltage == 0) meas->hb_resistance = 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
temp = (uint32_t)meas->hb_voltage * 1000;
|
||||||
|
temp /= (uint32_t)meas->hb_currnet;
|
||||||
|
meas->hb_resistance = ConvertUintShort(temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Supply power
|
||||||
|
temp = (uint32_t)meas->supply_current * (uint32_t)meas->supply_voltage;
|
||||||
|
temp /= 1000;
|
||||||
|
meas->supply_power = ConvertUintShort(temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint16_t read_ch(adcCh_t ch, uint16_t gnd_raw, uint8_t mul, uint8_t div, int16_t offset, uint8_t samples)
|
||||||
|
{
|
||||||
|
//Sanity check
|
||||||
|
if(div==0) return 0xFFFF;
|
||||||
|
|
||||||
|
// Do at least one sample
|
||||||
|
if(samples<1) samples = 1;
|
||||||
|
|
||||||
|
// Read ADC value
|
||||||
|
int32_t raw = 0;
|
||||||
|
for(uint8_t i=0; i<samples; i++)
|
||||||
|
{
|
||||||
|
raw += (int32_t)HAL_ADC_Read(ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do average
|
||||||
|
if(samples != 1)
|
||||||
|
{
|
||||||
|
raw /= samples;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Remove GND level
|
||||||
|
if(gnd_raw) raw = raw - (int32_t)gnd_raw;
|
||||||
|
|
||||||
|
// Convert to target units
|
||||||
|
raw = raw * mul;
|
||||||
|
if(div!=1) raw /= div;
|
||||||
|
raw += offset;
|
||||||
|
|
||||||
|
return ConvertSIntShort(raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint16_t ConvertSIntShort(int32_t in)
|
||||||
|
{
|
||||||
|
if(in <= 0) return 0;
|
||||||
|
else if(in >= 0x0000FFFF) return 0xFFFF;
|
||||||
|
else return (uint16_t)in;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint16_t ConvertUintShort(uint32_t in)
|
||||||
|
{
|
||||||
|
if(in == 0) return 0;
|
||||||
|
else if(in >= 0x0000FFFF) return 0xFFFF;
|
||||||
|
else return (uint16_t)in;
|
||||||
|
}
|
||||||
23
firmware/devices/analog.h
Normal file
23
firmware/devices/analog.h
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
#ifndef ANALOG_H_
|
||||||
|
#define ANALOG_H_
|
||||||
|
|
||||||
|
/**** Includes ****/
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/**** Public definitions ****/
|
||||||
|
typedef struct {
|
||||||
|
uint16_t hb_currnet;
|
||||||
|
uint16_t hb_voltage;
|
||||||
|
uint16_t hb_power;
|
||||||
|
uint16_t hb_resistance;
|
||||||
|
uint16_t supply_current;
|
||||||
|
uint16_t supply_voltage;
|
||||||
|
uint16_t supply_power;
|
||||||
|
uint16_t pot_voltage;
|
||||||
|
uint16_t mode_voltage;
|
||||||
|
} analog_t;
|
||||||
|
|
||||||
|
/**** Public function declarations ****/
|
||||||
|
void Analog_UpdateAll(analog_t* meas);
|
||||||
|
|
||||||
|
#endif /* ANALOG_H_ */
|
||||||
11
firmware/devices/common/level.h
Normal file
11
firmware/devices/common/level.h
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
#ifndef LEVEL_T_H_
|
||||||
|
#define LEVEL_T_H_
|
||||||
|
|
||||||
|
/**** Public definitions ****/
|
||||||
|
typedef enum {
|
||||||
|
HIZ = -1,
|
||||||
|
LOW = 0,
|
||||||
|
HIGH = 1
|
||||||
|
} level_t;
|
||||||
|
|
||||||
|
#endif /* LEVEL_T_H_ */
|
||||||
24
firmware/devices/config.c
Normal file
24
firmware/devices/config.c
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/**** Includes ****/
|
||||||
|
#include "hal/udccd_hal.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
/**** Public function definitions ****/
|
||||||
|
void Init_HW(void)
|
||||||
|
{
|
||||||
|
hwConfig_t hwCfg;
|
||||||
|
hwCfg.adc_clk_prescaler = ADC_DIV2;
|
||||||
|
hwCfg.adc_auto_wake = 1;
|
||||||
|
// 64kHz PWM
|
||||||
|
hwCfg.pwm_timer_prescaler = TIM_DIV1;
|
||||||
|
hwCfg.pwm_timer_top = 0x01FF;
|
||||||
|
// 1.9Hz..62.5kHz Speed input
|
||||||
|
hwCfg.freq_timer_prescaler = TIM_DIV64;
|
||||||
|
// 1kHz systick
|
||||||
|
hwCfg.systick_timer_top = 125;
|
||||||
|
hwCfg.systick_timer_prescaler = TIM_DIV64;
|
||||||
|
// No extra features
|
||||||
|
hwCfg.uart_prescaler = 0;
|
||||||
|
hwCfg.disable_unused = 0;
|
||||||
|
hwCfg.en_watchdog = 0;
|
||||||
|
HAL_Init_Min(&hwCfg);
|
||||||
|
}
|
||||||
10
firmware/devices/config.h
Normal file
10
firmware/devices/config.h
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
#ifndef CONFIG_H_
|
||||||
|
#define CONFIG_H_
|
||||||
|
|
||||||
|
/**** Includes ****/
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/**** Public function declarations ****/
|
||||||
|
void Init_HW(void);
|
||||||
|
|
||||||
|
#endif /* CONFIG_H_ */
|
||||||
21
firmware/devices/filter_iir_lpf.c
Normal file
21
firmware/devices/filter_iir_lpf.c
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
/**** Includes ****/
|
||||||
|
#include "filter_iir_lpf.h"
|
||||||
|
|
||||||
|
/**** Private variables ****/
|
||||||
|
|
||||||
|
/**** Public function definitions ****/
|
||||||
|
uint16_t LPF_Update(uint16_t new, uint16_t last, uint8_t strength)
|
||||||
|
{
|
||||||
|
if(strength==0) return new;
|
||||||
|
else if(strength==255) return last;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uint32_t temp = (uint32_t)last * strength;
|
||||||
|
temp += new * (255-strength);
|
||||||
|
temp /= 255;
|
||||||
|
|
||||||
|
//Limit to 16bits
|
||||||
|
if(temp > 0x0000FFFF) return 0xFFFF;
|
||||||
|
else return (uint16_t) temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
10
firmware/devices/filter_iir_lpf.h
Normal file
10
firmware/devices/filter_iir_lpf.h
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
#ifndef FILTER_IIR_LPF_H_
|
||||||
|
#define FILTER_IIR_LPF_H_
|
||||||
|
|
||||||
|
/**** Includes ****/
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/**** Public function declarations ****/
|
||||||
|
uint16_t LPF_Update(uint16_t new, uint16_t last, uint8_t strength);
|
||||||
|
|
||||||
|
#endif /* FILTER_IIR_LPF_H_ */
|
||||||
102
firmware/devices/hal/udccd_hal.h
Normal file
102
firmware/devices/hal/udccd_hal.h
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
#ifndef UDCCD_R8_BSP_H_
|
||||||
|
#define UDCCD_R8_BSP_H_
|
||||||
|
|
||||||
|
/**** Includes ****/
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "../common/level.h"
|
||||||
|
|
||||||
|
/**** Public definitions ****/
|
||||||
|
//ADC definitions
|
||||||
|
typedef enum {
|
||||||
|
ADC_ICOIL = 0x00,
|
||||||
|
ADC_UCOIL = 0x01,
|
||||||
|
ADC_UBAT = 0x02,
|
||||||
|
ADC_IBAT = 0x03,
|
||||||
|
ADC_POT = 0x04,
|
||||||
|
ADC_MODE = 0x05,
|
||||||
|
ADC_TEMP = 0x08,
|
||||||
|
ADC_INTREF = 0x0E,
|
||||||
|
ADC_GND = 0x0F
|
||||||
|
} adcCh_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
ADC_DIV2 = 0x01,
|
||||||
|
ADC_DIV4 = 0x02,
|
||||||
|
ADC_DIV8 = 0x03,
|
||||||
|
ADC_DIV16 = 0x04,
|
||||||
|
ADC_DIV32 = 0x05,
|
||||||
|
ADC_DIV64 = 0x06,
|
||||||
|
ADC_DIV128 = 0x07
|
||||||
|
} adcDiv_t;
|
||||||
|
|
||||||
|
//Timer definitions
|
||||||
|
typedef enum {
|
||||||
|
TIM_DIV1 = 0x01,
|
||||||
|
TIM_DIV8 = 0x02,
|
||||||
|
TIM_DIV64 = 0x03,
|
||||||
|
TIM_DIV256 = 0x04,
|
||||||
|
TIM_DIV1024 = 0x05
|
||||||
|
} timerDiv_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
PWM_COIL = 'A',
|
||||||
|
PWM_LED = 'B'
|
||||||
|
} pwmCh_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
SPEED_1 = 3,
|
||||||
|
SPEED_0 = 4
|
||||||
|
} speedCh_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
adcDiv_t adc_clk_prescaler;
|
||||||
|
uint8_t adc_auto_wake;
|
||||||
|
timerDiv_t pwm_timer_prescaler;
|
||||||
|
uint16_t pwm_timer_top;
|
||||||
|
timerDiv_t freq_timer_prescaler;
|
||||||
|
uint16_t uart_prescaler;
|
||||||
|
uint8_t systick_timer_top;
|
||||||
|
timerDiv_t systick_timer_prescaler;
|
||||||
|
uint8_t disable_unused;
|
||||||
|
uint8_t en_watchdog;
|
||||||
|
} hwConfig_t;
|
||||||
|
|
||||||
|
/**** Public function declarations ****/
|
||||||
|
void HAL_Init_Min(hwConfig_t* hwCfg);
|
||||||
|
void HAL_Init_Extra(hwConfig_t* hwCfg);
|
||||||
|
|
||||||
|
level_t HAL_ReadLvl_Handbrake(void);
|
||||||
|
level_t HAL_ReadLvl_Brake(void);
|
||||||
|
level_t HAL_ReadLvl_Dimm(void);
|
||||||
|
level_t HAL_ReadLvl_BtnUp(void);
|
||||||
|
level_t HAL_ReadLvl_BtnDown(void);
|
||||||
|
level_t HAL_ReadLvl_BtnMode(void);
|
||||||
|
level_t HAL_ReadLvl_HandbrakePull(void);
|
||||||
|
level_t HAL_ReadLvl_CoilLow(void);
|
||||||
|
level_t HAL_ReadLvl_CoilHigh(void);
|
||||||
|
level_t HAL_ReadLvl_LedsPwm(void);
|
||||||
|
level_t HAL_ReadLvl_Speed0(void);
|
||||||
|
level_t HAL_ReadLvl_Speed1(void);
|
||||||
|
level_t HAL_ReadLvl_SpeedPull(void);
|
||||||
|
|
||||||
|
void HAL_SetPull_Handbrake(level_t lvl);
|
||||||
|
void HAL_SetPull_Speed(level_t lvl);
|
||||||
|
|
||||||
|
void HAL_ADC_Wake(void);
|
||||||
|
void HAL_ADC_Sleep(void);
|
||||||
|
uint16_t HAL_ADC_Read(adcCh_t ch);
|
||||||
|
|
||||||
|
void HAL_Coil_SetLowSide(uint8_t on);
|
||||||
|
void HAL_Coil_SetPWM(uint8_t percent);
|
||||||
|
void HAL_Coil_SetPWM16b(uint16_t value);
|
||||||
|
|
||||||
|
void HAL_LEDS_Set(uint8_t image);
|
||||||
|
uint8_t HAL_LEDS_Get(void);
|
||||||
|
void HAL_LEDS_SetPWM(uint8_t percent);
|
||||||
|
|
||||||
|
void HAL_PWM_Wake(void);
|
||||||
|
void HAL_PWM_Sleep(void);
|
||||||
|
void HAL_PWM_SetDuty16b(pwmCh_t ch, uint16_t value);
|
||||||
|
void HAL_PWM_SetDuty100(pwmCh_t ch, uint8_t percent);
|
||||||
|
|
||||||
|
#endif /* UDCCD_R8_BSP_H_ */
|
||||||
463
firmware/devices/hal/udccd_r7_hal.c
Normal file
463
firmware/devices/hal/udccd_r7_hal.c
Normal file
@@ -0,0 +1,463 @@
|
|||||||
|
/**** Includes ****/
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include "udccd_hal.h"
|
||||||
|
|
||||||
|
/**** Private variables ****/
|
||||||
|
static uint8_t tim0_prescaler = 0x00;
|
||||||
|
static uint8_t tim1_prescaler = 0x00;
|
||||||
|
static uint8_t tim3_prescaler = 0x00;
|
||||||
|
static uint8_t tim4_prescaler = 0x00;
|
||||||
|
|
||||||
|
/**** Private function declarations ****/
|
||||||
|
static void PWM_SetOCx(pwmCh_t ch, uint16_t value);
|
||||||
|
|
||||||
|
/**** Public function definitions ****/
|
||||||
|
void HAL_Init_Min(hwConfig_t* hwCfg)
|
||||||
|
{
|
||||||
|
// PIN Configuration
|
||||||
|
//DCCD Enable and PWM
|
||||||
|
PORTB &= ~0x03; //Set low
|
||||||
|
DDRB |= 0x03; //Set as outputs
|
||||||
|
|
||||||
|
//LED PWM
|
||||||
|
PORTB &= ~0x04; //Set low
|
||||||
|
DDRB |= 0x04; //Set as output
|
||||||
|
|
||||||
|
//UART TX
|
||||||
|
PORTB |= 0x18; //Set high / pull-up on
|
||||||
|
DDRB |= 0x08; //Set as output
|
||||||
|
DDRB &= ~0x10; //Set as input
|
||||||
|
|
||||||
|
//Handbrake pull-up
|
||||||
|
PORTB |= 0x20; //Set high
|
||||||
|
DDRB |= 0x20; //Set as output
|
||||||
|
|
||||||
|
//Handbrake and Brake inputs
|
||||||
|
PORTB |= 0xC0; //Pull-up on
|
||||||
|
DDRB &= ~0xC0; //Set as input
|
||||||
|
|
||||||
|
// ADC inputs
|
||||||
|
PORTC &= ~0x3F; //Pull-up off
|
||||||
|
DDRC &= ~0x3F; //Set as inputs
|
||||||
|
|
||||||
|
// Reset
|
||||||
|
PORTC |= 0x40; //Pull-up on
|
||||||
|
DDRC &= ~0x40; //Set as input
|
||||||
|
|
||||||
|
// LED control
|
||||||
|
PORTD &= ~0x3F; //Set low
|
||||||
|
DDRD |= 0x3F; //Set as outputs
|
||||||
|
|
||||||
|
// Speed pull
|
||||||
|
PORTD &= ~0x40; //Set low
|
||||||
|
DDRD |= 0x40; //Set as outputs
|
||||||
|
|
||||||
|
// Dim input
|
||||||
|
PORTD |= 0x80; //Set pull-up on
|
||||||
|
DDRD &= ~0x80; //Set as input
|
||||||
|
|
||||||
|
// Speed inputs
|
||||||
|
PORTE &= ~0x05; //Set pull-down
|
||||||
|
DDRE |= 0x05; //Set as output
|
||||||
|
|
||||||
|
// Up/Down inputs
|
||||||
|
PORTE |= 0x0A; //Set pull-up on
|
||||||
|
DDRE &= ~0x0A; //Set as input
|
||||||
|
|
||||||
|
|
||||||
|
//ADC configuration
|
||||||
|
PRR0 &= ~0x01; //Enable ADC power
|
||||||
|
DIDR0 |= 0x1F; //Disable digital inputs, ADC0-ADC4
|
||||||
|
|
||||||
|
ADMUX = 0x40; //Set AVCC reference, Right adjust
|
||||||
|
ADCSRA = 0x00; //ADC Disabled, Single conversion, no IT
|
||||||
|
ADCSRA |= (uint8_t)hwCfg->adc_clk_prescaler;
|
||||||
|
ADCSRB = 0x00; //no trigger input
|
||||||
|
|
||||||
|
if(hwCfg->adc_auto_wake) ADCSRA |= 0x80; //Enable ADC
|
||||||
|
else PRR0 |= 0x01;
|
||||||
|
|
||||||
|
|
||||||
|
//DCCD and LED PWM configuration
|
||||||
|
PRR0 &= ~0x80; //Enable Timer1 power
|
||||||
|
TCCR1A = 0xF2; //Connect OC1A and OC1B, normal logic
|
||||||
|
TCCR1B = 0x18; //PWM, Phase & Frequency Correct ICR1 top, no clock, WGM:0xE
|
||||||
|
TCCR1C = 0x00;
|
||||||
|
TCNT1 = 0x0000;
|
||||||
|
OCR1A = 0x0000;
|
||||||
|
OCR1B = 0x0000;
|
||||||
|
ICR1 = (hwCfg->pwm_timer_top);
|
||||||
|
TIMSK1 = 0x00; //No interrupts
|
||||||
|
TIFR1 = 0x00; //Clear all flags
|
||||||
|
|
||||||
|
tim1_prescaler = (uint8_t)hwCfg->pwm_timer_prescaler;
|
||||||
|
TCCR1B |= tim1_prescaler; //Enable timer
|
||||||
|
}
|
||||||
|
|
||||||
|
void HAL_Init_Extra(hwConfig_t* hwCfg)
|
||||||
|
{
|
||||||
|
//Speed 1 input timer configuration
|
||||||
|
PRR1 &= ~0x01; //Enable Timer3 power
|
||||||
|
TCCR3A = 0x00; //OCx disconnected, WGM:0x0
|
||||||
|
TCCR3B = 0x80; //ICP Noise filter, Falling edge, no clock
|
||||||
|
TCCR3C = 0x00;
|
||||||
|
TCNT3 = 0x0000;
|
||||||
|
OCR3A = 0x0000;
|
||||||
|
OCR3B = 0x0000;
|
||||||
|
ICR3 = 0x0000;
|
||||||
|
TIMSK3 = 0x00;
|
||||||
|
//TIMSK3 |= 0x21; //ICP and OVF interrupts
|
||||||
|
TIFR3 = 0x00; //Clear all flags
|
||||||
|
|
||||||
|
tim3_prescaler = (uint8_t)hwCfg->freq_timer_prescaler;
|
||||||
|
TCCR3B |= tim3_prescaler; //Enable timer
|
||||||
|
|
||||||
|
|
||||||
|
//Speed 0 input timer configuration
|
||||||
|
PRR1 &= ~0x08; //Enable Timer4 power
|
||||||
|
TCCR4A = 0x00; //OCx disconnected, WGM:0x0
|
||||||
|
TCCR4B = 0x80; //ICP Noise filter, Falling edge, no clock
|
||||||
|
TCCR4C = 0x00;
|
||||||
|
TCNT4 = 0x0000;
|
||||||
|
OCR4A = 0x0000;
|
||||||
|
OCR4B = 0x0000;
|
||||||
|
ICR4 = 0x0000;
|
||||||
|
TIMSK4 = 0x00;
|
||||||
|
//TIMSK4 |= 0x21; //ICP and OVF interrupts
|
||||||
|
TIFR4 = 0x00; //Clear all flags
|
||||||
|
|
||||||
|
tim4_prescaler = (uint8_t)hwCfg->freq_timer_prescaler;
|
||||||
|
TCCR4B |= tim4_prescaler; //Enable timer
|
||||||
|
|
||||||
|
|
||||||
|
//UART1 configuration
|
||||||
|
PRR0 &= 0x10; //Enable UART1 power
|
||||||
|
UCSR1A = 0x00; //Clear flags, Single UART speed, Single processor mode
|
||||||
|
UCSR1B = 0x18; //Enable RX/TX hardware, 8bit char
|
||||||
|
//UCSR1B |= 0xC0; //Enable RX/TX interrupt,
|
||||||
|
UCSR1C = 0x06; ; //async, No parity, 1 stop bit, 8bit char,
|
||||||
|
UBRR1 = hwCfg->uart_prescaler; //UART baud rate select
|
||||||
|
|
||||||
|
|
||||||
|
//"Systick" timer configuration
|
||||||
|
PRR0 &= ~0x20; //Enable Timer0 power
|
||||||
|
TCCR0A = 0x02 ;//OC0x not connected, WGM 0x01-CTC OC0A TOP
|
||||||
|
TCCR0B = 0x00; //WGM 0x01-CTC, No clock
|
||||||
|
TIMSK0 = 0x00;
|
||||||
|
//TIMSK0 |= 0x01; //OVF interrupt enabled
|
||||||
|
TCNT0 = 0x00;
|
||||||
|
OCR0A = hwCfg->systick_timer_top;
|
||||||
|
OCR0B= 0x00;
|
||||||
|
TIFR0 = 0x00; //Reset all flags
|
||||||
|
|
||||||
|
tim0_prescaler = (uint8_t)hwCfg->systick_timer_prescaler;
|
||||||
|
TCCR0B |= tim0_prescaler;
|
||||||
|
|
||||||
|
|
||||||
|
//Disabled not used power configuration
|
||||||
|
if(hwCfg->disable_unused)
|
||||||
|
{
|
||||||
|
//Disable power to not used peripherals
|
||||||
|
PRR0 |= 0xC6; //Disable TWI0, TIM2, SPI0, UART0
|
||||||
|
PRR1 |= 0x34; //Disable TWI1, PRTC, SPI1
|
||||||
|
}
|
||||||
|
|
||||||
|
//Watchdog configuration
|
||||||
|
if(hwCfg->en_watchdog)
|
||||||
|
{
|
||||||
|
//watchdog timer setup
|
||||||
|
WDTCSR |= 0x10; //Change enable
|
||||||
|
WDTCSR |= 0x0D; //System reset mode, 0.5s period.
|
||||||
|
//use special instruction to reset watchdog timer
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Handbrake input
|
||||||
|
level_t HAL_ReadLvl_Handbrake(void)
|
||||||
|
{
|
||||||
|
if(PINB & 0x40) return HIGH;
|
||||||
|
else return LOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Brakes input
|
||||||
|
level_t HAL_ReadLvl_Brake(void)
|
||||||
|
{
|
||||||
|
if(PINB & 0x80) return HIGH;
|
||||||
|
else return LOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dimm input
|
||||||
|
level_t HAL_ReadLvl_Dimm(void)
|
||||||
|
{
|
||||||
|
if(PIND & 0x80) return HIGH;
|
||||||
|
else return LOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
// UP button
|
||||||
|
level_t HAL_ReadLvl_BtnUp(void)
|
||||||
|
{
|
||||||
|
if(PINE & 0x08) return HIGH;
|
||||||
|
else return LOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Down button
|
||||||
|
level_t HAL_ReadLvl_BtnDown(void)
|
||||||
|
{
|
||||||
|
if(PINE & 0x02) return HIGH;
|
||||||
|
else return LOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mode button
|
||||||
|
level_t HAL_ReadLvl_BtnMode(void)
|
||||||
|
{
|
||||||
|
if(PINC & 0x20) return HIGH;
|
||||||
|
else return LOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handbrake pull
|
||||||
|
level_t HAL_ReadLvl_HandbrakePull(void)
|
||||||
|
{
|
||||||
|
if(PINB & 0x20) return HIGH;
|
||||||
|
else return LOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Coil driver control low
|
||||||
|
level_t HAL_ReadLvl_CoilLow(void)
|
||||||
|
{
|
||||||
|
if(PINB & 0x01) return HIGH;
|
||||||
|
else return LOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Coil driver control high
|
||||||
|
level_t HAL_ReadLvl_CoilHigh(void)
|
||||||
|
{
|
||||||
|
if(PINB & 0x02) return HIGH;
|
||||||
|
else return LOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
// LED PWM control
|
||||||
|
level_t HAL_ReadLvl_LedsPwm(void)
|
||||||
|
{
|
||||||
|
if(PINB & 0x04) return HIGH;
|
||||||
|
else return LOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Speed 0 input pin
|
||||||
|
level_t HAL_ReadLvl_Speed0(void)
|
||||||
|
{
|
||||||
|
if(PINE & 0x04) return HIGH;
|
||||||
|
else return LOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Speed 1 input pin
|
||||||
|
level_t HAL_ReadLvl_Speed1(void)
|
||||||
|
{
|
||||||
|
if(PINE & 0x01) return HIGH;
|
||||||
|
else return LOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Speed common pull pin
|
||||||
|
level_t HAL_ReadLvl_SpeedPull(void)
|
||||||
|
{
|
||||||
|
if(PIND & 0x40) return HIGH;
|
||||||
|
else return LOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Set handbrake pull-up
|
||||||
|
void HAL_SetPull_Handbrake(level_t lvl)
|
||||||
|
{
|
||||||
|
switch(lvl)
|
||||||
|
{
|
||||||
|
case HIGH:
|
||||||
|
PORTB |= 0x20; //Set high
|
||||||
|
DDRB |= 0x20; //Set as output
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LOW:
|
||||||
|
PORTB &= ~0x20; //Set low
|
||||||
|
DDRB |= 0x20; //Set as output
|
||||||
|
|
||||||
|
default:
|
||||||
|
DDRB &= ~0x20; //Set as input
|
||||||
|
PORTB |= 0x20; //Set high
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set speed inputs common pull
|
||||||
|
void HAL_SetPull_Speed(level_t lvl)
|
||||||
|
{
|
||||||
|
switch(lvl)
|
||||||
|
{
|
||||||
|
case HIGH:
|
||||||
|
PORTD |= 0x40; //Set high
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
PORTD &= ~0x40; //Set low
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ADC Wake
|
||||||
|
void HAL_ADC_Wake(void)
|
||||||
|
{
|
||||||
|
//Enable ADC power
|
||||||
|
PRR0 &= ~0x01;
|
||||||
|
//Enable ADC
|
||||||
|
ADCSRA |= 0x80;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ADC Sleep
|
||||||
|
void HAL_ADC_Sleep(void)
|
||||||
|
{
|
||||||
|
//wait to finish
|
||||||
|
while(ADCSRA&0x40);
|
||||||
|
//Disable ADC
|
||||||
|
ADCSRA &= ~0x80;
|
||||||
|
//Disable ADC power
|
||||||
|
PRR0 |= 0x01;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ADC Read
|
||||||
|
uint16_t HAL_ADC_Read(adcCh_t ch)
|
||||||
|
{
|
||||||
|
//check if ADC is enabled
|
||||||
|
if(!(ADCSRA&0x80)) return 0xFFFF;
|
||||||
|
|
||||||
|
uint8_t mux = (uint8_t)ch;
|
||||||
|
//Safe guard mux
|
||||||
|
if(mux > 15) return 0xFFFF;
|
||||||
|
// Not available channels
|
||||||
|
if((mux > 8) && (mux<14)) return 0xFFFF;
|
||||||
|
|
||||||
|
ADMUX &= ~0x0F;
|
||||||
|
ADMUX |= mux;
|
||||||
|
ADCSRA |= 0x40;
|
||||||
|
while(ADCSRA&0x40); //wait to finish
|
||||||
|
return ADC;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Coil Driver Low Side control
|
||||||
|
void HAL_Coil_SetLowSide(uint8_t on)
|
||||||
|
{
|
||||||
|
if(on) PORTB |= 0x01;
|
||||||
|
else PORTB &= ~0x01;
|
||||||
|
}
|
||||||
|
|
||||||
|
void HAL_Coil_SetPWM(uint8_t percent)
|
||||||
|
{
|
||||||
|
HAL_PWM_SetDuty100(PWM_COIL, percent);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HAL_Coil_SetPWM16b(uint16_t value)
|
||||||
|
{
|
||||||
|
HAL_PWM_SetDuty16b(PWM_COIL, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// LED Display
|
||||||
|
void HAL_LEDS_Set(uint8_t image)
|
||||||
|
{
|
||||||
|
//Read current PORTD pin6, pin7
|
||||||
|
uint8_t keep = PORTD & 0xC0;
|
||||||
|
|
||||||
|
//Safe guard display
|
||||||
|
image &= 0x3F;
|
||||||
|
|
||||||
|
//Calculate new PORTD
|
||||||
|
keep |= image;
|
||||||
|
|
||||||
|
//Set PORTD
|
||||||
|
PORTD = keep;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t HAL_LEDS_Get(void)
|
||||||
|
{
|
||||||
|
return (PIND & 0x3F);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HAL_LEDS_SetPWM(uint8_t percent)
|
||||||
|
{
|
||||||
|
HAL_PWM_SetDuty100(PWM_LED, percent);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// PWM Direct functions
|
||||||
|
void HAL_PWM_Wake(void)
|
||||||
|
{
|
||||||
|
//Enable Timer1 power
|
||||||
|
PRR0 &= ~0x80;
|
||||||
|
//Prepare Timer1 settings
|
||||||
|
TCNT1 = 0x0000;
|
||||||
|
OCR1A = 0x0000;
|
||||||
|
OCR1B = 0x0000;
|
||||||
|
//Enable clock
|
||||||
|
TCCR1B |= tim1_prescaler; //Enable timer
|
||||||
|
}
|
||||||
|
|
||||||
|
void HAL_PWM_Sleep(void)
|
||||||
|
{
|
||||||
|
// Turn off outputs
|
||||||
|
OCR1A = 0x0000;
|
||||||
|
OCR1B = 0x0000;
|
||||||
|
// Force timer to bottom
|
||||||
|
TCNT1 = (ICR1-1);
|
||||||
|
// Wait for outputs to be off
|
||||||
|
while((PINB&0x06)!=0x00) continue;
|
||||||
|
// Disable clock
|
||||||
|
TCCR1B &= ~0x07;
|
||||||
|
// Disable Timer1 power
|
||||||
|
PRR0 |= 0x80;
|
||||||
|
}
|
||||||
|
|
||||||
|
void HAL_PWM_SetDuty16b(pwmCh_t ch, uint16_t value)
|
||||||
|
{
|
||||||
|
value = 0xFFFF - value;
|
||||||
|
|
||||||
|
uint32_t top = (uint32_t)ICR1;
|
||||||
|
uint32_t temp = (uint32_t)value * top;
|
||||||
|
temp = temp/0x0000FFFF;
|
||||||
|
//Limit temp
|
||||||
|
if(temp>0x0000FFFF) temp = 0x0000FFFF;
|
||||||
|
uint16_t ocrx = (uint16_t) temp;
|
||||||
|
|
||||||
|
PWM_SetOCx(ch, ocrx);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HAL_PWM_SetDuty100(pwmCh_t ch, uint8_t percent)
|
||||||
|
{
|
||||||
|
if(percent > 100) percent = 100;
|
||||||
|
percent = 100 - percent;
|
||||||
|
|
||||||
|
uint32_t top = (uint32_t)ICR1;
|
||||||
|
uint32_t temp = (uint32_t)percent * top;
|
||||||
|
temp = temp/100;
|
||||||
|
//Limit temp
|
||||||
|
if(temp>0x0000FFFF) temp = 0x0000FFFF;
|
||||||
|
uint16_t ocrx = (uint16_t) temp;
|
||||||
|
|
||||||
|
PWM_SetOCx(ch, ocrx);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**** Private function definitions ****/
|
||||||
|
static void PWM_SetOCx(pwmCh_t ch, uint16_t value)
|
||||||
|
{
|
||||||
|
switch(ch)
|
||||||
|
{
|
||||||
|
case PWM_COIL:
|
||||||
|
OCR1A = value;
|
||||||
|
return;
|
||||||
|
|
||||||
|
case PWM_LED:
|
||||||
|
OCR1B = value;
|
||||||
|
return;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
127
firmware/devices/halfbridge.c
Normal file
127
firmware/devices/halfbridge.c
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
/**** Includes ****/
|
||||||
|
#include "hal/udccd_hal.h"
|
||||||
|
#include "halfbridge.h"
|
||||||
|
|
||||||
|
/**** Private variables ****/
|
||||||
|
static const uint16_t min_dc = 3277; //5%
|
||||||
|
static const uint16_t max_dc = 62258; //95%
|
||||||
|
|
||||||
|
static uint16_t target = 0;
|
||||||
|
static uint8_t low_side_on = 1;
|
||||||
|
|
||||||
|
static uint16_t active_dc = 0;
|
||||||
|
|
||||||
|
static uint8_t is_en = 0;
|
||||||
|
|
||||||
|
/**** Private function declarations ****/
|
||||||
|
static uint16_t CalculateDuty16b(uint16_t target, uint16_t supply);
|
||||||
|
|
||||||
|
/**** Public function definitions ****/
|
||||||
|
void HB_SetTarget(uint16_t voltage)
|
||||||
|
{
|
||||||
|
target = voltage;
|
||||||
|
}
|
||||||
|
|
||||||
|
void HB_SetLowSide(uint8_t on)
|
||||||
|
{
|
||||||
|
low_side_on = on;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t HB_GetTarget(void)
|
||||||
|
{
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
|
void HB_UpdateOutput(uint16_t supply)
|
||||||
|
{
|
||||||
|
uint16_t temp_dc = CalculateDuty16b(target, supply);
|
||||||
|
|
||||||
|
HB_SetDirect(temp_dc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HB_SetDirect(uint16_t duty)
|
||||||
|
{
|
||||||
|
/// Limit duty cycle
|
||||||
|
if(duty > max_dc) active_dc = max_dc;
|
||||||
|
else if(duty < min_dc) active_dc = 0;
|
||||||
|
else active_dc = duty;
|
||||||
|
|
||||||
|
// Set duty cycle
|
||||||
|
if(!is_en) return;
|
||||||
|
HAL_Coil_SetLowSide(low_side_on);
|
||||||
|
HAL_Coil_SetPWM16b(active_dc);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t HB_IsLowOn(void)
|
||||||
|
{
|
||||||
|
if(HAL_ReadLvl_CoilLow() == HIGH) return 1;
|
||||||
|
else return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void HB_Enable(void)
|
||||||
|
{
|
||||||
|
// Restore low side
|
||||||
|
if(low_side_on) HAL_Coil_SetLowSide(1);
|
||||||
|
// Restore duty cycle
|
||||||
|
HAL_Coil_SetPWM(active_dc);
|
||||||
|
is_en = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void HB_Disable(void)
|
||||||
|
{
|
||||||
|
// Set 0 DC
|
||||||
|
HAL_Coil_SetPWM(0);
|
||||||
|
// Disable low side
|
||||||
|
HAL_Coil_SetLowSide(0);
|
||||||
|
is_en = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t HB_IsEnabled(void)
|
||||||
|
{
|
||||||
|
if(is_en) return 1;
|
||||||
|
else return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int8_t HB_IsOutputMatch(uint16_t fb_output_voltage, uint16_t limit)
|
||||||
|
{
|
||||||
|
// No fault if output not enabled
|
||||||
|
if(!is_en) return -1;
|
||||||
|
|
||||||
|
// Can't check voltage if low side is off
|
||||||
|
if(!low_side_on) return -1;
|
||||||
|
|
||||||
|
if(target==0)
|
||||||
|
{
|
||||||
|
// Output can be only 0
|
||||||
|
if(fb_output_voltage != 0) return 0;
|
||||||
|
else return 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Calculate upper and lower bounds
|
||||||
|
uint16_t max = target + limit;
|
||||||
|
uint16_t min = target - limit;
|
||||||
|
|
||||||
|
//Sanity check
|
||||||
|
if(max < target) max = 0xFFFF;
|
||||||
|
if(min > target) min = 0;
|
||||||
|
|
||||||
|
//Do check
|
||||||
|
if((fb_output_voltage < min)||(fb_output_voltage > max)) return 0;
|
||||||
|
else return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**** Private function definitions ****/
|
||||||
|
static uint16_t CalculateDuty16b(uint16_t target, uint16_t supply)
|
||||||
|
{
|
||||||
|
if(target==0) return 0;
|
||||||
|
if(supply==0) return 0;
|
||||||
|
if(target > supply) return 0xFFFF;
|
||||||
|
|
||||||
|
// Calculate Duty cycle, in 16bit format
|
||||||
|
uint32_t temp = (uint32_t)target * 0x0000FFFF;
|
||||||
|
temp = temp / supply;
|
||||||
|
|
||||||
|
//Limit output to 16 bits
|
||||||
|
if(temp > 0x0000FFFF) return 0xFFFF;
|
||||||
|
else return (uint16_t)temp;
|
||||||
|
}
|
||||||
24
firmware/devices/halfbridge.h
Normal file
24
firmware/devices/halfbridge.h
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
#ifndef HALFBRIDGE_H_
|
||||||
|
#define HALFBRIDGE_H_
|
||||||
|
|
||||||
|
/**** Includes ****/
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/**** Public function declarations ****/
|
||||||
|
void HB_UpdateOutput(uint16_t supply);
|
||||||
|
|
||||||
|
void HB_SetTarget(uint16_t voltage);
|
||||||
|
void HB_SetLowSide(uint8_t on);
|
||||||
|
|
||||||
|
void HB_SetDirect(uint16_t duty);
|
||||||
|
|
||||||
|
void HB_Enable(void);
|
||||||
|
void HB_Disable(void);
|
||||||
|
|
||||||
|
uint16_t HB_GetTarget(void);
|
||||||
|
|
||||||
|
uint8_t HB_IsLowOn(void);
|
||||||
|
uint8_t HB_IsEnabled(void);
|
||||||
|
int8_t HB_IsOutputMatch(uint16_t fb_output_voltage, uint16_t limit);
|
||||||
|
|
||||||
|
#endif /* HALFBRIDGE_H_ */
|
||||||
82
firmware/devices/inputs.c
Normal file
82
firmware/devices/inputs.c
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
/**** Includes ****/
|
||||||
|
#include "hal/udccd_hal.h"
|
||||||
|
#include "inputs.h"
|
||||||
|
|
||||||
|
/**** Private definitions ****/
|
||||||
|
|
||||||
|
/**** Private variables ****/
|
||||||
|
static const uint8_t def_debounce_lim = 10;
|
||||||
|
|
||||||
|
/**** Private function declarations ****/
|
||||||
|
static void InitDefaultInput(inCh_t* inp);
|
||||||
|
static void ProcessInput(uint8_t read_lvl, inCh_t* inp);
|
||||||
|
|
||||||
|
/**** Public function definitions ****/
|
||||||
|
void Inputs_DefInit(inputs_t* inputs)
|
||||||
|
{
|
||||||
|
InitDefaultInput(&inputs->handbrake);
|
||||||
|
InitDefaultInput(&inputs->brakes);
|
||||||
|
InitDefaultInput(&inputs->dimm);
|
||||||
|
InitDefaultInput(&inputs->up);
|
||||||
|
InitDefaultInput(&inputs->down);
|
||||||
|
InitDefaultInput(&inputs->mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Inputs_UpdateAll(inputs_t* inputs)
|
||||||
|
{
|
||||||
|
// Chassis inputs
|
||||||
|
ProcessInput(HAL_ReadLvl_Handbrake(), &inputs->handbrake);
|
||||||
|
ProcessInput(HAL_ReadLvl_Brake(), &inputs->brakes);
|
||||||
|
ProcessInput(HAL_ReadLvl_Dimm(), &inputs->dimm);
|
||||||
|
|
||||||
|
// User inputs
|
||||||
|
ProcessInput(HAL_ReadLvl_BtnUp(), &inputs->up);
|
||||||
|
ProcessInput(HAL_ReadLvl_BtnDown(), &inputs->down);
|
||||||
|
ProcessInput(HAL_ReadLvl_BtnMode(), &inputs->mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Inputs_SetHanbrakePullUp(uint8_t on)
|
||||||
|
{
|
||||||
|
if(on) HAL_SetPull_Handbrake(HIGH);
|
||||||
|
else HAL_SetPull_Handbrake(HIZ);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**** Private function definitions ****/
|
||||||
|
static void InitDefaultInput(inCh_t* inp)
|
||||||
|
{
|
||||||
|
inp->is_active = 0;
|
||||||
|
inp->is_new = 0;
|
||||||
|
inp->state_timer = 0;
|
||||||
|
inp->cfg.act_level = LOW;
|
||||||
|
inp->cfg.dbnc_treshold = def_debounce_lim;
|
||||||
|
inp->proc.level = LOW;
|
||||||
|
inp->proc.dbnc_counter = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ProcessInput(uint8_t read_lvl, inCh_t* inp)
|
||||||
|
{
|
||||||
|
if(inp->state_timer < 0xFFFF) inp->state_timer++;
|
||||||
|
|
||||||
|
if(read_lvl != inp->proc.level)
|
||||||
|
{
|
||||||
|
//Debounce ongoing
|
||||||
|
inp->proc.dbnc_counter++;
|
||||||
|
if(inp->proc.dbnc_counter < inp->cfg.dbnc_treshold) return;
|
||||||
|
|
||||||
|
//Save level
|
||||||
|
inp->proc.level = read_lvl;
|
||||||
|
//Change state
|
||||||
|
if(inp->proc.level == inp->cfg.act_level) inp->is_active = 1;
|
||||||
|
else inp->is_active = 0;
|
||||||
|
// Update new flag
|
||||||
|
inp->is_new = 1;
|
||||||
|
// Reset state timer
|
||||||
|
inp->state_timer = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Debounce failed
|
||||||
|
if(inp->proc.dbnc_counter) inp->proc.dbnc_counter = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
43
firmware/devices/inputs.h
Normal file
43
firmware/devices/inputs.h
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
#ifndef INPUTS_H_
|
||||||
|
#define INPUTS_H_
|
||||||
|
|
||||||
|
/**** Includes ****/
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "common/level.h"
|
||||||
|
|
||||||
|
/**** Public definitions ****/
|
||||||
|
typedef struct {
|
||||||
|
level_t act_level;
|
||||||
|
uint8_t dbnc_treshold;
|
||||||
|
} inChCfg_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
level_t level;
|
||||||
|
uint8_t dbnc_counter;
|
||||||
|
} inChRaw_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t is_active;
|
||||||
|
uint8_t is_new;
|
||||||
|
uint16_t state_timer;
|
||||||
|
inChRaw_t proc;
|
||||||
|
inChCfg_t cfg;
|
||||||
|
} inCh_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
inCh_t handbrake;
|
||||||
|
inCh_t brakes;
|
||||||
|
inCh_t dimm;
|
||||||
|
inCh_t up;
|
||||||
|
inCh_t down;
|
||||||
|
inCh_t mode;
|
||||||
|
} inputs_t;
|
||||||
|
|
||||||
|
/**** Public function declarations ****/
|
||||||
|
void Inputs_DefInit(inputs_t* inputs);
|
||||||
|
|
||||||
|
void Inputs_UpdateAll(inputs_t* inputs);
|
||||||
|
|
||||||
|
void Inputs_SetHanbrakePullUp(uint8_t on);
|
||||||
|
|
||||||
|
#endif /* INPUTS_H_ */
|
||||||
20
firmware/devices/led_display.c
Normal file
20
firmware/devices/led_display.c
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
/**** Includes ****/
|
||||||
|
#include "hal/udccd_hal.h"
|
||||||
|
#include "led_display.h"
|
||||||
|
|
||||||
|
/**** Private variables ****/
|
||||||
|
|
||||||
|
/**** Private function declarations ****/
|
||||||
|
|
||||||
|
/**** Public function definitions ****/
|
||||||
|
void LED_DSP_ShowImage(uint8_t image)
|
||||||
|
{
|
||||||
|
HAL_LEDS_Set(image);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LED_DSP_SetBrightness(uint8_t percent)
|
||||||
|
{
|
||||||
|
HAL_LEDS_SetPWM(percent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**** Private function definitions ****/
|
||||||
13
firmware/devices/led_display.h
Normal file
13
firmware/devices/led_display.h
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#ifndef LED_DISPLAY_H_
|
||||||
|
#define LED_DISPLAY_H_
|
||||||
|
|
||||||
|
/**** Includes ****/
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/**** Public definitions ****/
|
||||||
|
|
||||||
|
/**** Public function declarations ****/
|
||||||
|
void LED_DSP_ShowImage(uint8_t image);
|
||||||
|
void LED_DSP_SetBrightness(uint8_t percent);
|
||||||
|
|
||||||
|
#endif /* LED_DISPLAY_H_ */
|
||||||
34
firmware/devices/memory.c
Normal file
34
firmware/devices/memory.c
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
/**** Includes ****/
|
||||||
|
#include <avr/eeprom.h>
|
||||||
|
#include "memory.h"
|
||||||
|
|
||||||
|
/**** Public function definitions ****/
|
||||||
|
uint8_t MEM_Read8b(uint8_t address)
|
||||||
|
{
|
||||||
|
return eeprom_read_byte((uint8_t*)address);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t MEM_Read16b(uint8_t address)
|
||||||
|
{
|
||||||
|
return eeprom_read_word((uint8_t*)address);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t MEM_Read32b(uint8_t address)
|
||||||
|
{
|
||||||
|
return eeprom_read_dword((uint8_t*)address);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MEM_Write8b(uint8_t address, uint8_t value)
|
||||||
|
{
|
||||||
|
return eeprom_write_byte((uint8_t*)address, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MEM_Write16b(uint8_t address, uint16_t value)
|
||||||
|
{
|
||||||
|
return eeprom_write_word((uint8_t*)address, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MEM_Write32b(uint8_t address, uint32_t value)
|
||||||
|
{
|
||||||
|
return eeprom_write_dword((uint8_t*)address, value);
|
||||||
|
}
|
||||||
16
firmware/devices/memory.h
Normal file
16
firmware/devices/memory.h
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#ifndef MEMORY_H_
|
||||||
|
#define MEMORY_H_
|
||||||
|
|
||||||
|
/**** Includes ****/
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/**** Public function declarations ****/
|
||||||
|
uint8_t MEM_Read8b(uint8_t address);
|
||||||
|
uint16_t MEM_Read16b(uint8_t address);
|
||||||
|
uint32_t MEM_Read32b(uint8_t address);
|
||||||
|
|
||||||
|
void MEM_Write8b(uint8_t address, uint8_t value);
|
||||||
|
void MEM_Write16b(uint8_t address, uint16_t value);
|
||||||
|
void MEM_Write32b(uint8_t address, uint32_t value);
|
||||||
|
|
||||||
|
#endif /* MEMORY_H_ */
|
||||||
125
firmware/drivers/display.c
Normal file
125
firmware/drivers/display.c
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
/**** Includes ****/
|
||||||
|
#include "display.h"
|
||||||
|
|
||||||
|
/**** Private definitions ****/
|
||||||
|
|
||||||
|
/**** Private variables ****/
|
||||||
|
static uint8_t PWM_DIMM = 50;
|
||||||
|
static uint8_t PWM_BRIGTH = 100;
|
||||||
|
|
||||||
|
static uint8_t set_image = 0x00;
|
||||||
|
|
||||||
|
static uint16_t lock_timer = 0;
|
||||||
|
|
||||||
|
/**** Private function declarations ****/
|
||||||
|
static uint8_t ImageGen_Dot10(uint8_t percent);
|
||||||
|
static uint8_t ImageGen_Dot20(uint8_t percent);
|
||||||
|
static uint8_t ImageGen_Bar(uint8_t percent);
|
||||||
|
|
||||||
|
/**** Public function definitions ****/
|
||||||
|
void Display_CfgBacklight(uint8_t brigth, uint8_t dimm)
|
||||||
|
{
|
||||||
|
//Limit values
|
||||||
|
if(brigth>100) brigth = 100;
|
||||||
|
else if(brigth==0) brigth = 1;
|
||||||
|
|
||||||
|
if(dimm>100) dimm = 100;
|
||||||
|
else if(dimm==0) dimm = 1;
|
||||||
|
|
||||||
|
//Save values
|
||||||
|
PWM_BRIGTH = brigth;
|
||||||
|
PWM_DIMM = dimm;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Display_SetImage(uint8_t image)
|
||||||
|
{
|
||||||
|
if(lock_timer) return;
|
||||||
|
|
||||||
|
set_image = image & 0x3F;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Display_SetPercent(uint8_t value, dspStyle_t style)
|
||||||
|
{
|
||||||
|
switch(style)
|
||||||
|
{
|
||||||
|
case BAR:
|
||||||
|
Display_SetImage(ImageGen_Bar(value));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DOT10:
|
||||||
|
Display_SetImage(ImageGen_Dot10(value));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Display_SetImage(ImageGen_Dot20(value));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Display_SetScale(uint16_t value, uint16_t max_value ,dspStyle_t style)
|
||||||
|
{
|
||||||
|
//Convert value to percent
|
||||||
|
uint32_t temp = (uint32_t)value *100;
|
||||||
|
temp /= max_value;
|
||||||
|
|
||||||
|
//Limit value to 100 percent
|
||||||
|
uint8_t percent = 0;
|
||||||
|
if(temp >= 100) percent = 100;
|
||||||
|
else if(temp == 0) percent = 0;
|
||||||
|
else percent = (uint8_t)temp;
|
||||||
|
|
||||||
|
Display_SetPercent(percent, style);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Display_SetLock(uint16_t time)
|
||||||
|
{
|
||||||
|
lock_timer = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Display_Update(inputs_t* inputs)
|
||||||
|
{
|
||||||
|
// Brightness control
|
||||||
|
if(inputs->dimm.is_active) LED_DSP_SetBrightness(PWM_DIMM);
|
||||||
|
else LED_DSP_SetBrightness(PWM_BRIGTH);
|
||||||
|
|
||||||
|
if(lock_timer) lock_timer--;
|
||||||
|
|
||||||
|
// Set image
|
||||||
|
LED_DSP_ShowImage(set_image);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**** Private function definitions ****/
|
||||||
|
static uint8_t ImageGen_Dot10(uint8_t percent)
|
||||||
|
{
|
||||||
|
if(percent<6) return 0x01;
|
||||||
|
else if(percent<16) return 0x03;
|
||||||
|
else if(percent<26) return 0x02;
|
||||||
|
else if(percent<36) return 0x06;
|
||||||
|
else if(percent<46) return 0x04;
|
||||||
|
else if(percent<56) return 0x0C;
|
||||||
|
else if(percent<66) return 0x08;
|
||||||
|
else if(percent<76) return 0x18;
|
||||||
|
else if(percent<86) return 0x10;
|
||||||
|
else if(percent<96) return 0x30;
|
||||||
|
else return 0x20;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t ImageGen_Dot20(uint8_t percent)
|
||||||
|
{
|
||||||
|
if(percent<11) return 0x01;
|
||||||
|
else if(percent<31) return 0x02;
|
||||||
|
else if(percent<51) return 0x04;
|
||||||
|
else if(percent<71) return 0x08;
|
||||||
|
else if(percent<91) return 0x10;
|
||||||
|
else return 0x20;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t ImageGen_Bar(uint8_t percent)
|
||||||
|
{
|
||||||
|
if(percent<11) return 0x01;
|
||||||
|
else if(percent<31) return 0x03;
|
||||||
|
else if(percent<51) return 0x07;
|
||||||
|
else if(percent<71) return 0x0F;
|
||||||
|
else if(percent<91) return 0x1F;
|
||||||
|
else return 0x3F;
|
||||||
|
}
|
||||||
27
firmware/drivers/display.h
Normal file
27
firmware/drivers/display.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#ifndef DISPLAY_DRV_H_
|
||||||
|
#define DISPLAY_DRV_H_
|
||||||
|
|
||||||
|
/**** Includes ****/
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include "../devices/led_display.h"
|
||||||
|
#include "../devices/inputs.h"
|
||||||
|
|
||||||
|
/**** Public definitions ****/
|
||||||
|
typedef enum {
|
||||||
|
DOT20,
|
||||||
|
DOT10,
|
||||||
|
BAR
|
||||||
|
} dspStyle_t;
|
||||||
|
|
||||||
|
/**** Public function declarations ****/
|
||||||
|
void Display_SetImage(uint8_t image);
|
||||||
|
void Display_SetPercent(uint8_t value, dspStyle_t style);
|
||||||
|
void Display_SetScale(uint16_t value, uint16_t max_value ,dspStyle_t style);
|
||||||
|
|
||||||
|
void Display_SetLock(uint16_t time);
|
||||||
|
|
||||||
|
void Display_Update(inputs_t* inputs);
|
||||||
|
|
||||||
|
void Display_CfgBacklight(uint8_t brigth, uint8_t dimm);
|
||||||
|
|
||||||
|
#endif /* DISPLAY_DRV_H_ */
|
||||||
341
firmware/drivers/output.c
Normal file
341
firmware/drivers/output.c
Normal file
@@ -0,0 +1,341 @@
|
|||||||
|
/**** Includes ****/
|
||||||
|
#include "output.h"
|
||||||
|
|
||||||
|
/**** Private definitions ****/
|
||||||
|
typedef struct {
|
||||||
|
uint8_t active;
|
||||||
|
uint8_t time;
|
||||||
|
} warn_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
warn_t supply_voltage;
|
||||||
|
warn_t supply_current;
|
||||||
|
warn_t supply_power;
|
||||||
|
warn_t output_voltage;
|
||||||
|
warn_t output_current;
|
||||||
|
warn_t output_power;
|
||||||
|
warn_t output_open;
|
||||||
|
warn_t output_short;
|
||||||
|
warn_t output_mismatch;
|
||||||
|
} warnings_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t supply_uvlo;
|
||||||
|
uint8_t supply_ovp;
|
||||||
|
uint8_t supply_ocp;
|
||||||
|
uint8_t supply_opp;
|
||||||
|
uint8_t output_ovp;
|
||||||
|
uint8_t output_ocp;
|
||||||
|
uint8_t output_opp;
|
||||||
|
uint8_t output_open;
|
||||||
|
uint8_t output_short;
|
||||||
|
} faults_t;
|
||||||
|
|
||||||
|
/**** Private constants ****/
|
||||||
|
static const uint16_t LIM_SUPPLY_UVLO = 8000; //mV
|
||||||
|
static const uint16_t LIM_SUPPLY_OVP = 18000; //mV
|
||||||
|
static const uint16_t LIM_SUPPLY_OCP = 7000; //mA
|
||||||
|
static const uint16_t LIM_SUPPLY_OPP = 40000; //mW
|
||||||
|
|
||||||
|
static const uint16_t LIM_OUTPUT_OVP = 12000; //mV
|
||||||
|
static const uint16_t LIM_OUTPUT_OCP = 7000; //mA
|
||||||
|
static const uint16_t LIM_OUTPUT_OPP = 40000; //mW
|
||||||
|
|
||||||
|
static const uint16_t LIM_OUTPUT_OPEN = 40000; //mR
|
||||||
|
static const uint16_t LIM_OUTPUT_SHORT = 750; //mR
|
||||||
|
|
||||||
|
static const uint16_t LIM_OUTPUT_MATCH = 100; //mV
|
||||||
|
|
||||||
|
static const uint8_t OCP_WARNING_LIMIT = 10; //cycles
|
||||||
|
static const uint8_t SHORT_WARNING_LIMIT = 50; //cycles
|
||||||
|
|
||||||
|
static const uint16_t MAX_OUTPUT_VOLTAGE = 10000; //mV
|
||||||
|
static const uint16_t MIN_OUTPUT_VOLTAGE = 100; //mV
|
||||||
|
|
||||||
|
static const uint16_t COOLDOWN_TIME = 5000;
|
||||||
|
|
||||||
|
/**** Private variables ****/
|
||||||
|
static warnings_t warnings;
|
||||||
|
static faults_t faults;
|
||||||
|
|
||||||
|
static uint16_t target_output = 0;
|
||||||
|
static uint16_t adj_target = 0;
|
||||||
|
|
||||||
|
static int32_t hb_volt_sum = 0;
|
||||||
|
|
||||||
|
static uint8_t new_target = 1;
|
||||||
|
|
||||||
|
static uint8_t steady_state = 0;
|
||||||
|
|
||||||
|
static faultState_t fault_state = F_NONE;
|
||||||
|
|
||||||
|
static uint16_t cooldown_timer = 0;
|
||||||
|
|
||||||
|
static outState_t out_state = O_OFF;
|
||||||
|
|
||||||
|
/**** Private function declarations ****/
|
||||||
|
static void Process_Warnings(analog_t* meas);
|
||||||
|
static uint8_t Process_Faults(void);
|
||||||
|
|
||||||
|
static void ProcessWarningTime(warn_t* w);
|
||||||
|
static uint8_t isAnyFaultActive(faults_t* f);
|
||||||
|
static uint8_t isFaultWarningActive(warnings_t* w, faults_t* f);
|
||||||
|
static void ResetFaults(faults_t* f);
|
||||||
|
|
||||||
|
/**** Public function definitions ****/
|
||||||
|
void Output_Enable(void)
|
||||||
|
{
|
||||||
|
ResetFaults(&faults);
|
||||||
|
target_output = 0;
|
||||||
|
out_state = O_ACTIVE;
|
||||||
|
HB_SetTarget(0) ;
|
||||||
|
HB_SetLowSide(1);
|
||||||
|
HB_Enable();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Output_Update(analog_t* meas)
|
||||||
|
{
|
||||||
|
Process_Warnings(meas);
|
||||||
|
|
||||||
|
// Convert Warnings to Faults
|
||||||
|
uint8_t active_fault = Process_Faults();
|
||||||
|
|
||||||
|
/// Ignore faults
|
||||||
|
active_fault = 0;
|
||||||
|
|
||||||
|
// Determine coil state
|
||||||
|
switch(out_state)
|
||||||
|
{
|
||||||
|
case O_ACTIVE:
|
||||||
|
if(active_fault)
|
||||||
|
{
|
||||||
|
// Disable output
|
||||||
|
HB_Disable();
|
||||||
|
out_state = O_FAULTED;
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
|
//Do target adjustment logic
|
||||||
|
if(steady_state >= 10)
|
||||||
|
{
|
||||||
|
//Calculate average HB voltage
|
||||||
|
hb_volt_sum /= 11;
|
||||||
|
|
||||||
|
// Calculate feedback adjusted HB output
|
||||||
|
int32_t error = hb_volt_sum - (int32_t)target_output;
|
||||||
|
int32_t temp = (int32_t)adj_target - error;
|
||||||
|
// Limit to 16bits
|
||||||
|
if(temp<=0) adj_target = 0;
|
||||||
|
else if(temp >= 0x0000FFFF) adj_target = 0xFFFF;
|
||||||
|
else adj_target = (uint16_t)temp;
|
||||||
|
steady_state = 0;
|
||||||
|
hb_volt_sum = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hb_volt_sum += meas->hb_voltage;
|
||||||
|
steady_state++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Closed loop or open loop target set
|
||||||
|
if(new_target)
|
||||||
|
{
|
||||||
|
// Set open-loop HB output
|
||||||
|
HB_SetTarget(target_output);
|
||||||
|
adj_target = target_output;
|
||||||
|
steady_state = 0;
|
||||||
|
new_target = 0;
|
||||||
|
hb_volt_sum = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
HB_SetTarget(adj_target);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update output
|
||||||
|
HB_UpdateOutput(meas->supply_voltage);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case O_FAULTED:
|
||||||
|
if(!active_fault)
|
||||||
|
{
|
||||||
|
//Return to normal state
|
||||||
|
HB_Enable();
|
||||||
|
out_state = O_ACTIVE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: //OFF
|
||||||
|
if(HB_IsEnabled()) HB_Disable();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Output_SetTarget(uint16_t voltage)
|
||||||
|
{
|
||||||
|
if(voltage > MAX_OUTPUT_VOLTAGE) voltage = MAX_OUTPUT_VOLTAGE;
|
||||||
|
else if((voltage > 0)&&(voltage < MIN_OUTPUT_VOLTAGE)) voltage = MIN_OUTPUT_VOLTAGE;
|
||||||
|
|
||||||
|
if(voltage != target_output) new_target = 1;
|
||||||
|
target_output = voltage;
|
||||||
|
}
|
||||||
|
|
||||||
|
outState_t Output_GetOutputState(void)
|
||||||
|
{
|
||||||
|
return out_state;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**** Private function definitions ****/
|
||||||
|
static void Process_Warnings(analog_t* meas)
|
||||||
|
{
|
||||||
|
// Supply UVLO and OVP
|
||||||
|
if((meas->supply_voltage > LIM_SUPPLY_OVP)||(meas->supply_voltage < LIM_SUPPLY_UVLO)) warnings.supply_voltage.active = 1;
|
||||||
|
else warnings.supply_voltage.active = 0;
|
||||||
|
|
||||||
|
// Supply OCP
|
||||||
|
if(meas->supply_current > LIM_SUPPLY_OCP) warnings.supply_current.active = 1;
|
||||||
|
else warnings.supply_current.active = 0;
|
||||||
|
|
||||||
|
// Supply OPP
|
||||||
|
if(meas->supply_power > LIM_SUPPLY_OPP) warnings.supply_power.active = 1;
|
||||||
|
else warnings.supply_power.active = 0;
|
||||||
|
|
||||||
|
// Halfbridge output conditions
|
||||||
|
// Output Target mismatch
|
||||||
|
if(HB_IsOutputMatch(meas->hb_voltage, LIM_OUTPUT_MATCH) == 0) warnings.output_mismatch.active = 1;
|
||||||
|
else warnings.output_mismatch.active = 0;
|
||||||
|
|
||||||
|
// Output OCP
|
||||||
|
if((HB_IsLowOn())&&(meas->hb_currnet > LIM_OUTPUT_OCP)) warnings.output_current.active = 1;
|
||||||
|
else warnings.output_current.active = 0;
|
||||||
|
|
||||||
|
// Output OVP
|
||||||
|
if((HB_IsLowOn())&&(meas->hb_voltage > LIM_OUTPUT_OVP)) warnings.output_voltage.active = 1;
|
||||||
|
else warnings.output_voltage.active = 0;
|
||||||
|
|
||||||
|
// Output OPP
|
||||||
|
if((HB_IsEnabled())&&(meas->hb_power > LIM_OUTPUT_OPP)) warnings.output_power.active = 1;
|
||||||
|
else warnings.output_power.active = 0;
|
||||||
|
|
||||||
|
// Output Short
|
||||||
|
if((HB_IsEnabled())&&(meas->hb_resistance < LIM_OUTPUT_SHORT)) warnings.output_short.active = 1;
|
||||||
|
else warnings.output_short.active = 0;
|
||||||
|
|
||||||
|
// Output Open - Load loss
|
||||||
|
if((HB_IsEnabled())&&(meas->hb_resistance > LIM_OUTPUT_OPEN)) warnings.output_open.active = 1;
|
||||||
|
else warnings.output_open.active = 0;
|
||||||
|
|
||||||
|
ProcessWarningTime(&warnings.supply_voltage);
|
||||||
|
ProcessWarningTime(&warnings.supply_current);
|
||||||
|
ProcessWarningTime(&warnings.supply_power);
|
||||||
|
ProcessWarningTime(&warnings.output_mismatch);
|
||||||
|
ProcessWarningTime(&warnings.output_voltage);
|
||||||
|
ProcessWarningTime(&warnings.output_current);
|
||||||
|
ProcessWarningTime(&warnings.output_power);
|
||||||
|
ProcessWarningTime(&warnings.output_open);
|
||||||
|
ProcessWarningTime(&warnings.output_short);
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t Process_Faults(void)
|
||||||
|
{
|
||||||
|
// Check warnings to escalate to fault
|
||||||
|
// Supply OCP
|
||||||
|
if(warnings.supply_current.time > OCP_WARNING_LIMIT) faults.supply_ocp = 1;
|
||||||
|
|
||||||
|
// Output OCP
|
||||||
|
if(warnings.output_current.time > OCP_WARNING_LIMIT) faults.output_ocp = 1;
|
||||||
|
|
||||||
|
// Output short
|
||||||
|
if(warnings.output_short.time > SHORT_WARNING_LIMIT) faults.output_short = 1;
|
||||||
|
|
||||||
|
switch(fault_state)
|
||||||
|
{
|
||||||
|
case F_ACTIVE:
|
||||||
|
// Check if fault still active
|
||||||
|
if(!isFaultWarningActive(&warnings, &faults))
|
||||||
|
{
|
||||||
|
// Fault cause ended, go to cooldown
|
||||||
|
cooldown_timer = COOLDOWN_TIME;
|
||||||
|
fault_state = F_COOLDOWN;
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
|
||||||
|
case F_COOLDOWN:
|
||||||
|
// Check if fault reoccurs
|
||||||
|
if(isFaultWarningActive(&warnings, &faults))
|
||||||
|
{
|
||||||
|
fault_state = F_ACTIVE;
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Wait for cooldown timer, reset fault flags
|
||||||
|
if(cooldown_timer) cooldown_timer--;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ResetFaults(&faults);
|
||||||
|
fault_state = F_NONE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: //NONE
|
||||||
|
// Check for new faults
|
||||||
|
if(isAnyFaultActive(&faults))
|
||||||
|
{
|
||||||
|
// Start fault process
|
||||||
|
fault_state = F_ACTIVE;
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(fault_state != F_NONE) return 1;
|
||||||
|
else return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ProcessWarningTime(warn_t* w)
|
||||||
|
{
|
||||||
|
if((w->active)&&(w->time < 0xFF)) w->time++;
|
||||||
|
else if(w->active == 0) w->time = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t isAnyFaultActive(faults_t* f)
|
||||||
|
{
|
||||||
|
if(f->supply_uvlo) return 1;
|
||||||
|
if(f->supply_ovp) return 1;
|
||||||
|
if(f->supply_ocp) return 1;
|
||||||
|
if(f->supply_opp) return 1;
|
||||||
|
if(f->output_ovp) return 1;
|
||||||
|
if(f->output_ocp) return 1;
|
||||||
|
if(f->output_opp) return 1;
|
||||||
|
if(f->output_open) return 1;
|
||||||
|
if(f->output_short) return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t isFaultWarningActive(warnings_t* w, faults_t* f)
|
||||||
|
{
|
||||||
|
if((f->supply_uvlo) && (w->supply_voltage.active)) return 1;
|
||||||
|
if((f->supply_ovp) && (w->supply_voltage.active)) return 1;
|
||||||
|
if((f->supply_ocp) && (w->supply_current.active)) return 1;
|
||||||
|
if((f->supply_opp) && (w->supply_power.active) ) return 1;
|
||||||
|
if((f->output_ovp) && (w->output_voltage.active)) return 1;
|
||||||
|
if((f->output_ocp) && (w->output_current.active)) return 1;
|
||||||
|
if((f->output_opp) && (w->output_power.active) ) return 1;
|
||||||
|
if((f->output_open) && (w->output_open.active) ) return 1;
|
||||||
|
if((f->output_short) && (w->output_short.active) ) return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ResetFaults(faults_t* f)
|
||||||
|
{
|
||||||
|
f->supply_uvlo = 0;
|
||||||
|
f->supply_ovp = 0;
|
||||||
|
f->supply_ocp = 0;
|
||||||
|
f->supply_opp = 0;
|
||||||
|
f->output_ovp = 0;
|
||||||
|
f->output_ocp = 0;
|
||||||
|
f->output_opp = 0;
|
||||||
|
f->output_open = 0;
|
||||||
|
f->output_short = 0;
|
||||||
|
}
|
||||||
30
firmware/drivers/output.h
Normal file
30
firmware/drivers/output.h
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
#ifndef OUTPUT_DRV_H_
|
||||||
|
#define OUTPUT_DRV_H_
|
||||||
|
|
||||||
|
/**** Includes ****/
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include "../devices/analog.h"
|
||||||
|
#include "../devices/halfbridge.h"
|
||||||
|
|
||||||
|
/**** Public definitions ****/
|
||||||
|
typedef enum {
|
||||||
|
F_NONE,
|
||||||
|
F_ACTIVE,
|
||||||
|
F_COOLDOWN
|
||||||
|
} faultState_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
O_OFF,
|
||||||
|
O_ACTIVE,
|
||||||
|
O_FAULTED
|
||||||
|
} outState_t;
|
||||||
|
|
||||||
|
/**** Public function declarations ****/
|
||||||
|
void Output_Enable(void);
|
||||||
|
void Output_Update(analog_t* meas);
|
||||||
|
|
||||||
|
void Output_SetTarget(uint16_t voltage);
|
||||||
|
|
||||||
|
outState_t Output_GetOutputState(void);
|
||||||
|
|
||||||
|
#endif /* OUTPUT_DRV_H_ */
|
||||||
127
firmware/logic/coil.c
Normal file
127
firmware/logic/coil.c
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
/**** Includes ****/
|
||||||
|
#include "coil.h"
|
||||||
|
|
||||||
|
/**** Private definitions ****/
|
||||||
|
|
||||||
|
/**** Private constants ****/
|
||||||
|
|
||||||
|
/**** Private variables ****/
|
||||||
|
static uint16_t lock_current = 4500; //mA
|
||||||
|
static uint16_t min_current = 100; //mA
|
||||||
|
static uint16_t target_current = 0; //mA
|
||||||
|
static uint8_t new_target = 1;
|
||||||
|
|
||||||
|
static uint16_t adj_target_current = 0; //mA
|
||||||
|
static uint16_t target_voltage = 0; //mV
|
||||||
|
|
||||||
|
static uint8_t act_force = 0;
|
||||||
|
|
||||||
|
static uint16_t nominal_resitance = 1500; //mR
|
||||||
|
|
||||||
|
static int32_t sum_current = 0;
|
||||||
|
static uint8_t sum_cnt = 0;
|
||||||
|
|
||||||
|
|
||||||
|
/**** Private function declarations ****/
|
||||||
|
static uint16_t UpdateVoltage(uint16_t cur, uint16_t res);
|
||||||
|
|
||||||
|
/**** Public function definitions ****/
|
||||||
|
void Coil_SetLockCurrent(uint16_t lock_i)
|
||||||
|
{
|
||||||
|
lock_current = lock_i;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Coil_SetTarget_Force(uint8_t force)
|
||||||
|
{
|
||||||
|
// Check if worth doing
|
||||||
|
if(force == act_force) return;
|
||||||
|
|
||||||
|
// Calculate new target current
|
||||||
|
act_force = force;
|
||||||
|
|
||||||
|
// Check simple answer
|
||||||
|
uint16_t new_current = 0;
|
||||||
|
if(force==0) new_current = 0;
|
||||||
|
else if(force >= 100) new_current = lock_current;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uint32_t temp = (uint32_t)force * lock_current;
|
||||||
|
temp /= 100;
|
||||||
|
|
||||||
|
if(temp > 0x0000FFFF) new_current = lock_current;
|
||||||
|
else new_current = (uint16_t) temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update new target
|
||||||
|
Coil_SetTarget_Current(new_current);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Coil_SetTarget_Current(uint16_t current)
|
||||||
|
{
|
||||||
|
if(current >= lock_current) current = lock_current;
|
||||||
|
else if((current > 0)&&(current <= min_current)) current = min_current;
|
||||||
|
|
||||||
|
if(current != target_current) new_target = 1;
|
||||||
|
target_current = current;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t Coil_GetTargetVolatge(void)
|
||||||
|
{
|
||||||
|
return target_voltage;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t Coil_Update(analog_t* meas)
|
||||||
|
{
|
||||||
|
// Collect average current
|
||||||
|
sum_current += meas->hb_currnet;
|
||||||
|
sum_cnt++;
|
||||||
|
|
||||||
|
// Update measurement
|
||||||
|
if(sum_cnt >= 10)
|
||||||
|
{
|
||||||
|
// Calculate average
|
||||||
|
sum_current /= sum_cnt;
|
||||||
|
|
||||||
|
// Calculate error
|
||||||
|
int32_t error = sum_current - (int32_t)target_current;
|
||||||
|
int32_t temp = (int32_t)adj_target_current - error;
|
||||||
|
|
||||||
|
// Limit to 16bits
|
||||||
|
if(temp<0) adj_target_current = 0;
|
||||||
|
else if(temp > 0x0000FFFF) adj_target_current = 0xFFFF;
|
||||||
|
else adj_target_current = (uint16_t)temp;
|
||||||
|
sum_cnt = 0;
|
||||||
|
sum_current = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Closed loop or open loop target set
|
||||||
|
if(new_target)
|
||||||
|
{
|
||||||
|
// Set open-loop HB output
|
||||||
|
target_voltage = UpdateVoltage(target_current, nominal_resitance);
|
||||||
|
adj_target_current = target_current;
|
||||||
|
new_target = 0;
|
||||||
|
sum_cnt = 0;
|
||||||
|
sum_current = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
target_voltage = UpdateVoltage(adj_target_current, nominal_resitance);
|
||||||
|
}
|
||||||
|
|
||||||
|
return target_voltage;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**** Private function definitions ****/
|
||||||
|
static uint16_t UpdateVoltage(uint16_t cur, uint16_t res)
|
||||||
|
{
|
||||||
|
// Update settable voltage
|
||||||
|
if(cur==0) return 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uint32_t volt = (uint32_t)cur * res;
|
||||||
|
volt /= 1000;
|
||||||
|
if(volt > 0x0000FFFF) return 0xFFFF;
|
||||||
|
else return (uint16_t)volt;
|
||||||
|
}
|
||||||
|
}
|
||||||
19
firmware/logic/coil.h
Normal file
19
firmware/logic/coil.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#ifndef COIL_LOGIC_H_
|
||||||
|
#define COIL_LOGIC_H_
|
||||||
|
|
||||||
|
/**** Includes ****/
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "../devices/analog.h"
|
||||||
|
|
||||||
|
/**** Public definitions ****/
|
||||||
|
|
||||||
|
/**** Public function declarations ****/
|
||||||
|
void Coil_SetTarget_Force(uint8_t force);
|
||||||
|
void Coil_SetTarget_Current(uint16_t current);
|
||||||
|
uint16_t Coil_GetTargetVolatge(void);
|
||||||
|
|
||||||
|
uint16_t Coil_Update(analog_t* meas);
|
||||||
|
|
||||||
|
void Coil_SetLockCurrent(uint16_t lock_i);
|
||||||
|
|
||||||
|
#endif /* COIL_LOGIC_H_ */
|
||||||
186
firmware/logic/force.c
Normal file
186
firmware/logic/force.c
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
/**** Includes ****/
|
||||||
|
#include "force.h"
|
||||||
|
|
||||||
|
/**** Private definitions ****/
|
||||||
|
|
||||||
|
/**** Private constants ****/
|
||||||
|
static const int8_t BUTTONS_STEP = 10;
|
||||||
|
static const uint16_t BUTTON_HOLD_TIME = 250;
|
||||||
|
static const uint16_t MODE_HOLD_TIME = 500;
|
||||||
|
|
||||||
|
/**** Private variables ****/
|
||||||
|
static inputMode_t input_mode = IM_BUTTONS;
|
||||||
|
|
||||||
|
static uint8_t user_force = 0;
|
||||||
|
static uint8_t new_user_force = 0;
|
||||||
|
|
||||||
|
static brakeMode_t brake_mode = BM_OPEN;
|
||||||
|
static uint8_t new_brake_mode = 1;
|
||||||
|
|
||||||
|
/**** Private function declarations ****/
|
||||||
|
static uint8_t SaturatedAdd(uint8_t base, int8_t delta);
|
||||||
|
|
||||||
|
/**** Public function definitions ****/
|
||||||
|
inputMode_t Force_GetInputMode(void)
|
||||||
|
{
|
||||||
|
return input_mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Force_CfgInputMode(inputMode_t in_mode)
|
||||||
|
{
|
||||||
|
input_mode = in_mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Force_SetUserForce(uint8_t force)
|
||||||
|
{
|
||||||
|
if(force > 100) force = 100;
|
||||||
|
user_force = force;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Force_SetBrakeMode(uint8_t bmode)
|
||||||
|
{
|
||||||
|
brake_mode = bmode;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t Force_Update(inputs_t* inputs, analog_t* meas)
|
||||||
|
{
|
||||||
|
// Process user inputs
|
||||||
|
if(input_mode==IM_POT)
|
||||||
|
{
|
||||||
|
// Process potentiometer
|
||||||
|
if(meas->pot_voltage <= 500) user_force = 0;
|
||||||
|
else if(meas->pot_voltage >= 4500 ) user_force = 100;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uint16_t pot_u = meas->pot_voltage;
|
||||||
|
pot_u /= 50;
|
||||||
|
|
||||||
|
//Limit to 100
|
||||||
|
if(pot_u > 100) user_force = 100;
|
||||||
|
else if(pot_u < 10) user_force = 10;
|
||||||
|
else user_force = (uint8_t)pot_u;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Process +/- timer
|
||||||
|
if((inputs->down.is_active)&&(inputs->down.state_timer > BUTTON_HOLD_TIME))
|
||||||
|
{
|
||||||
|
inputs->down.is_new = 1;
|
||||||
|
inputs->down.state_timer = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
if((inputs->up.is_active)&&(inputs->up.state_timer > BUTTON_HOLD_TIME))
|
||||||
|
{
|
||||||
|
inputs->up.is_new = 1;
|
||||||
|
inputs->up.state_timer = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Process +/- logic
|
||||||
|
if((inputs->down.is_new)&&(inputs->down.is_active))
|
||||||
|
{
|
||||||
|
user_force = SaturatedAdd(user_force, -1 * BUTTONS_STEP);
|
||||||
|
new_user_force = 1;
|
||||||
|
}
|
||||||
|
else if((inputs->up.is_new)&&(inputs->up.is_active))
|
||||||
|
{
|
||||||
|
user_force = SaturatedAdd(user_force, BUTTONS_STEP);
|
||||||
|
new_user_force = 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
inputs->down.is_new = 0;
|
||||||
|
inputs->up.is_new = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process mode timer
|
||||||
|
if((inputs->mode.is_active)&&(inputs->mode.state_timer > MODE_HOLD_TIME))
|
||||||
|
{
|
||||||
|
inputs->mode.is_new = 1;
|
||||||
|
inputs->mode.state_timer = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Process mode logic
|
||||||
|
if((inputs->mode.is_new)&&(inputs->mode.is_active))
|
||||||
|
{
|
||||||
|
//Cycle mode
|
||||||
|
switch(brake_mode)
|
||||||
|
{
|
||||||
|
case BM_OPEN:
|
||||||
|
brake_mode = BM_KEEP;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BM_KEEP:
|
||||||
|
brake_mode = BM_LOCK;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BM_LOCK:
|
||||||
|
brake_mode = BM_OPEN;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
brake_mode = BM_OPEN;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
new_brake_mode = 1;
|
||||||
|
};
|
||||||
|
inputs->mode.is_new = 0;
|
||||||
|
|
||||||
|
|
||||||
|
// Determine next target force from inputs
|
||||||
|
if(inputs->handbrake.is_active)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if(inputs->brakes.is_active)
|
||||||
|
{
|
||||||
|
switch(brake_mode)
|
||||||
|
{
|
||||||
|
case BM_LOCK:
|
||||||
|
return 100;
|
||||||
|
|
||||||
|
case BM_KEEP:
|
||||||
|
return user_force;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return user_force;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t Force_IsNewUserForce(void)
|
||||||
|
{
|
||||||
|
return new_user_force;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Force_ResetNewUserForce(void)
|
||||||
|
{
|
||||||
|
new_user_force = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
brakeMode_t Force_GetBrakeMode(void)
|
||||||
|
{
|
||||||
|
return brake_mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t Force_IsNewBrakeMode(void)
|
||||||
|
{
|
||||||
|
return new_brake_mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Force_ResetNewBrakeMode(void)
|
||||||
|
{
|
||||||
|
new_brake_mode = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**** Private function definitions ****/
|
||||||
|
static uint8_t SaturatedAdd(uint8_t base, int8_t delta)
|
||||||
|
{
|
||||||
|
int16_t temp = (int16_t)base + delta;
|
||||||
|
if(temp < 0) return 0;
|
||||||
|
else if(temp >= 100) return 100;
|
||||||
|
else return (uint8_t)temp;
|
||||||
|
}
|
||||||
36
firmware/logic/force.h
Normal file
36
firmware/logic/force.h
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
#ifndef FORCE_LOGIC_H_
|
||||||
|
#define FORCE_LOGIC_H_
|
||||||
|
|
||||||
|
/**** Includes ****/
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "../devices/analog.h"
|
||||||
|
#include "../devices/inputs.h"
|
||||||
|
|
||||||
|
/**** Public definitions ****/
|
||||||
|
typedef enum {
|
||||||
|
BM_OPEN,
|
||||||
|
BM_KEEP,
|
||||||
|
BM_LOCK
|
||||||
|
} brakeMode_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
IM_BUTTONS,
|
||||||
|
IM_POT
|
||||||
|
} inputMode_t;
|
||||||
|
|
||||||
|
/**** Public function declarations ****/
|
||||||
|
void Force_CfgInputMode(inputMode_t in_mode);
|
||||||
|
inputMode_t Force_GetInputMode(void);
|
||||||
|
|
||||||
|
uint8_t Force_Update(inputs_t* inputs, analog_t* meas);
|
||||||
|
|
||||||
|
void Force_SetBrakeMode(uint8_t bmode);
|
||||||
|
brakeMode_t Force_GetBrakeMode(void);
|
||||||
|
uint8_t Force_IsNewBrakeMode(void);
|
||||||
|
void Force_ResetNewBrakeMode(void);
|
||||||
|
|
||||||
|
void Force_SetUserForce(uint8_t force);
|
||||||
|
uint8_t Force_IsNewUserForce(void);
|
||||||
|
void Force_ResetNewUserForce(void);
|
||||||
|
|
||||||
|
#endif /* FORCE_LOGIC_H_ */
|
||||||
184
firmware/logic/settings.c
Normal file
184
firmware/logic/settings.c
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
/**** Includes ****/
|
||||||
|
#include "settings.h"
|
||||||
|
|
||||||
|
/**** Private definitions ****/
|
||||||
|
|
||||||
|
/**** Private constants ****/
|
||||||
|
static const uint8_t addr_force = 0x01;
|
||||||
|
static const uint8_t addr_bmode = 0x02;
|
||||||
|
static const uint8_t addr_inmode = 0x03;
|
||||||
|
|
||||||
|
static const uint8_t addr_dsp_bright = 0x04;
|
||||||
|
static const uint8_t addr_dsp_dimm = 0x05;
|
||||||
|
|
||||||
|
static const uint8_t addr_lock_amps = 0x06;
|
||||||
|
|
||||||
|
/**** Private variables ****/
|
||||||
|
static uint16_t save_force_timer = 0;
|
||||||
|
static uint16_t save_bmode_timer = 0;
|
||||||
|
|
||||||
|
/**** Private function declarations ****/
|
||||||
|
|
||||||
|
/**** Public function definitions ****/
|
||||||
|
void Setings_Update(uint8_t is_new_force, uint8_t force, uint8_t is_new_bmode, brakeMode_t bmode)
|
||||||
|
{
|
||||||
|
if(is_new_force) save_force_timer = 5000;
|
||||||
|
|
||||||
|
if(is_new_bmode) save_bmode_timer = 5000;
|
||||||
|
|
||||||
|
if(save_force_timer)
|
||||||
|
{
|
||||||
|
save_force_timer--;
|
||||||
|
if(!save_force_timer)
|
||||||
|
{
|
||||||
|
// Save force setting
|
||||||
|
Setings_SaveForce(force);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
if(save_bmode_timer)
|
||||||
|
{
|
||||||
|
save_bmode_timer--;
|
||||||
|
if(!save_bmode_timer)
|
||||||
|
{
|
||||||
|
// Save mode setting
|
||||||
|
Setings_SaveBrakeMode(bmode);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Setings_SaveForce(uint8_t value)
|
||||||
|
{
|
||||||
|
MEM_Write8b(addr_force, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t Setings_GetForce(void)
|
||||||
|
{
|
||||||
|
uint8_t val = MEM_Read8b(addr_force);
|
||||||
|
if(val > 100) return 0;
|
||||||
|
else return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Setings_SaveBrakeMode(brakeMode_t bmode)
|
||||||
|
{
|
||||||
|
// Convert and save input mode setting
|
||||||
|
// Convert and save mode setting
|
||||||
|
uint8_t val = 0x00;
|
||||||
|
switch(bmode)
|
||||||
|
{
|
||||||
|
case BM_LOCK:
|
||||||
|
val = 'L';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BM_KEEP:
|
||||||
|
val = 'K';
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
val = 'O';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
MEM_Write8b(addr_bmode, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
brakeMode_t Setings_GetBrakeMode(void)
|
||||||
|
{
|
||||||
|
// Convert and return mode setting
|
||||||
|
uint8_t val = MEM_Read8b(addr_bmode);
|
||||||
|
switch(val)
|
||||||
|
{
|
||||||
|
case 'L':
|
||||||
|
return BM_LOCK;
|
||||||
|
|
||||||
|
case 'K':
|
||||||
|
return BM_KEEP;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return BM_OPEN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Setings_SaveInputMode(inputMode_t inmode)
|
||||||
|
{
|
||||||
|
// Convert and save input mode setting
|
||||||
|
uint8_t val = 0x00;
|
||||||
|
switch(inmode)
|
||||||
|
{
|
||||||
|
case IM_POT:
|
||||||
|
val = 'P';
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
val = 'B';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
MEM_Write8b(addr_inmode, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
inputMode_t Setings_GetInputMode(void)
|
||||||
|
{
|
||||||
|
// Convert and return input mode setting
|
||||||
|
uint8_t val = MEM_Read8b(addr_inmode);
|
||||||
|
switch(val)
|
||||||
|
{
|
||||||
|
case 'P':
|
||||||
|
return IM_POT;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return IM_BUTTONS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Setings_SaveDisplayBrigthLvl(uint8_t value)
|
||||||
|
{
|
||||||
|
MEM_Write8b(addr_dsp_bright, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t Setings_GetDisplayBrigthLvl(void)
|
||||||
|
{
|
||||||
|
uint8_t val = MEM_Read8b(addr_dsp_bright);
|
||||||
|
if(val > 100) return 100;
|
||||||
|
else return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Setings_SaveDisplayDimmLvl(uint8_t value)
|
||||||
|
{
|
||||||
|
MEM_Write8b(addr_dsp_dimm, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t Setings_GetDisplayDimmLvl(void)
|
||||||
|
{
|
||||||
|
uint8_t val = MEM_Read8b(addr_dsp_dimm);
|
||||||
|
if(val > 100) return 50;
|
||||||
|
else return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Setings_SaveLockCurrent(uint16_t value)
|
||||||
|
{
|
||||||
|
MEM_Write16b(addr_lock_amps, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t Setings_GetLockCurrent(void)
|
||||||
|
{
|
||||||
|
uint16_t val = MEM_Read16b(addr_lock_amps);
|
||||||
|
if(val > 6000) return 4500;
|
||||||
|
else return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Setings_SaveDefault(void)
|
||||||
|
{
|
||||||
|
Setings_SaveForce(0);
|
||||||
|
Setings_SaveBrakeMode(BM_OPEN);
|
||||||
|
Setings_SaveInputMode(IM_BUTTONS);
|
||||||
|
Setings_SaveDisplayBrigthLvl(100);
|
||||||
|
Setings_SaveDisplayDimmLvl(50);
|
||||||
|
Setings_SaveLockCurrent(4500);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**** Private function definitions ****/
|
||||||
34
firmware/logic/settings.h
Normal file
34
firmware/logic/settings.h
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
#ifndef SETTINGS_LOGIC_H_
|
||||||
|
#define SETTINGS_LOGIC_H_
|
||||||
|
|
||||||
|
/**** Includes ****/
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "../devices/memory.h"
|
||||||
|
#include "force.h"
|
||||||
|
|
||||||
|
/**** Public definitions ****/
|
||||||
|
|
||||||
|
/**** Public function declarations ****/
|
||||||
|
void Setings_Update(uint8_t is_new_force, uint8_t force, uint8_t is_new_bmode, brakeMode_t bmode);
|
||||||
|
|
||||||
|
void Setings_SaveForce(uint8_t value);
|
||||||
|
uint8_t Setings_GetForce(void);
|
||||||
|
|
||||||
|
void Setings_SaveBrakeMode(brakeMode_t bmode);
|
||||||
|
brakeMode_t Setings_GetBrakeMode(void);
|
||||||
|
|
||||||
|
void Setings_SaveInputMode(inputMode_t inmode);
|
||||||
|
inputMode_t Setings_GetInputMode(void);
|
||||||
|
|
||||||
|
void Setings_SaveDisplayBrigthLvl(uint8_t value);
|
||||||
|
uint8_t Setings_GetDisplayBrigthLvl(void);
|
||||||
|
|
||||||
|
void Setings_SaveDisplayDimmLvl(uint8_t value);
|
||||||
|
uint8_t Setings_GetDisplayDimmLvl(void);
|
||||||
|
|
||||||
|
void Setings_SaveLockCurrent(uint16_t value);
|
||||||
|
uint16_t Setings_GetLockCurrent(void);
|
||||||
|
|
||||||
|
void Setings_SaveDefault(void);
|
||||||
|
|
||||||
|
#endif /* SETTINGS_LOGIC_H_ */
|
||||||
170
firmware/main.c
Normal file
170
firmware/main.c
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
/**** Includes ****/
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "devices/config.h"
|
||||||
|
#include "devices/analog.h"
|
||||||
|
#include "devices/inputs.h"
|
||||||
|
#include "devices/memory.h"
|
||||||
|
|
||||||
|
#include "drivers/output.h"
|
||||||
|
#include "drivers/display.h"
|
||||||
|
|
||||||
|
#include "logic/force.h"
|
||||||
|
#include "logic/coil.h"
|
||||||
|
#include "logic/settings.h"
|
||||||
|
|
||||||
|
/**** Private definitions ****/
|
||||||
|
|
||||||
|
/**** Private constants ****/
|
||||||
|
|
||||||
|
/**** Private variables ****/
|
||||||
|
inputs_t inputs;
|
||||||
|
analog_t analog;
|
||||||
|
|
||||||
|
/**** Private function declarations ****/
|
||||||
|
void Setup(void);
|
||||||
|
void GatherData(uint8_t times);
|
||||||
|
|
||||||
|
/**** Public function definitions ****/
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
Setup();
|
||||||
|
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
// Read all inputs
|
||||||
|
GatherData(1);
|
||||||
|
|
||||||
|
// Process force logic
|
||||||
|
uint8_t force = Force_Update(&inputs, &analog);
|
||||||
|
|
||||||
|
// Save values
|
||||||
|
uint8_t new_bmode = Force_IsNewBrakeMode();
|
||||||
|
uint8_t new_force = Force_IsNewUserForce();
|
||||||
|
if(Force_GetInputMode()==IM_POT) new_force = 0;
|
||||||
|
Setings_Update(new_force, force, new_bmode, Force_GetBrakeMode());
|
||||||
|
|
||||||
|
// Set coil current target
|
||||||
|
Coil_SetTarget_Force(force);
|
||||||
|
|
||||||
|
// Calculate next target voltage
|
||||||
|
uint16_t next_u = Coil_Update(&analog);
|
||||||
|
|
||||||
|
// Set next output voltage
|
||||||
|
Output_SetTarget(next_u);
|
||||||
|
|
||||||
|
// Update output
|
||||||
|
Output_Update(&analog);
|
||||||
|
|
||||||
|
|
||||||
|
// Display logic
|
||||||
|
if(Output_GetOutputState()==O_FAULTED)
|
||||||
|
{
|
||||||
|
// Show fault code
|
||||||
|
Display_SetLock(0);
|
||||||
|
Display_SetImage(0x33);
|
||||||
|
}
|
||||||
|
else if(Force_IsNewBrakeMode())
|
||||||
|
{
|
||||||
|
Display_SetLock(0);
|
||||||
|
switch(Force_GetBrakeMode())
|
||||||
|
{
|
||||||
|
case BM_LOCK:
|
||||||
|
Display_SetImage(0x38);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BM_KEEP:
|
||||||
|
Display_SetImage(0x1E);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Display_SetImage(0x07);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Display_SetLock(1000);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Display_SetPercent(force, DOT10);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update display
|
||||||
|
Display_Update(&inputs);
|
||||||
|
|
||||||
|
// Reset new flags
|
||||||
|
Force_ResetNewBrakeMode();
|
||||||
|
Force_ResetNewUserForce();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**** Private function definitions ****/
|
||||||
|
void Setup(void)
|
||||||
|
{
|
||||||
|
// Initialize low level hardware
|
||||||
|
Init_HW();
|
||||||
|
|
||||||
|
// Prime EEPROM
|
||||||
|
//Setings_SaveDefault();
|
||||||
|
|
||||||
|
// Configure inputs
|
||||||
|
Inputs_DefInit(&inputs);
|
||||||
|
|
||||||
|
inputs.handbrake.cfg.act_level = HIGH;
|
||||||
|
inputs.handbrake.cfg.dbnc_treshold = 10;
|
||||||
|
|
||||||
|
inputs.brakes.cfg.act_level = LOW;
|
||||||
|
inputs.brakes.cfg.dbnc_treshold = 20;
|
||||||
|
|
||||||
|
inputs.dimm.cfg.act_level = LOW;
|
||||||
|
inputs.dimm.cfg.dbnc_treshold = 20;
|
||||||
|
|
||||||
|
inputs.up.cfg.act_level = LOW;
|
||||||
|
inputs.up.cfg.dbnc_treshold = 20;
|
||||||
|
|
||||||
|
inputs.down.cfg.act_level = LOW;
|
||||||
|
inputs.down.cfg.dbnc_treshold = 20;
|
||||||
|
|
||||||
|
inputs.mode.cfg.act_level = LOW;
|
||||||
|
inputs.mode.cfg.dbnc_treshold = 20;
|
||||||
|
|
||||||
|
Inputs_SetHanbrakePullUp(0);
|
||||||
|
|
||||||
|
// Configure display
|
||||||
|
Display_CfgBacklight(100,50);
|
||||||
|
// Show startup display
|
||||||
|
Display_SetImage(0xFF);
|
||||||
|
Display_Update(&inputs);
|
||||||
|
|
||||||
|
// Configure force logic
|
||||||
|
Force_CfgInputMode(IM_POT); //IM_BUTTONS IM_POT
|
||||||
|
|
||||||
|
// Restore saved force
|
||||||
|
Force_SetUserForce(Setings_GetForce());
|
||||||
|
|
||||||
|
// Restore saved brake mode
|
||||||
|
Force_SetBrakeMode(Setings_GetBrakeMode());
|
||||||
|
|
||||||
|
// Prime analog channels
|
||||||
|
GatherData(100);
|
||||||
|
|
||||||
|
// Show default display
|
||||||
|
Display_SetImage(0x01);
|
||||||
|
Display_Update(&inputs);
|
||||||
|
|
||||||
|
// Enable output
|
||||||
|
Output_Enable();
|
||||||
|
Output_SetTarget(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GatherData(uint8_t times)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
Analog_UpdateAll(&analog);
|
||||||
|
Inputs_UpdateAll(&inputs);
|
||||||
|
if(times) times--;
|
||||||
|
}
|
||||||
|
while(times);
|
||||||
|
}
|
||||||
22
firmware/uDCCD_Controller.atsln
Normal file
22
firmware/uDCCD_Controller.atsln
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Atmel Studio Solution File, Format Version 11.00
|
||||||
|
VisualStudioVersion = 14.0.23107.0
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{54F91283-7BC4-4236-8FF9-10F437C3AD48}") = "uDCCD_Controller", "uDCCD_Controller.cproj", "{DCE6C7E3-EE26-4D79-826B-08594B9AD897}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|AVR = Debug|AVR
|
||||||
|
Release|AVR = Release|AVR
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{DCE6C7E3-EE26-4D79-826B-08594B9AD897}.Debug|AVR.ActiveCfg = Debug|AVR
|
||||||
|
{DCE6C7E3-EE26-4D79-826B-08594B9AD897}.Debug|AVR.Build.0 = Debug|AVR
|
||||||
|
{DCE6C7E3-EE26-4D79-826B-08594B9AD897}.Release|AVR.ActiveCfg = Release|AVR
|
||||||
|
{DCE6C7E3-EE26-4D79-826B-08594B9AD897}.Release|AVR.Build.0 = Release|AVR
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
86
firmware/uDCCD_Controller.componentinfo.xml
Normal file
86
firmware/uDCCD_Controller.componentinfo.xml
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Store xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="AtmelPackComponentManagement">
|
||||||
|
<ProjectComponents>
|
||||||
|
<ProjectComponent z:Id="i1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
|
||||||
|
<CApiVersion></CApiVersion>
|
||||||
|
<CBundle></CBundle>
|
||||||
|
<CClass>Device</CClass>
|
||||||
|
<CGroup>Startup</CGroup>
|
||||||
|
<CSub></CSub>
|
||||||
|
<CVariant></CVariant>
|
||||||
|
<CVendor>Atmel</CVendor>
|
||||||
|
<CVersion>1.7.0</CVersion>
|
||||||
|
<DefaultRepoPath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs</DefaultRepoPath>
|
||||||
|
<DependentComponents xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
|
||||||
|
<Description></Description>
|
||||||
|
<Files xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
|
||||||
|
<d4p1:anyType i:type="FileInfo">
|
||||||
|
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.7.374\include\</AbsolutePath>
|
||||||
|
<Attribute></Attribute>
|
||||||
|
<Category>include</Category>
|
||||||
|
<Condition>C</Condition>
|
||||||
|
<FileContentHash i:nil="true" />
|
||||||
|
<FileVersion></FileVersion>
|
||||||
|
<Name>include/</Name>
|
||||||
|
<SelectString></SelectString>
|
||||||
|
<SourcePath></SourcePath>
|
||||||
|
</d4p1:anyType>
|
||||||
|
<d4p1:anyType i:type="FileInfo">
|
||||||
|
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.7.374\include\avr\iom328pb.h</AbsolutePath>
|
||||||
|
<Attribute></Attribute>
|
||||||
|
<Category>header</Category>
|
||||||
|
<Condition>C</Condition>
|
||||||
|
<FileContentHash>TU9y07FA4IWGxznrvGv9rQ==</FileContentHash>
|
||||||
|
<FileVersion></FileVersion>
|
||||||
|
<Name>include/avr/iom328pb.h</Name>
|
||||||
|
<SelectString></SelectString>
|
||||||
|
<SourcePath></SourcePath>
|
||||||
|
</d4p1:anyType>
|
||||||
|
<d4p1:anyType i:type="FileInfo">
|
||||||
|
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.7.374\templates\main.c</AbsolutePath>
|
||||||
|
<Attribute>template</Attribute>
|
||||||
|
<Category>source</Category>
|
||||||
|
<Condition>C Exe</Condition>
|
||||||
|
<FileContentHash>YLr2MkKo6ZooP7MhARWYNA==</FileContentHash>
|
||||||
|
<FileVersion></FileVersion>
|
||||||
|
<Name>templates/main.c</Name>
|
||||||
|
<SelectString>Main file (.c)</SelectString>
|
||||||
|
<SourcePath></SourcePath>
|
||||||
|
</d4p1:anyType>
|
||||||
|
<d4p1:anyType i:type="FileInfo">
|
||||||
|
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.7.374\templates\main.cpp</AbsolutePath>
|
||||||
|
<Attribute>template</Attribute>
|
||||||
|
<Category>source</Category>
|
||||||
|
<Condition>C Exe</Condition>
|
||||||
|
<FileContentHash>mkKaE95TOoATsuBGv6jmxg==</FileContentHash>
|
||||||
|
<FileVersion></FileVersion>
|
||||||
|
<Name>templates/main.cpp</Name>
|
||||||
|
<SelectString>Main file (.cpp)</SelectString>
|
||||||
|
<SourcePath></SourcePath>
|
||||||
|
</d4p1:anyType>
|
||||||
|
<d4p1:anyType i:type="FileInfo">
|
||||||
|
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.7.374\gcc\dev\atmega328pb</AbsolutePath>
|
||||||
|
<Attribute></Attribute>
|
||||||
|
<Category>libraryPrefix</Category>
|
||||||
|
<Condition>GCC</Condition>
|
||||||
|
<FileContentHash i:nil="true" />
|
||||||
|
<FileVersion></FileVersion>
|
||||||
|
<Name>gcc/dev/atmega328pb</Name>
|
||||||
|
<SelectString></SelectString>
|
||||||
|
<SourcePath></SourcePath>
|
||||||
|
</d4p1:anyType>
|
||||||
|
</Files>
|
||||||
|
<PackName>ATmega_DFP</PackName>
|
||||||
|
<PackPath>C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.7.374/Atmel.ATmega_DFP.pdsc</PackPath>
|
||||||
|
<PackVersion>1.7.374</PackVersion>
|
||||||
|
<PresentInProject>true</PresentInProject>
|
||||||
|
<ReferenceConditionId>ATmega328PB</ReferenceConditionId>
|
||||||
|
<RteComponents xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
|
||||||
|
<d4p1:string></d4p1:string>
|
||||||
|
</RteComponents>
|
||||||
|
<Status>Resolved</Status>
|
||||||
|
<VersionMode>Fixed</VersionMode>
|
||||||
|
<IsComponentInAtProject>true</IsComponentInAtProject>
|
||||||
|
</ProjectComponent>
|
||||||
|
</ProjectComponents>
|
||||||
|
</Store>
|
||||||
231
firmware/uDCCD_Controller.cproj
Normal file
231
firmware/uDCCD_Controller.cproj
Normal file
@@ -0,0 +1,231 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="14.0">
|
||||||
|
<PropertyGroup>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<ProjectVersion>7.0</ProjectVersion>
|
||||||
|
<ToolchainName>com.Atmel.AVRGCC8.C</ToolchainName>
|
||||||
|
<ProjectGuid>dce6c7e3-ee26-4d79-826b-08594b9ad897</ProjectGuid>
|
||||||
|
<avrdevice>ATmega328PB</avrdevice>
|
||||||
|
<avrdeviceseries>none</avrdeviceseries>
|
||||||
|
<OutputType>Executable</OutputType>
|
||||||
|
<Language>C</Language>
|
||||||
|
<OutputFileName>$(MSBuildProjectName)</OutputFileName>
|
||||||
|
<OutputFileExtension>.elf</OutputFileExtension>
|
||||||
|
<OutputDirectory>$(MSBuildProjectDirectory)\$(Configuration)</OutputDirectory>
|
||||||
|
<AssemblyName>uDCCD_Controller</AssemblyName>
|
||||||
|
<Name>uDCCD_Controller</Name>
|
||||||
|
<RootNamespace>uDCCD_Controller</RootNamespace>
|
||||||
|
<ToolchainFlavour>Native</ToolchainFlavour>
|
||||||
|
<KeepTimersRunning>true</KeepTimersRunning>
|
||||||
|
<OverrideVtor>false</OverrideVtor>
|
||||||
|
<CacheFlash>true</CacheFlash>
|
||||||
|
<ProgFlashFromRam>true</ProgFlashFromRam>
|
||||||
|
<RamSnippetAddress>0x20000000</RamSnippetAddress>
|
||||||
|
<UncachedRange />
|
||||||
|
<preserveEEPROM>true</preserveEEPROM>
|
||||||
|
<OverrideVtorValue>exception_table</OverrideVtorValue>
|
||||||
|
<BootSegment>2</BootSegment>
|
||||||
|
<ResetRule>0</ResetRule>
|
||||||
|
<eraseonlaunchrule>0</eraseonlaunchrule>
|
||||||
|
<EraseKey />
|
||||||
|
<AsfFrameworkConfig>
|
||||||
|
<framework-data>
|
||||||
|
<options />
|
||||||
|
<configurations />
|
||||||
|
<files />
|
||||||
|
<documentation help="" />
|
||||||
|
<offline-documentation help="" />
|
||||||
|
<dependencies>
|
||||||
|
<content-extension eid="atmel.asf" uuidref="Atmel.ASF" version="3.42.0" />
|
||||||
|
</dependencies>
|
||||||
|
</framework-data>
|
||||||
|
</AsfFrameworkConfig>
|
||||||
|
<avrtool>com.atmel.avrdbg.tool.atmelice</avrtool>
|
||||||
|
<avrtoolserialnumber>J42700001490</avrtoolserialnumber>
|
||||||
|
<avrdeviceexpectedsignature>0x1E9516</avrdeviceexpectedsignature>
|
||||||
|
<com_atmel_avrdbg_tool_atmelice>
|
||||||
|
<ToolOptions>
|
||||||
|
<InterfaceProperties>
|
||||||
|
<IspClock>125000</IspClock>
|
||||||
|
</InterfaceProperties>
|
||||||
|
<InterfaceName>ISP</InterfaceName>
|
||||||
|
</ToolOptions>
|
||||||
|
<ToolType>com.atmel.avrdbg.tool.atmelice</ToolType>
|
||||||
|
<ToolNumber>J42700001490</ToolNumber>
|
||||||
|
<ToolName>Atmel-ICE</ToolName>
|
||||||
|
</com_atmel_avrdbg_tool_atmelice>
|
||||||
|
<avrtoolinterface>ISP</avrtoolinterface>
|
||||||
|
<avrtoolinterfaceclock>125000</avrtoolinterfaceclock>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||||
|
<ToolchainSettings>
|
||||||
|
<AvrGcc>
|
||||||
|
<avrgcc.common.Device>-mmcu=atmega328pb -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.7.374\gcc\dev\atmega328pb"</avrgcc.common.Device>
|
||||||
|
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
|
||||||
|
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
|
||||||
|
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
|
||||||
|
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
|
||||||
|
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
|
||||||
|
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
|
||||||
|
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
|
||||||
|
<avrgcc.compiler.symbols.DefSymbols>
|
||||||
|
<ListValues>
|
||||||
|
<Value>NDEBUG</Value>
|
||||||
|
</ListValues>
|
||||||
|
</avrgcc.compiler.symbols.DefSymbols>
|
||||||
|
<avrgcc.compiler.directories.IncludePaths>
|
||||||
|
<ListValues>
|
||||||
|
<Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.7.374\include\</Value>
|
||||||
|
</ListValues>
|
||||||
|
</avrgcc.compiler.directories.IncludePaths>
|
||||||
|
<avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level>
|
||||||
|
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
|
||||||
|
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
|
||||||
|
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
|
||||||
|
<avrgcc.linker.libraries.Libraries>
|
||||||
|
<ListValues>
|
||||||
|
<Value>libm</Value>
|
||||||
|
</ListValues>
|
||||||
|
</avrgcc.linker.libraries.Libraries>
|
||||||
|
<avrgcc.assembler.general.IncludePaths>
|
||||||
|
<ListValues>
|
||||||
|
<Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.7.374\include\</Value>
|
||||||
|
</ListValues>
|
||||||
|
</avrgcc.assembler.general.IncludePaths>
|
||||||
|
</AvrGcc>
|
||||||
|
</ToolchainSettings>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||||
|
<ToolchainSettings>
|
||||||
|
<AvrGcc>
|
||||||
|
<avrgcc.common.Device>-mmcu=atmega328pb -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.7.374\gcc\dev\atmega328pb"</avrgcc.common.Device>
|
||||||
|
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
|
||||||
|
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
|
||||||
|
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
|
||||||
|
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
|
||||||
|
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
|
||||||
|
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
|
||||||
|
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
|
||||||
|
<avrgcc.compiler.symbols.DefSymbols>
|
||||||
|
<ListValues>
|
||||||
|
<Value>DEBUG</Value>
|
||||||
|
</ListValues>
|
||||||
|
</avrgcc.compiler.symbols.DefSymbols>
|
||||||
|
<avrgcc.compiler.directories.IncludePaths>
|
||||||
|
<ListValues>
|
||||||
|
<Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.7.374\include\</Value>
|
||||||
|
</ListValues>
|
||||||
|
</avrgcc.compiler.directories.IncludePaths>
|
||||||
|
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
|
||||||
|
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
|
||||||
|
<avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel>
|
||||||
|
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
|
||||||
|
<avrgcc.linker.libraries.Libraries>
|
||||||
|
<ListValues>
|
||||||
|
<Value>libm</Value>
|
||||||
|
</ListValues>
|
||||||
|
</avrgcc.linker.libraries.Libraries>
|
||||||
|
<avrgcc.assembler.general.IncludePaths>
|
||||||
|
<ListValues>
|
||||||
|
<Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.7.374\include\</Value>
|
||||||
|
</ListValues>
|
||||||
|
</avrgcc.assembler.general.IncludePaths>
|
||||||
|
<avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel>
|
||||||
|
</AvrGcc>
|
||||||
|
</ToolchainSettings>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="devices\analog.c">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="devices\analog.h">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="devices\common\level.h">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="devices\config.c">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="devices\config.h">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="devices\led_display.c">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="devices\led_display.h">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="devices\filter_iir_lpf.c">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="devices\filter_iir_lpf.h">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="devices\halfbridge.c">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="devices\halfbridge.h">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="devices\hal\udccd_r7_hal.c">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="devices\hal\udccd_hal.h">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="devices\inputs.c">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="devices\inputs.h">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="devices\memory.c">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="devices\memory.h">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="drivers\display.c">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="drivers\display.h">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="drivers\output.c">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="drivers\output.h">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="logic\coil.c">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="logic\coil.h">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="logic\force.c">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="logic\force.h">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="logic\settings.c">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="logic\settings.h">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="main.c">
|
||||||
|
<SubType>compile</SubType>
|
||||||
|
</Compile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="devices" />
|
||||||
|
<Folder Include="devices\hal" />
|
||||||
|
<Folder Include="devices\common" />
|
||||||
|
<Folder Include="drivers" />
|
||||||
|
<Folder Include="logic" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(AVRSTUDIO_EXE_PATH)\\Vs\\Compiler.targets" />
|
||||||
|
</Project>
|
||||||
Reference in New Issue
Block a user