00001 /* This file has been prepared for Doxygen automatic documentation generation.*/ 00028 #ifndef _PMSM_H_ 00029 #define _PMSM_H_ 00030 00031 00033 #define FALSE 0 00034 00036 #define TRUE (!FALSE) 00037 00042 #define DEAD_TIME_HALF 4 00043 00045 #define SINE_TABLE_LENGTH 192U 00046 00047 #if SINE_TABLE_LENGTH != 192U 00048 #warning "Changing sine modulation table length can have unwanted side effects. Consult the documentation for more information." 00049 #endif 00050 00052 #define TABLE_ELEMENTS_PER_COMMUTATION_SECTOR (SINE_TABLE_LENGTH / 6) 00053 00055 #define PWM_PATTERN_PORTB ((1 << PB1) | (1 << PB2) | (1 << PB3)) 00056 00058 #define PWM_PATTERN_PORTD ((1 << PD3) | (1 << PD5) | (1 << PD6)) 00059 00061 #define DIRECTION_FORWARD 0 00062 00064 #define DIRECTION_REVERSE 1 00065 00067 #define DIRECTION_UNKNOWN 3 00068 00074 #define HALL_PULLUP_ENABLE FALSE 00075 00077 #define HALL_PIN PINC 00078 00080 #define H1_PIN PC0 00081 00083 #define H2_PIN PC1 00084 00086 #define H3_PIN PC2 00087 00089 #define ADC_CHANNEL_SPEED_REF 3 00090 00092 #define ADC_CHANNEL_CURRENT 4 00093 00095 #define ADC_PRESCALER_8 ((0 << ADPS2) | (1 << ADPS1) | (0 << ADPS0)) 00096 00098 #define ADC_PRESCALER_64 ((1 << ADPS2) | (1 << ADPS1) | (0 << ADPS0)) 00099 00101 #define ADC_PRESCALER ADC_PRESCALER_8 00102 00104 #define ADC_REFERENCE_VOLTAGE_INTERNAL ((1 << REFS1) | (1 << REFS0)) 00105 00107 #define ADC_REFERENCE_VOLTAGE_VCC ((0 << REFS1) | (1 << REFS0)) 00108 00110 #define ADC_REFERENCE_VOLTAGE_AREF ((0 << REFS1) | (0 << REFS0)) 00111 00116 #define ADC_REFERENCE_VOLTAGE ADC_REFERENCE_VOLTAGE_INTERNAL 00117 00119 #define ADMUX_SPEED_REF (ADC_REFERENCE_VOLTAGE | (1 << ADLAR) | (ADC_CHANNEL_SPEED_REF << MUX0)) 00120 00122 #define ADMUX_CURRENT (ADC_REFERENCE_VOLTAGE | (1 << ADLAR) | (ADC_CHANNEL_CURRENT << MUX0)) 00123 00128 #define DIRECTION_COMMAND_PIN PD2 00129 00134 #define REV_ROTATION_PIN PD4 00135 00140 #define TACHO_OUTPUT_PIN PD7 00141 00146 #define EMERGENCY_SHUTDOWN_PIN PB5 00147 00149 #define WAVEFORM_BLOCK_COMMUTATION 0 00150 00152 #define WAVEFORM_SINUSOIDAL 1 00153 00155 #define WAVEFORM_BRAKING 2 00156 00158 #define WAVEFORM_UNDEFINED 3 00159 00165 #define COMMUTATION_TICKS_STOPPED 6000 00166 00171 #define TACHO_OUTPUT_ENABLED TRUE 00172 00177 #define REVERSE_ROTATION_SIGNAL_ENABLE TRUE 00178 00180 #define TURN_MODE_COAST 0 00181 00183 #define TURN_MODE_BRAKE 1 00184 00189 #define TURN_MODE TURN_MODE_BRAKE 00190 00192 #define BLOCK_COMMUTATION_DUTY_MULTIPLIER 3 00193 00199 #define SYNCHRONIZATION_COUNT 2 00200 00202 #define SPEED_CONTROL_OPEN_LOOP 0 00203 00205 #define SPEED_CONTROL_CLOSED_LOOP 1 00206 00211 #define SPEED_CONTROL_METHOD SPEED_CONTROL_OPEN_LOOP 00212 00216 #define SPEED_CONTROLLER_TIME_BASE 150 00217 00221 #define PID_K_P 50 00222 00226 #define PID_K_I 5 00227 00231 #define PID_K_D 10 00232 00238 #define SPEED_CONTROLLER_MAX_INCREMENT 550 00239 00245 #define SPEED_CONTROLLER_MAX_INPUT 256 00246 00247 00248 //Typedefs 00253 typedef struct PMSMflags 00254 { 00255 uint8_t motorStopped : 1; 00256 uint8_t motorSynchronized: 1; 00257 uint8_t actualDirection : 2; 00258 uint8_t desiredDirection : 1; 00259 uint8_t driveWaveform : 2; 00260 } PMSMflags_t; 00261 00262 00263 //Function prototypes 00264 static void TimersInit(void); 00265 static void TimersSetModeSinusoidal(void); 00266 static void TimersSetModeBlockCommutation(void); 00267 static void TimersSetModeBrake(void); 00268 static void TimersWaitForNextPWMCycle(void); 00269 static void BlockCommutationSetDuty(const uint8_t duty); 00270 static void PortsInit(void); 00271 static void PinChangeIntInit(void); 00272 static void ADCInit(void); 00273 static void CheckEmergencyShutdown(void); 00274 static void SpeedController(void); 00275 static uint8_t GetDesiredDirection(void); 00276 static uint8_t GetActualDirection(void); 00277 static void BlockCommutate(const uint8_t direction, uint8_t hall); 00278 static uint8_t GetHall(void); 00279 static void DesiredDirectionUpdate(void); 00280 static uint8_t CalculateActualDirection(const uint8_t lastHall, const uint8_t newHall); 00281 static void ActualDirectionUpdate(uint8_t lastHall, const uint8_t newHall); 00282 static void ReverseRotationSignalUpdate(void); 00283 static void InsertDeadband(const uint8_t compareValue, uint8_t * compareHighPtr, uint8_t * compareLowPtr); 00284 static void AdjustSineTableIndex(const uint16_t increment); 00285 static uint16_t SineTableIncrementCalculate(const uint16_t ticks); 00286 static void SetAdvanceCommutation(const uint8_t leadAngle); 00287 static void TachoOutputUpdate(const uint8_t hall); 00288 static void EnablePWMOutputs(void); 00289 static void DisablePWMOutputs(void); 00290 static void CommutationTicksUpdate(void); 00291 static void MotorSynchronizedUpdate(void); 00292 static uint8_t IsMotorSynchronized(void); 00293 00294 //Prototypes for ISRs, required by MISRA 00295 #pragma vector=PCINT0_vect 00296 __interrupt void EmergencyInterruptISR(void); 00297 00298 #pragma vector=PCINT1_vect 00299 __interrupt void HallChangeISR(void); 00300 00301 #pragma vector=PCINT2_vect 00302 __interrupt void DirectionInputChangeISR(void); 00303 00304 #pragma vector=TIMER1_CAPT_vect 00305 __interrupt void Timer1CaptureISR(void); 00306 00307 #pragma vector=TIMER2_OVF_vect 00308 __interrupt void Timer2OverflowISR(void); 00309 00310 #pragma vector=WDT_vect 00311 __interrupt void WatchdogISR(void); 00312 00313 #pragma vector=ADC_vect 00314 __interrupt void ADCCompleteISR(void); 00315 00316 00353 #endif
1.4.4