Main Page | Data Structures | File List | Data Fields | Globals | Related Pages

PMSM.h

Go to the documentation of this file.
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

Generated on Mon Mar 27 09:31:24 2006 for AVR447: Sine wave driving of three phase motor by  doxygen 1.4.4