00001
00023 #ifndef __BLDC_H__
00024 #define __BLDC_H__
00025
00027 #define SYSTEM_FREQUENCY 8000000
00028
00030 #define PWM_BASE_FREQUENCY 20000
00031
00033 #define PWM_TOP_VALUE (SYSTEM_FREQUENCY / PWM_BASE_FREQUENCY / 2)
00034
00036 #define FALSE 0
00037
00039 #define TRUE (!FALSE)
00040
00042 #define UL PB5
00043
00045 #define UH PB4
00046
00048 #define VL PB3
00049
00051 #define VH PB2
00052
00054 #define WL PB1
00055
00057 #define WH PB0
00058
00060 #define CW 0
00061
00063 #define CCW 1
00064
00068 #define DIRECTION_OF_ROTATION CCW
00069
00071 #define DRIVE_PATTERN_STEP1_CCW ((1 << UL) | (1 << VH))
00072
00074 #define DRIVE_PATTERN_STEP2_CCW ((1 << UL) | (1 << WH))
00075
00077 #define DRIVE_PATTERN_STEP3_CCW ((1 << VL) | (1 << WH))
00078
00080 #define DRIVE_PATTERN_STEP4_CCW ((1 << VL) | (1 << UH))
00081
00083 #define DRIVE_PATTERN_STEP5_CCW ((1 << WL) | (1 << UH))
00084
00086 #define DRIVE_PATTERN_STEP6_CCW ((1 << WL) | (1 << VH))
00087
00088
00090 #define DRIVE_PATTERN_STEP1_CW ((1 << VH) | (1 << WL))
00091
00093 #define DRIVE_PATTERN_STEP2_CW ((1 << UH) | (1 << WL))
00094
00096 #define DRIVE_PATTERN_STEP3_CW ((1 << UH) | (1 << VL))
00097
00099 #define DRIVE_PATTERN_STEP4_CW ((1 << WH) | (1 << VL))
00100
00102 #define DRIVE_PATTERN_STEP5_CW ((1 << WH) | (1 << UL))
00103
00105 #define DRIVE_PATTERN_STEP6_CW ((1 << VH) | (1 << UL))
00106
00108 #define EDGE_FALLING 1
00109
00111 #define EDGE_RISING 0
00112
00114 #define DRIVE_PORT PORTB
00115
00117 #define DRIVE_DDR DDRB
00118
00120 #define ADC_MUX_U 0x0
00121
00123 #define ADC_MUX_V 0x1
00124
00126 #define ADC_MUX_W 0x2
00127
00129 #define ADC_MUX_SPEED_REF 0x4
00130
00132 #define ADC_MUX_CURRENT 0x3
00133
00135 #define ADC_MUX_REF_VOLTAGE 0x5
00136
00138 #define ADC_REF_CHANNEL ((0 << REFS1) | (0 << REFS0))
00139
00141 #define ADC_RES_ALIGNMENT_BEMF (1 << ADLAR)
00142
00144 #define ADC_RES_ALIGNMENT_SPEED_REF (1 << ADLAR)
00145
00147 #define ADC_RES_ALIGNMENT_CURRENT (1 << ADLAR)
00148
00150 #define ADC_RES_ALIGNMENT_REF_VOLTAGE (1 << ADLAR)
00151
00153 #define ADMUX_U (ADC_REF_CHANNEL | ADC_RES_ALIGNMENT_BEMF | ADC_MUX_U)
00154
00156 #define ADMUX_V (ADC_REF_CHANNEL | ADC_RES_ALIGNMENT_BEMF | ADC_MUX_V)
00157
00159 #define ADMUX_W (ADC_REF_CHANNEL | ADC_RES_ALIGNMENT_BEMF | ADC_MUX_W)
00160
00162 #define ADMUX_SPEED_REF (ADC_REF_CHANNEL | ADC_RES_ALIGNMENT_SPEED_REF | ADC_MUX_SPEED_REF)
00163
00165 #define ADMUX_CURRENT (ADC_REF_CHANNEL | ADC_RES_ALIGNMENT_CURRENT | ADC_MUX_CURRENT)
00166
00168 #define ADMUX_REF_VOLTAGE (ADC_REF_CHANNEL | ADC_RES_ALIGNMENT_REF_VOLTAGE | ADC_MUX_REF_VOLTAGE)
00169
00171 #define ADC_PRESCALER_8 ((0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0))
00172
00174 #define ADC_PRESCALER_16 ((1 << ADPS2) | (0 << ADPS1) | (0 << ADPS0))
00175
00177 #define ADC_PRESCALER ADC_PRESCALER_8
00178
00180 #define ADC_TRIGGER_SOURCE ((1 << ADTS2) | (0 << ADTS1) | (0 << ADTS0))
00181
00186 #define STARTUP_NUM_COMMUTATIONS 8
00187
00189 #define STARTUP_DELAY_MULTIPLIER 100
00190
00195 #define STARTUP_LOCK_DELAY 10000
00196
00198 #define MAX_RESTART_ATTEMPTS 10
00199
00201 #define ZC_DETECTION_HOLDOFF_TIME_US (filteredTimeSinceCommutation / 2)
00202
00204 #define SET_PWM_COMPARE_VALUE(compareValue) (OCR0B = compareValue)
00205
00207 #define CLEAR_ALL_TIMER0_INT_FLAGS (TIFR0 = TIFR0)
00208
00210 #define DISABLE_ALL_TIMER0_INTS (TIMSK0 = 0)
00211
00213 #define SET_TIMER0_INT_ZC_DETECTION (TIMSK0 = (1 << TOIE0))
00214
00216 #define CLEAR_ALL_TIMER1_INT_FLAGS (TIFR1 = TIFR1)
00217
00219 #define DISABLE_ALL_TIMER1_INTS (TIMSK1 = 0)
00220
00222 #define SET_TIMER1_INT_COMMUTATION (TIMSK1 = (1 << OCIE1A))
00223
00225 #define SET_TIMER1_INT_HOLDOFF (TIMSK1 = (1 << OCIE1B))
00226
00228 #define EXTERNAL_REF_VOLTAGE ((4930UL * 10) / 43)
00229
00231 #define SHUNT_RESISTANCE 220
00232
00234 #define ADC_RESOLUTION 256
00235
00240 #define TICKS_PER_SECOND 1000000UL
00241
00243 #define TICKS_PER_MINUTE (TICKS_PER_SECOND * 60)
00244
00251 #define COMMUTATION_TIMING_IIR_COEFF_A 1
00252
00259 #define COMMUTATION_TIMING_IIR_COEFF_B 3
00260
00262 #define SPEED_CONTROL_OPEN_LOOP
00263
00264
00266 #define CURRENT_LIMITER_START 2500
00267
00269 #define CURRENT_LIMITER_CRITICAL 3000
00270
00275 #define ANALOG_COMPARATOR_ENABLE
00276
00281 #define CURRENT_LIMITER_FACTOR (1 / 5)
00282
00284 #define DISABLE_DRIVING (DRIVE_PORT = 0x00)
00285
00287 #define STARTUP_PWM_COMPARE_VALUE 130
00288
00290 #define ADC_ZC_THRESHOLD 0x98
00291
00296 #define COMMUTATION_CORRECTION 50
00297
00299 #define MIN_PWM_COMPARE_VALUE 90
00300
00302 #define MAX_PWM_COMPARE_VALUE 200
00303
00305 #define MIN_SPEED 3000UL
00306
00308 #define MAX_SPEED 8000UL
00309
00311 #define P_REG_K_P 64
00312
00314 #define P_REG_SCALING 65536
00315
00316 static void ResetHandler(void);
00317 static void InitPorts(void);
00318 static void InitTimers(void);
00319 static void InitADC(void);
00320 static void InitAnalogComparator(void);
00321 static void WatchdogTimerEnable(void);
00322 static void MakeTables(void);
00323 static void StartMotor(void);
00324 static void PWMControl(void);
00325 static void StartupDelay(unsigned int delay);
00326 static unsigned long CalculateSpeed();
00327 static unsigned long CalculateSpeedSetpoint();
00328 static unsigned int CalculateCurrent();
00329 static signed int SpeedControl(void);
00330 static unsigned char CurrentControl(void);
00331
00332
00333 #endif // File guard