Motor Driver Evaluation Kit NEVB-MTR1-t01-1.3.1
Firmware for NEVB-MTR1-KIT1 for trapezoidal control of BLDC motors using Hall-effect sensors
Loading...
Searching...
No Matches
config.h
Go to the documentation of this file.
1/* This file has been prepared for Doxygen automatic documentation generation.*/
21
22#ifndef _MAIN_H_
23#define _MAIN_H_
24
26#define __AVR_ATmega32U4__ 1
27
28// Include main Arduino library for basic Arduino functions
29#include <Arduino.h>
30
31// Include AVR input/output definitions for low-level hardware control
32#include <avr/io.h>
33
34// Define ISR macro for IntelliSense, else include AVR interrupt handling
35// library
36#ifdef __INTELLISENSE__
37#define ISR(vector) void vector(void)
38#else
39#include <avr/interrupt.h>
40#endif
41
42// Define __LPM macro for IntelliSense, else include AVR program space utility
43// library
44#ifdef __INTELLISENSE__
45#define __LPM(x) 0
46#else
47#include <avr/pgmspace.h>
48#endif
49
50// Include math definitions
51#include <math.h>
52
53// Include standard integer type definitions
54#include <stdint.h>
55
65
74
85#define MOTOR_POLES 8
86
99#define F_MOSFET_MAX 100000UL
100
115#define F_MOSFET_MIN 7183UL
116
157#define F_MOSFET 20000UL
158#if (F_MOSFET > F_MOSFET_MAX)
159#error "ADVISORY WARNING: F_MOSFET should not be set above F_MOSFET_MAX."
160#endif
161#if (F_MOSFET < F_MOSFET_MIN)
162#error "ADVISORY WARNING: F_MOSFET should not be set below F_MOSFET_MIN."
163#endif
164
186#define DEAD_TIME 350UL
187#if DEAD_TIME < 350
188#error "ADVISORY WARNING: DEAD_TIME should not be set below 350 ns. If you want to still continue, please uncomment and compile again."
189#endif
190
201#define HALL_PULLUP_ENABLE TRUE
202
220#define EMULATE_HALL FALSE
221
236#define TIM3_FREQ 200UL
237
246#define COMMUTATION_TICKS_STOPPED 6000
247
259#define TURN_OFF_MODE TURN_OFF_MODE_RAMP
260
276#define IPHASE_GAIN 20
277
294#define IPHASE_SENSE_RESISTOR 2500
295
314#define IBUS_GAIN 50
315
332#define IBUS_SENSE_RESISTOR 4000
333
367#define IBUS_WARNING_THRESHOLD 307
368
406#define IBUS_ERROR_THRESHOLD 410
407
419#define IBUS_FAULT_ENABLE TRUE
420
433#define SPEED_CONTROL_METHOD SPEED_CONTROL_OPEN_LOOP
434
448#define SPEED_CONTROLLER_TIME_BASE 200
449
469#define SPEED_CONTROLLER_MAX_DELTA 1
470
490#define SPEED_CONTROLLER_MAX_SPEED 400
491
509#define PID_K_P 100
510
528#define PID_K_I 10
529
547#define PID_K_D_ENABLE TRUE
548
566#define PID_K_D 0
567
594#define PID_MAX_I_TERM 100000L
595
615#define PID_OUTPUT_MAX 200
616
635#define VBUS_RTOP 100000
636
655#define VBUS_RBOTTOM 6200
656
692#define VBUS_MIN_THRESHOLD 96
693
719#define WAIT_FOR_BOARD TRUE
720#if (WAIT_FOR_BOARD == FALSE) && (IBUS_FAULT_ENABLE == TRUE)
721#warning "CONFIG WARNING: IBUS_FAULT_ENABLE is TRUE while WAIT_FOR_BOARD is FALSE - IBUS ADC may float when inverter not connected, causing false OC faults"
722#endif
723
730#define REMOTE_DEBUG_MODE FALSE
731
733
742
743// Boolean values
745#define FALSE 0
747#define TRUE 1
748
750#define F_HST 64000000UL
751
752// PWM pin definitions
754#define AH_PIN PB6
756#define BH_PIN PC7
758#define CH_PIN PD7
760#define AL_PIN PB5
762#define BL_PIN PC6
764#define CL_PIN PD6
765
766// PWM PORT patterns
768#define PWM_PATTERN_PORTB ((1 << AH_PIN) | (1 << AL_PIN))
770#define PWM_PATTERN_PORTC ((1 << BH_PIN) | (1 << BL_PIN))
772#define PWM_PATTERN_PORTD ((1 << CH_PIN) | (1 << CL_PIN))
775#define OC_ENABLE_PORTB ((1 << OC4OE3) | (1 << OC4OE2))
778#define OC_ENABLE_PORTC ((1 << OC4OE1) | (1 << OC4OE0))
781#define OC_ENABLE_PORTD ((1 << OC4OE5) | (1 << OC4OE4))
782
783// Direction macro definitions
785#define DIRECTION_FORWARD 0
787#define DIRECTION_REVERSE 1
789#define DIRECTION_UNKNOWN 3
790
791// Hall pins definitions
793#define HALL_PIN PINB
795#define H1_PIN PB1
797#define H2_PIN PB2
799#define H3_PIN PB3
800
801// ADC ADMUX selections
804#define ADC_MUX_L_SPEED ADC_MUX_L_ADC4
807#define ADC_MUX_H_SPEED ADC_MUX_H_ADC4
809#define ADC_MUX_L_IBUS ADC_MUX_L_ADC5
811#define ADC_MUX_H_IBUS ADC_MUX_H_ADC5
813#define ADC_MUX_L_IPHASE_U ADC_MUX_L_ADC1
815#define ADC_MUX_H_IPHASE_U ADC_MUX_H_ADC1
817#define ADC_MUX_L_IPHASE_V ADC_MUX_L_ADC7
819#define ADC_MUX_H_IPHASE_V ADC_MUX_H_ADC7
821#define ADC_MUX_L_IPHASE_W ADC_MUX_L_ADC0
823#define ADC_MUX_H_IPHASE_W ADC_MUX_H_ADC0
825#define ADC_MUX_L_VBUSVREF ADC_MUX_L_ADC6
827#define ADC_MUX_H_VBUSVREF ADC_MUX_H_ADC6
828
829// ADC configurations
831#define ADC_PRESCALER ADC_PRESCALER_DIV_128
833#define ADC_REFERENCE_VOLTAGE ADC_REFERENCE_VOLTAGE_VCC
835#define ADC_TRIGGER ADC_TRIGGER_TIMER0_OVF
836
837// Input pin definitions
839#define DIRECTION_COMMAND_PIN PD2
841#define ENABLE_PIN PD0
843#define REMOTE_PIN PD3
845#define IBUS_PIN PF5
846
847// Speed Input Source definitions (only during remote mode)
849#define SPEED_INPUT_SOURCE_LOCAL 0
851#define SPEED_INPUT_SOURCE_REMOTE 1
852
853// Fault pin definitions
855#define FAULT_PIN_1 PD4
857#define FAULT_PIN_2 PB4
859#define FAULT_PIN_3 PB7
860
861// Waveform macro definitions
863#define WAVEFORM_BLOCK_COMMUTATION 0
865#define WAVEFORM_UNDEFINED 3
866
867// Turn off mode macro definitions
869#define TURN_OFF_MODE_COAST 0
871#define TURN_OFF_MODE_RAMP 1
872
873// Speed control macro definitions
875#define SPEED_CONTROL_OPEN_LOOP 0
877#define SPEED_CONTROL_CLOSED_LOOP 1
878
891#define SPEED_CONTROLLER_MAX_INPUT 255
892
894#define CHOOSE_TIM4_PRESCALER(tim4Freq) ((tim4Freq) < 15625 ? 4 : ((tim4Freq) < 31250 ? 2 : 1))
895
912#define CHOOSE_DT_PRESCALER(deadTime) \
913 ((deadTime) <= 234 ? 1 : (deadTime) <= 468 ? 2 \
914 : (deadTime) <= 937 ? 4 \
915 : (deadTime) <= 1875 ? 8 \
916 : 0)
917
929#if defined(__INTELLISENSE__) || defined(__DOXYGEN__)
930#define FORCE_INLINE inline
931#else
932#define FORCE_INLINE inline __attribute__((always_inline))
933#endif
934
945#if defined(__INTELLISENSE__) || defined(__DOXYGEN__)
946#define FAST_ACCESS(register_address)
947#else
948#define FAST_ACCESS(register_address) __attribute__((address(register_address)))
949#endif
950
951#ifdef __INTELLISENSE__
961#define sei() ((void)0)
962
972#define cli() ((void)0)
973#endif
974
983#define PLL_POSTSCALER_OFF ((0 << PLLTM1) | (0 << PLLTM0))
985#define PLL_POSTSCALER_DIV_1_0 ((0 << PLLTM1) | (1 << PLLTM0))
987#define PLL_POSTSCALER_DIV_1_5 ((1 << PLLTM1) | (0 << PLLTM0))
989#define PLL_POSTSCALER_DIV_2_0 ((1 << PLLTM1) | (1 << PLLTM0))
991
999#define DT_PRESCALER_DIV_1 ((0 << DTPS41) | (0 << DTPS40))
1001#define DT_PRESCALER_DIV_2 ((0 << DTPS41) | (1 << DTPS40))
1003#define DT_PRESCALER_DIV_4 ((1 << DTPS41) | (0 << DTPS40))
1005#define DT_PRESCALER_DIV_8 ((1 << DTPS41) | (1 << DTPS40))
1007
1016#define TIM1_CLOCK_OFF ((0 << CS12) | (0 << CS11) | (0 << CS10))
1018#define TIM1_CLOCK_DIV_1 ((0 << CS12) | (0 << CS11) | (1 << CS10))
1020#define TIM1_CLOCK_DIV_8 ((0 << CS12) | (1 << CS11) | (0 << CS10))
1022#define TIM1_CLOCK_DIV_64 ((0 << CS12) | (1 << CS11) | (1 << CS10))
1024#define TIM1_CLOCK_DIV_256 ((1 << CS12) | (0 << CS11) | (0 << CS10))
1026#define TIM1_CLOCK_DIV_1024 ((1 << CS12) | (0 << CS11) | (1 << CS10))
1028#define TIM1_CLOCK_EXT_FALLING ((1 << CS12) | (1 << CS11) | (0 << CS10))
1030#define TIM1_CLOCK_EXT_RISING ((1 << CS12) | (1 << CS11) | (1 << CS10))
1032
1040#define TIM4_PRESCALER_OFF ((0 << CS43) | (0 << CS42) | (0 << CS41) | (0 << CS40))
1042#define TIM4_PRESCALER_DIV_1 ((0 << CS43) | (0 << CS42) | (0 << CS41) | (1 << CS40))
1044#define TIM4_PRESCALER_DIV_2 ((0 << CS43) | (0 << CS42) | (1 << CS41) | (0 << CS40))
1046#define TIM4_PRESCALER_DIV_4 ((0 << CS43) | (0 << CS42) | (1 << CS41) | (1 << CS40))
1048
1057#define ADC_MUX_L_BITS ((1 << MUX4) | (1 << MUX3) | (1 << MUX2) | (1 << MUX1) | (1 << MUX0))
1059#define ADC_MUX_H_BITS (1 << MUX5)
1061#define ADC_MUX_L_ADC0 ((0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (0 << MUX0))
1063#define ADC_MUX_H_ADC0 (0 << MUX5)
1065#define ADC_MUX_L_ADC1 ((0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (1 << MUX0))
1067#define ADC_MUX_H_ADC1 (0 << MUX5)
1069#define ADC_MUX_L_ADC4 ((0 << MUX4) | (0 << MUX3) | (1 << MUX2) | (0 << MUX1) | (0 << MUX0))
1071#define ADC_MUX_H_ADC4 (0 << MUX5)
1073#define ADC_MUX_L_ADC5 ((0 << MUX4) | (0 << MUX3) | (1 << MUX2) | (0 << MUX1) | (1 << MUX0))
1075#define ADC_MUX_H_ADC5 (0 << MUX5)
1077#define ADC_MUX_L_ADC6 ((0 << MUX4) | (0 << MUX3) | (1 << MUX2) | (1 << MUX1) | (0 << MUX0))
1079#define ADC_MUX_H_ADC6 (0 << MUX5)
1081#define ADC_MUX_L_ADC7 ((0 << MUX4) | (0 << MUX3) | (1 << MUX2) | (1 << MUX1) | (1 << MUX0))
1083#define ADC_MUX_H_ADC7 (0 << MUX5)
1085#define ADC_MUX_L_ADC8 ((0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (0 << MUX0))
1087#define ADC_MUX_H_ADC8 (1 << MUX5)
1089#define ADC_MUX_L_ADC9 ((0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (1 << MUX0))
1091#define ADC_MUX_H_ADC9 (1 << MUX5)
1093#define ADC_MUX_L_ADC10 ((0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (1 << MUX1) | (0 << MUX0))
1095#define ADC_MUX_H_ADC10 (1 << MUX5)
1097#define ADC_MUX_L_ADC11 ((0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (1 << MUX1) | (1 << MUX0))
1099#define ADC_MUX_H_ADC11 (1 << MUX5)
1101#define ADC_MUX_L_ADC12 ((0 << MUX4) | (0 << MUX3) | (1 << MUX2) | (0 << MUX1) | (0 << MUX0))
1103#define ADC_MUX_H_ADC12 (1 << MUX5)
1105#define ADC_MUX_L_ADC13 ((0 << MUX4) | (0 << MUX3) | (1 << MUX2) | (0 << MUX1) | (1 << MUX0))
1107#define ADC_MUX_H_ADC13 (1 << MUX5)
1109#define ADC_MUX_L_TEMP_SENSOR ((0 << MUX4) | (0 << MUX3) | (1 << MUX2) | (1 << MUX1) | (1 << MUX0))
1111#define ADC_MUX_H_TEMP_SENSOR (1 << MUX5)
1113#define ADC_MUX_L_1V1 ((1 << MUX4) | (1 << MUX3) | (1 << MUX2) | (1 << MUX1) | (0 << MUX0))
1115#define ADC_MUX_H_1V1 (0 << MUX5)
1117#define ADC_MUX_L_0V ((1 << MUX4) | (1 << MUX3) | (1 << MUX2) | (1 << MUX1) | (1 << MUX0))
1119#define ADC_MUX_H_0V (0 << MUX5)
1121
1129#define ADC_PRESCALER_DIV_2 ((0 << ADPS2) | (0 << ADPS1) | (0 << ADPS0))
1131#define ADC_PRESCALER_DIV_4 ((0 << ADPS2) | (1 << ADPS1) | (0 << ADPS0))
1133#define ADC_PRESCALER_DIV_8 ((0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0))
1135#define ADC_PRESCALER_DIV_16 ((1 << ADPS2) | (0 << ADPS1) | (0 << ADPS0))
1137#define ADC_PRESCALER_DIV_32 ((1 << ADPS2) | (0 << ADPS1) | (1 << ADPS0))
1139#define ADC_PRESCALER_DIV_64 ((1 << ADPS2) | (1 << ADPS1) | (0 << ADPS0))
1141#define ADC_PRESCALER_DIV_128 ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0))
1143
1151#define ADC_REFERENCE_VOLTAGE_AREF ((0 << REFS1) | (0 << REFS0))
1153#define ADC_REFERENCE_VOLTAGE_VCC ((0 << REFS1) | (1 << REFS0))
1155#define ADC_REFERENCE_VOLTAGE_INTERNAL ((1 << REFS1) | (1 << REFS0))
1157
1165#define ADC_TRIGGER_FREE ((0 << ADTS3) | (0 << ADTS2) | (0 << ADTS1) | (0 << ADTS0))
1167#define ADC_TRIGGER_ANALOG_COMP ((0 << ADTS3) | (0 << ADTS2) | (0 << ADTS1) | (1 << ADTS0))
1169#define ADC_TRIGGER_INT0 ((0 << ADTS3) | (0 << ADTS2) | (1 << ADTS1) | (0 << ADTS0))
1171#define ADC_TRIGGER_TIMER0_COMPA ((0 << ADTS3) | (0 << ADTS2) | (1 << ADTS1) | (1 << ADTS0))
1173#define ADC_TRIGGER_TIMER0_OVF ((0 << ADTS3) | (1 << ADTS2) | (0 << ADTS1) | (0 << ADTS0))
1175#define ADC_TRIGGER_TIMER1_COMPB ((0 << ADTS3) | (1 << ADTS2) | (0 << ADTS1) | (1 << ADTS0))
1177#define ADC_TRIGGER_TIMER1_OVF ((0 << ADTS3) | (1 << ADTS2) | (1 << ADTS1) | (0 << ADTS0))
1179#define ADC_TRIGGER_TIMER1_CAPT ((0 << ADTS3) | (1 << ADTS2) | (1 << ADTS1) | (1 << ADTS0))
1181#define ADC_TRIGGER_TIMER4_OVF ((1 << ADTS3) | (0 << ADTS2) | (0 << ADTS1) | (0 << ADTS0))
1183#define ADC_TRIGGER_TIMER4_COMPA ((1 << ADTS3) | (0 << ADTS2) | (0 << ADTS1) | (1 << ADTS0))
1185#define ADC_TRIGGER_TIMER4_COMPB ((1 << ADTS3) | (0 << ADTS2) | (1 << ADTS1) | (0 << ADTS0))
1187#define ADC_TRIGGER_TIMER4_COMPD ((1 << ADTS3) | (0 << ADTS2) | (1 << ADTS1) | (1 << ADTS0))
1189
1190// Typedefs
1195typedef struct motorflags
1196{
1198 uint8_t reserved : 7;
1202 uint8_t remote : 1;
1204 uint8_t enable : 1;
1206 uint8_t actualDirection : 2;
1208 uint8_t desiredDirection : 1;
1210 uint8_t driveWaveform : 2;
1212 uint8_t fatalFault : 1;
1214
1219typedef struct faultflags
1220{
1222 uint8_t reserved : 1;
1224 uint8_t reverseDirection : 1;
1226 uint8_t motorStopped : 1;
1228 uint8_t overCurrent : 1;
1232 uint8_t userFlag1 : 1;
1234 uint8_t userFlag2 : 1;
1236 uint8_t userFlag3 : 1;
1238
1260
1266typedef struct motorconfigs
1267{
1269 uint32_t tim4Freq : 17; // max value 131071
1271 uint16_t tim4Top : 10; // max value 1023
1273 uint16_t tim4DeadTime : 11; // max value 2047
1275 uint8_t speedInputSource : 1;
1277
1279
1288
1295#define TIM4_PRESCALER_DIV_PATTERN(tim4Prescaler) \
1296 ((tim4Prescaler) == 1 ? TIM4_PRESCALER_DIV_1 : (tim4Prescaler) == 2 ? TIM4_PRESCALER_DIV_2 \
1297 : (tim4Prescaler) == 4 ? TIM4_PRESCALER_DIV_4 \
1298 : 0)
1299
1302#define TIM4_TOP(tim4Freq) (((F_HST / ((uint32_t)tim4Freq * CHOOSE_TIM4_PRESCALER(tim4Freq))) >> 1) - 1)
1303
1305#define TIM4_TOP_MAX 0x03ff
1306
1313#define DT_PRESCALER_DIV_PATTERN(dtPrescaler) \
1314 ((dtPrescaler) == 1 ? DT_PRESCALER_DIV_1 : (dtPrescaler) == 2 ? DT_PRESCALER_DIV_2 \
1315 : (dtPrescaler) == 4 ? DT_PRESCALER_DIV_4 \
1316 : (dtPrescaler) == 8 ? DT_PRESCALER_DIV_8 \
1317 : 0)
1318
1323#define DEAD_TIME_HALF(deadTime) (((uint8_t)(ceil((double)deadTime * F_HST / ((double)CHOOSE_DT_PRESCALER(deadTime) * 1000000000)))))
1324
1331#define TIM3_TOP (((F_CPU / TIM3_FREQ / 3) >> 4) - 1)
1332
1334#define TIM3_TOP_MAX 0xffff
1335#if TIM3_TOP_ > TIM3_TOP_MAX
1336#error "Invalid TIM3_FREQ set"
1337#endif
1338
1339#if ((EMULATE_HALL == TRUE) && (SPEED_CONTROL_METHOD == SPEED_CONTROL_CLOSED_LOOP))
1340#error "Invalid combination of EMULATE_HALL and SPEED_CONTROL_METHOD"
1341#endif
1342
1351#define MAX_I_TERM PID_MAX_I_TERM
1352
1354
1389
1460
1526
1552
1563
1578
1579#endif /* _MAIN_H_ */
struct motorflags motorflags_t
Collection of all motor control flags.
fault_flag_t
Enumeration of fault flags.
Definition config.h:1242
struct motorconfigs motorconfigs_t
Collection of motor configurations.
struct faultflags faultflags_t
Collection of all fault flags.
@ FAULT_OVER_CURRENT
Has it tripped the over current limit?
Definition config.h:1250
@ FAULT_USER_FLAG1
Is user flag 1 set?
Definition config.h:1254
@ FAULT_NO_HALL_CONNECTIONS
Is there no hall connections?
Definition config.h:1252
@ FAULT_USER_FLAG2
Is user flag 2 set?
Definition config.h:1256
@ FAULT_RESERVED
Reserved flag, always false.
Definition config.h:1244
@ FAULT_USER_FLAG3
Is user flag 3 set?
Definition config.h:1258
@ FAULT_REVERSE_DIRECTION
Is motor spinning in an unexpected direction?
Definition config.h:1246
@ FAULT_MOTOR_STOPPED
Is motor stopped?
Definition config.h:1248
Collection of all fault flags.
Definition config.h:1220
uint8_t userFlag2
Is user flag 2 set?
Definition config.h:1234
uint8_t motorStopped
Is motor stopped?
Definition config.h:1226
uint8_t userFlag3
Is user flag 3 set?
Definition config.h:1236
uint8_t reserved
Reserved bit(s).
Definition config.h:1222
uint8_t noHallConnections
Is there no hall connections?
Definition config.h:1230
uint8_t overCurrent
Has it tripped the over current limit?
Definition config.h:1228
uint8_t reverseDirection
Is motor spinning in an unexpected direction?
Definition config.h:1224
uint8_t userFlag1
Is user flag 1 set?
Definition config.h:1232
Collection of motor configurations.
Definition config.h:1267
uint16_t tim4Top
Corresponding TIM4 top value for TIM4 frequency.
Definition config.h:1271
uint8_t speedInputSource
SpeedInput source select (only for remote mode).
Definition config.h:1275
uint16_t tim4DeadTime
Corresponding dead time for TIM4 output.
Definition config.h:1273
uint32_t tim4Freq
TIM4 or gate switching frequency.
Definition config.h:1269
Collection of all motor control flags.
Definition config.h:1196
uint8_t desiredDirection
The desired direction of rotation.
Definition config.h:1208
uint8_t enable
Is the motor enabled?
Definition config.h:1204
uint8_t actualDirection
The actual direction of rotation.
Definition config.h:1206
uint8_t driveWaveform
The current waveform that should be produced.
Definition config.h:1210
uint8_t fatalFault
Fatal fault.
Definition config.h:1212
uint8_t reserved
Reserved bit(s).
Definition config.h:1198
uint8_t remote
Is the remote enabled?
Definition config.h:1202
uint8_t speedControllerRun
Should speed controller run?
Definition config.h:1200