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
|
||||
History/
|
||||
__Previews/
|
||||
@@ -9,3 +29,4 @@ Project Logs for*
|
||||
# Ignore list for Generated output files
|
||||
*.step
|
||||
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