Motor Evaluation Kit NEVC-MCTRL-100-t01-1.0.0
Firmware for NEVB-MCTRL-100-01 for trapezoidal control of BLDC motors using Hall-effect sensors
Loading...
Searching...
No Matches
main.h
Go to the documentation of this file.
1/* This file has been prepared for Doxygen automatic documentation generation.*/
22#ifndef _MAIN_H_
23#define _MAIN_H_
24
25// Include math definitions
26#include <math.h>
27
28// Include standard integer type definitions
29#include <stdint.h>
30
60#define MOTOR_POLES 8
61
99#define TIM4_FREQ 20000UL
100#if TIM4_FREQ > 100000UL
101#error "ADVISORY WARNING: TIM4_FREQ should not be set above 100 kHz. If you want to still continue, please uncomment and compile again."
102#endif
103#if TIM4_FREQ < 7183UL
104#error "ADVISORY WARNING: TIM4_FREQ should not be set below 7183 Hz. If you want to still continue, you'll have to modify the code to allow for a higher pre-scaler value for Timer4."
105#endif
106
128#define DEAD_TIME 350UL
129#if DEAD_TIME < 350
130#error "ADVISORY WARNING: DEAD_TIME should not be set below 350 ns. If you want to still continue, please uncomment and compile again."
131#endif
132
143#define HALL_PULLUP_ENABLE FALSE
144
162#define EMULATE_HALL FALSE
163
178#define TIM3_FREQ 200UL
179
188#define COMMUTATION_TICKS_STOPPED 6000
189
203#define TURN_OFF_MODE TURN_OFF_MODE_COAST
204
220#define CURRENT_GAIN 50
221
238#define CURRENT_SENSE_RESISTOR 2000
239
273#define CURRENT_WARNING_THRESHOLD 408
274
312#define CURRENT_ERROR_THRESHOLD 816
313
325#define CURRENT_FAULT_ENABLE FALSE
326
339#define SPEED_CONTROL_METHOD SPEED_CONTROL_OPEN_LOOP
340
354#define SPEED_CONTROLLER_TIME_BASE 200
355
375#define SPEED_CONTROLLER_MAX_DELTA 1
376
396#define SPEED_CONTROLLER_MAX_SPEED 400
397
415#define PID_K_P 100
416
434#define PID_K_I 10
435
453#define PID_K_D_ENABLE TRUE
454
472#define PID_K_D 0
473
492#define GATE_RTOP 1000000
493
512#define GATE_RBOTTOM 71500
513
520#define REMOTE_DEBUG_MODE FALSE
521
533// Boolean values
535#define FALSE 0
537#define TRUE (!FALSE)
538
540#define F_HST 64000000UL
541
542// PWM pin definitions
544#define AH_PIN PB6
546#define BH_PIN PC7
548#define CH_PIN PD7
550#define AL_PIN PB5
552#define BL_PIN PC6
554#define CL_PIN PD6
555
556// PWM PORT patterns
558#define PWM_PATTERN_PORTB ((1 << AH_PIN) | (1 << AL_PIN))
560#define PWM_PATTERN_PORTC ((1 << BH_PIN) | (1 << BL_PIN))
562#define PWM_PATTERN_PORTD ((1 << CH_PIN) | (1 << CL_PIN))
565#define OC_ENABLE_PORTB ((1 << OC4OE3) | (1 << OC4OE2))
568#define OC_ENABLE_PORTC ((1 << OC4OE1) | (1 << OC4OE0))
571#define OC_ENABLE_PORTD ((1 << OC4OE5) | (1 << OC4OE4))
572
573// Direction macro definitions
575#define DIRECTION_FORWARD 0
577#define DIRECTION_REVERSE 1
579#define DIRECTION_UNKNOWN 3
580
581// Hall pins definitions
583#define HALL_PIN PINB
585#define H1_PIN PB1
587#define H2_PIN PB2
589#define H3_PIN PB3
590
591// ADC ADMUX selections
594#define ADC_MUX_L_SPEED ADC_MUX_L_ADC4
597#define ADC_MUX_H_SPEED ADC_MUX_H_ADC4
599#define ADC_MUX_L_CURRENT ADC_MUX_L_ADC7
601#define ADC_MUX_H_CURRENT ADC_MUX_H_ADC7
603#define ADC_MUX_L_GATEVREF ADC_MUX_L_ADC6
605#define ADC_MUX_H_GATEVREF ADC_MUX_H_ADC6
607#define ADC_MUX_L_BREF ADC_MUX_L_ADC0
609#define ADC_MUX_H_BREF ADC_MUX_H_ADC0
610
611// ADC configurations
613#define ADC_PRESCALER ADC_PRESCALER_DIV_8
615#define ADC_REFERENCE_VOLTAGE ADC_REFERENCE_VOLTAGE_VCC
617#define ADC_TRIGGER ADC_TRIGGER_TIMER0_OVF
618
619// Input pin definitions
621#define DIRECTION_COMMAND_PIN PD2
623#define ENABLE_PIN PD0
625#define REMOTE_PIN PD3
626
627// Speed Input Source definitions (only during remote mode)
629#define SPEED_INPUT_SOURCE_LOCAL 0
631#define SPEED_INPUT_SOURCE_REMOTE 1
632
633// Fault pin definitions
635#define FAULT_PIN_1 PD4
637#define FAULT_PIN_2 PB4
639#define FAULT_PIN_3 PB7
640
641// Waveform macro definitions
643#define WAVEFORM_BLOCK_COMMUTATION 0
645#define WAVEFORM_BRAKING 1
647#define WAVEFORM_UNDEFINED 3
648
649// Turn off mode macro definitions
651#define TURN_OFF_MODE_COAST 0
654#define TURN_OFF_MODE_BRAKE 1
655
656// Speed control macro definitions
658#define SPEED_CONTROL_OPEN_LOOP 0
660#define SPEED_CONTROL_CLOSED_LOOP 1
661
674#define SPEED_CONTROLLER_MAX_INPUT 255
675
677#define CHOOSE_TIM4_PRESCALER(tim4Freq) ((tim4Freq) < 15625 ? 4 : ((tim4Freq) < 31250 ? 2 : 1))
678
695#define CHOOSE_DT_PRESCALER(deadTime) \
696 ((deadTime) <= 234 ? 1 : (deadTime) <= 468 ? 2 \
697 : (deadTime) <= 937 ? 4 \
698 : (deadTime) <= 1875 ? 8 \
699 : 0)
700
712#ifdef __INTELLISENSE__
713#define FORCE_INLINE inline
714#else
715#define FORCE_INLINE inline __attribute__((always_inline))
716#endif
717
728#ifdef __INTELLISENSE__
729#define FAST_ACCESS(register_address)
730#else
731#define FAST_ACCESS(register_address) __attribute__((address(register_address)))
732#endif
733
734#ifdef __INTELLISENSE__
744#define sei() ((void)0)
745
755#define cli() ((void)0)
756#endif
757
766#define PLL_POSTSCALER_OFF ((0 << PLLTM1) | (0 << PLLTM0))
768#define PLL_POSTSCALER_DIV_1_0 ((0 << PLLTM1) | (1 << PLLTM0))
770#define PLL_POSTSCALER_DIV_1_5 ((1 << PLLTM1) | (0 << PLLTM0))
772#define PLL_POSTSCALER_DIV_2_0 ((1 << PLLTM1) | (1 << PLLTM0))
782#define DT_PRESCALER_DIV_1 ((0 << DTPS41) | (0 << DTPS40))
784#define DT_PRESCALER_DIV_2 ((0 << DTPS41) | (1 << DTPS40))
786#define DT_PRESCALER_DIV_4 ((1 << DTPS41) | (0 << DTPS40))
788#define DT_PRESCALER_DIV_8 ((1 << DTPS41) | (1 << DTPS40))
799#define TIM1_CLOCK_OFF ((0 << CS12) | (0 << CS11) | (0 << CS10))
801#define TIM1_CLOCK_DIV_1 ((0 << CS12) | (0 << CS11) | (1 << CS10))
803#define TIM1_CLOCK_DIV_8 ((0 << CS12) | (1 << CS11) | (0 << CS10))
805#define TIM1_CLOCK_DIV_64 ((0 << CS12) | (1 << CS11) | (1 << CS10))
807#define TIM1_CLOCK_DIV_256 ((1 << CS12) | (0 << CS11) | (0 << CS10))
809#define TIM1_CLOCK_DIV_1024 ((1 << CS12) | (0 << CS11) | (1 << CS10))
811#define TIM1_CLOCK_EXT_FALLING ((1 << CS12) | (1 << CS11) | (0 << CS10))
813#define TIM1_CLOCK_EXT_RISING ((1 << CS12) | (1 << CS11) | (1 << CS10))
823#define TIM4_PRESCALER_OFF ((0 << CS43) | (0 << CS42) | (0 << CS41) | (0 << CS40))
825#define TIM4_PRESCALER_DIV_1 ((0 << CS43) | (0 << CS42) | (0 << CS41) | (1 << CS40))
827#define TIM4_PRESCALER_DIV_2 ((0 << CS43) | (0 << CS42) | (1 << CS41) | (0 << CS40))
829#define TIM4_PRESCALER_DIV_4 ((0 << CS43) | (0 << CS42) | (1 << CS41) | (1 << CS40))
840#define ADC_MUX_L_BITS ((1 << MUX4) | (1 << MUX3) | (1 << MUX2) | (1 << MUX1) | (1 << MUX0))
842#define ADC_MUX_H_BITS (1 << MUX5)
844#define ADC_MUX_L_ADC0 ((0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (0 << MUX0))
846#define ADC_MUX_H_ADC0 (0 << MUX5)
848#define ADC_MUX_L_ADC1 ((0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (1 << MUX0))
850#define ADC_MUX_H_ADC1 (0 << MUX5)
852#define ADC_MUX_L_ADC4 ((0 << MUX4) | (0 << MUX3) | (1 << MUX2) | (0 << MUX1) | (0 << MUX0))
854#define ADC_MUX_H_ADC4 (0 << MUX5)
856#define ADC_MUX_L_ADC5 ((0 << MUX4) | (0 << MUX3) | (1 << MUX2) | (0 << MUX1) | (1 << MUX0))
858#define ADC_MUX_H_ADC5 (0 << MUX5)
860#define ADC_MUX_L_ADC6 ((0 << MUX4) | (0 << MUX3) | (1 << MUX2) | (1 << MUX1) | (0 << MUX0))
862#define ADC_MUX_H_ADC6 (0 << MUX5)
864#define ADC_MUX_L_ADC7 ((0 << MUX4) | (0 << MUX3) | (1 << MUX2) | (1 << MUX1) | (1 << MUX0))
866#define ADC_MUX_H_ADC7 (0 << MUX5)
868#define ADC_MUX_L_ADC8 ((0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (0 << MUX0))
870#define ADC_MUX_H_ADC8 (1 << MUX5)
872#define ADC_MUX_L_ADC9 ((0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (1 << MUX0))
874#define ADC_MUX_H_ADC9 (1 << MUX5)
876#define ADC_MUX_L_ADC10 ((0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (1 << MUX1) | (0 << MUX0))
878#define ADC_MUX_H_ADC10 (1 << MUX5)
880#define ADC_MUX_L_ADC11 ((0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (1 << MUX1) | (1 << MUX0))
882#define ADC_MUX_H_ADC11 (1 << MUX5)
884#define ADC_MUX_L_ADC12 ((0 << MUX4) | (0 << MUX3) | (1 << MUX2) | (0 << MUX1) | (0 << MUX0))
886#define ADC_MUX_H_ADC12 (1 << MUX5)
888#define ADC_MUX_L_ADC13 ((0 << MUX4) | (0 << MUX3) | (1 << MUX2) | (0 << MUX1) | (1 << MUX0))
890#define ADC_MUX_H_ADC13 (1 << MUX5)
892#define ADC_MUX_L_TEMP_SENSOR ((0 << MUX4) | (0 << MUX3) | (1 << MUX2) | (1 << MUX1) | (1 << MUX0))
894#define ADC_MUX_H_TEMP_SENSOR (1 << MUX5)
896#define ADC_MUX_L_1V1 ((1 << MUX4) | (1 << MUX3) | (1 << MUX2) | (1 << MUX1) | (0 << MUX0))
898#define ADC_MUX_H_1V1 (0 << MUX5)
900#define ADC_MUX_L_0V ((1 << MUX4) | (1 << MUX3) | (1 << MUX2) | (1 << MUX1) | (1 << MUX0))
902#define ADC_MUX_H_0V (0 << MUX5)
912#define ADC_PRESCALER_DIV_2 ((0 << ADPS2) | (0 << ADPS1) | (0 << ADPS0))
914#define ADC_PRESCALER_DIV_4 ((0 << ADPS2) | (1 << ADPS1) | (0 << ADPS0))
916#define ADC_PRESCALER_DIV_8 ((0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0))
918#define ADC_PRESCALER_DIV_16 ((1 << ADPS2) | (0 << ADPS1) | (0 << ADPS0))
920#define ADC_PRESCALER_DIV_32 ((1 << ADPS2) | (0 << ADPS1) | (1 << ADPS0))
922#define ADC_PRESCALER_DIV_64 ((1 << ADPS2) | (1 << ADPS1) | (0 << ADPS0))
924#define ADC_PRESCALER_DIV_128 ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0))
934#define ADC_REFERENCE_VOLTAGE_AREF ((0 << REFS1) | (0 << REFS0))
936#define ADC_REFERENCE_VOLTAGE_VCC ((0 << REFS1) | (1 << REFS0))
938#define ADC_REFERENCE_VOLTAGE_INTERNAL ((1 << REFS1) | (1 << REFS0))
948#define ADC_TRIGGER_FREE ((0 << ADTS3) | (0 << ADTS2) | (0 << ADTS1) | (0 << ADTS0))
950#define ADC_TRIGGER_ANALOG_COMP ((0 << ADTS3) | (0 << ADTS2) | (0 << ADTS1) | (1 << ADTS0))
952#define ADC_TRIGGER_INT0 ((0 << ADTS3) | (0 << ADTS2) | (1 << ADTS1) | (0 << ADTS0))
954#define ADC_TRIGGER_TIMER0_COMPA ((0 << ADTS3) | (0 << ADTS2) | (1 << ADTS1) | (1 << ADTS0))
956#define ADC_TRIGGER_TIMER0_OVF ((0 << ADTS3) | (1 << ADTS2) | (0 << ADTS1) | (0 << ADTS0))
958#define ADC_TRIGGER_TIMER1_COMPB ((0 << ADTS3) | (1 << ADTS2) | (0 << ADTS1) | (1 << ADTS0))
960#define ADC_TRIGGER_TIMER1_OVF ((0 << ADTS3) | (1 << ADTS2) | (1 << ADTS1) | (0 << ADTS0))
962#define ADC_TRIGGER_TIMER1_CAPT ((0 << ADTS3) | (1 << ADTS2) | (1 << ADTS1) | (1 << ADTS0))
964#define ADC_TRIGGER_TIMER4_OVF ((1 << ADTS3) | (0 << ADTS2) | (0 << ADTS1) | (0 << ADTS0))
966#define ADC_TRIGGER_TIMER4_COMPA ((1 << ADTS3) | (0 << ADTS2) | (0 << ADTS1) | (1 << ADTS0))
968#define ADC_TRIGGER_TIMER4_COMPB ((1 << ADTS3) | (0 << ADTS2) | (1 << ADTS1) | (0 << ADTS0))
970#define ADC_TRIGGER_TIMER4_COMPD ((1 << ADTS3) | (0 << ADTS2) | (1 << ADTS1) | (1 << ADTS0))
973// Typedefs
978typedef struct motorflags
979{
983 uint8_t remote : 1;
985 uint8_t enable : 1;
987 uint8_t actualDirection : 2;
989 uint8_t desiredDirection : 1;
991 uint8_t driveWaveform : 2;
993
998typedef struct faultflags
999{
1001 uint8_t reserved : 1;
1003 uint8_t reverseDirection : 1;
1005 uint8_t motorStopped : 1;
1007 uint8_t overCurrent : 1;
1011 uint8_t userFlag1 : 1;
1013 uint8_t userFlag2 : 1;
1015 uint8_t userFlag3 : 1;
1017
1023typedef struct motorconfigs
1024{
1026 uint32_t tim4Freq : 17; // max value 131071
1028 uint16_t tim4Top : 10; // max value 1023
1030 uint16_t tim4DeadTime : 11; // max value 2047
1032 uint8_t speedInputSource : 1;
1034
1052#define TIM4_PRESCALER_DIV_PATTERN(tim4Prescaler) \
1053 ((tim4Prescaler) == 1 ? TIM4_PRESCALER_DIV_1 : (tim4Prescaler) == 2 ? TIM4_PRESCALER_DIV_2 \
1054 : (tim4Prescaler) == 4 ? TIM4_PRESCALER_DIV_4 \
1055 : 0)
1056
1059#define TIM4_TOP(tim4Freq) (((F_HST / ((uint32_t)tim4Freq * CHOOSE_TIM4_PRESCALER(tim4Freq))) >> 1) - 1)
1060
1062#define TIM4_TOP_MAX 0x03ff
1063
1070#define DT_PRESCALER_DIV_PATTERN(dtPrescaler) \
1071 ((dtPrescaler) == 1 ? DT_PRESCALER_DIV_1 : (dtPrescaler) == 2 ? DT_PRESCALER_DIV_2 \
1072 : (dtPrescaler) == 4 ? DT_PRESCALER_DIV_4 \
1073 : (dtPrescaler) == 8 ? DT_PRESCALER_DIV_8 \
1074 : 0)
1075
1080#define DEAD_TIME_HALF(deadTime) (((uint8_t)(ceil((double)deadTime * F_HST / ((double)CHOOSE_DT_PRESCALER(deadTime) * 1000000000)))))
1081
1088#define TIM3_TOP (((F_CPU / TIM3_FREQ / 3) >> 4) - 1)
1089
1091#define TIM3_TOP_MAX 0xffff
1092#if TIM3_TOP_ > TIM3_TOP_MAX
1093#error "Invalid TIM3_FREQ set"
1094#endif
1095
1096#if ((EMULATE_HALL == TRUE) && (SPEED_CONTROL_METHOD == SPEED_CONTROL_CLOSED_LOOP))
1097#error "Invalid combination of EMULATE_HALL and SPEED_CONTROL_METHOD"
1098#endif
1099
1326#endif /* _MAIN_H_ */
struct motorflags motorflags_t
Collection of all motor control flags.
struct motorconfigs motorconfigs_t
Collection of motor configurations.
struct faultflags faultflags_t
Collection of all fault flags.
Collection of all fault flags.
Definition main.h:999
uint8_t userFlag2
Is user flag 2 set?
Definition main.h:1013
uint8_t motorStopped
Is motor stopped?
Definition main.h:1005
uint8_t userFlag3
Is user flag 3 set?
Definition main.h:1015
uint8_t reserved
Reserved bit(s).
Definition main.h:1001
uint8_t noHallConnections
Is there no hall connections?
Definition main.h:1009
uint8_t overCurrent
Has it tripped the over current limit?
Definition main.h:1007
uint8_t reverseDirection
Is motor spinning in an unexpected direction?
Definition main.h:1003
uint8_t userFlag1
Is user flag 1 set?
Definition main.h:1011
Collection of motor configurations.
Definition main.h:1024
uint16_t tim4Top
Corresponding TIM4 top value for TIM4 frequency.
Definition main.h:1028
uint8_t speedInputSource
SpeedInput source select (only for remote mode).
Definition main.h:1032
uint16_t tim4DeadTime
Corresponding dead time for TIM4 output.
Definition main.h:1030
uint32_t tim4Freq
TIM4 or gate switching frequency.
Definition main.h:1026
Collection of all motor control flags.
Definition main.h:979
uint8_t desiredDirection
The desired direction of rotation.
Definition main.h:989
uint8_t enable
Is the motor enabled?
Definition main.h:985
uint8_t actualDirection
The actual direction of rotation.
Definition main.h:987
uint8_t driveWaveform
The current waveform that should be produced.
Definition main.h:991
uint8_t remote
Is the remote enabled?
Definition main.h:983
uint8_t speedControllerRun
Should speed controller run?
Definition main.h:981