psc_drv.c

Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 //_____  I N C L U D E S ___________________________________________________
00015 #include "config.h"
00016 #include "lib_mcu/psc/psc_drv.h"
00017 #include "lib_mcu/pll/pll_drv.h"
00018 
00019 //_____ M A C R O S ________________________________________________________
00020 
00021 
00022 //_____ P R I V A T E    D E C L A R A T I O N _____________________________
00023 
00024 
00025 //_____ D E F I N I T I O N ________________________________________________
00026 
00027 
00028 //_____ D E C L A R A T I O N ______________________________________________
00029 
00030 #ifdef USE_PSC0 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 void init_psc0(void)
00040 {
00041 #   if (PSC0_PLL_FREQUENCY == 64)
00042        Start_pll_64_mega();
00043 #   elif (PSC0_PLL_FREQUENCY == 32)
00044        Start_pll_32_mega();
00045 #   elif (PSC0_PLL_FREQUENCY == 0)
00046 #   else
00047 #      error (PSC0_PLL_FREQUENCY should be 0, 32, or 64... See config.h file)
00048 #   endif
00049 
00050 #   if (PSC0_OUTPUT_SELECTION == 3)
00051        Enable_both_psc0_outputs();
00052 #   elif (PSC0_OUTPUT_SELECTION == 2)
00053        Enable_pscout01();
00054 #   elif (PSC0_OUTPUT_SELECTION == 1)
00055        Enable_pscout00();
00056 #   elif (PSC0_OUTPUT_SELECTION == 0)
00057        Disable_both_psc0_outputs();
00058 #   else
00059 #      error (PSC0_OUTPUT_SELECTION should be 0, 1, 2, or 2... See config.h file)
00060 #   endif
00061 
00062 #   if (PSC0_ACTIVE_STATE == 1)
00063        Psc0_outputs_active_high();
00064 #   elif (PSC0_ACTIVE_STATE == 0)
00065        Psc0_outputs_active_low();
00066 #   else
00067 #      error (PSC0_ACTIVE_STATE should be 0, or 1... See config.h file)
00068 #   endif
00069 
00070 #   if (PSC0_RAMP_MODE == 4)
00071        Psc0_in_4_ramps_mode();
00072 #   elif (PSC0_RAMP_MODE == 2)
00073        Psc0_in_2_ramps_mode();
00074 #   elif (PSC0_RAMP_MODE == 1)
00075        Psc0_in_1_ramp_mode();
00076 #   elif (PSC0_RAMP_MODE == 0)
00077        Psc0_in_centered_aligned_mode();
00078 #   else
00079 #      error (PSC0_RAMP_MODE should be 0, 1, 3, or 4... See config.h file)
00080 #   endif
00081 
00082 #   if (PSC0_FIFTY_PERCENT_MODE == 1)
00083        Enable_psc0_fifty_percent_mode();
00084 #   elif (PSC0_FIFTY_PERCENT_MODE == 0)
00085        Disable_psc0_fifty_percent_mode();
00086 #   else
00087 #      error (PSC0_FIFTY_PERCENT_MODE should be 0, or 1)
00088 #   endif
00089 
00090 #   if (PSC0_SYMETRICAL_FLANK_WIDTH_MODULATION == 1)
00091        Psc0_symetrical_flank_width_modulation();
00092 #   elif (PSC0_SYMETRICAL_FLANK_WIDTH_MODULATION == 0)
00093        Psc0_end_of_cycle_flank_width_modulation();
00094 #   else
00095 #      error (PSC0_SYMETRICAL_FLANK_WIDTH_MODULATION should be 0, or 1... See config.h file)
00096 #   endif
00097 
00098 #   if (PSC0_AUTOLOCK_MODE == 1)
00099        Enable_psc0_autolock_mode();
00100 #   elif (PSC0_AUTOLOCK_MODE == 0)
00101        Disable_psc0_autolock_mode();
00102 #   else
00103 #      error (PSC0_AUTOLOCK_MODE should be 0, or 1... See config.h file)
00104 #   endif
00105 
00106 #   if (PSC0_PRESCALER_DIVIDER == 64)
00107        Divide_psc0_input_clock_by_64();
00108 #   elif (PSC0_PRESCALER_DIVIDER == 16)
00109        Divide_psc0_input_clock_by_16();
00110 #   elif (PSC0_PRESCALER_DIVIDER == 4)
00111        Divide_psc0_input_clock_by_4();
00112 #   elif (PSC0_PRESCALER_DIVIDER == 0)
00113        Disable_psc0_prescaler();
00114 #   else
00115 #      error (PSC0_PRESCALER_DIVIDER should be 0, 4, 16, or 64... See config.h file)
00116 #   endif
00117 
00118 #   if (PSC0_PLL_FREQUENCY == 64)
00119        Wait_pll_ready();
00120        Psc0_use_pll_clock();
00121 #   elif (PSC0_PLL_FREQUENCY == 32)
00122        Wait_pll_ready();
00123        Psc0_use_pll_clock();
00124 #   elif (PSC0_PLL_FREQUENCY == 0)
00125        Psc0_use_io_clock();
00126 #   else
00127 #      error (PSC0_PLL_FREQUENCY should be 0, 32, or 64... See config.h file)
00128 #   endif
00129 }
00130 
00131 
00141 void update_psc0 ( Psc_comparison_values *psc0_comparison_values )
00142 {
00143     Lock_psc0_compare_values();
00144     OCR0SAH = HIGH(psc0_comparison_values->deadtime0);
00145     OCR0SAL = LOW (psc0_comparison_values->deadtime0);
00146     OCR0RAH = HIGH(psc0_comparison_values->ontime0);
00147     OCR0RAL = LOW (psc0_comparison_values->ontime0);
00148     OCR0SBH = HIGH(psc0_comparison_values->deadtime1);
00149     OCR0SBL = LOW (psc0_comparison_values->deadtime1);
00150     OCR0RBH = HIGH(psc0_comparison_values->ontime1);
00151     OCR0RBL = LOW (psc0_comparison_values->ontime1);
00152     Update_psc0_compare_values();
00153 }
00154 
00163 void update_psc0_fifty ( Psc_fifty_percent_comparison_values *psc0_fifty_percent_comparison_values )
00164 {
00165     Lock_psc0_compare_values();
00166     OCR0SBH = HIGH(psc0_fifty_percent_comparison_values->deadtime1);
00167     OCR0SBL = LOW (psc0_fifty_percent_comparison_values->deadtime1);
00168     OCR0RBH = HIGH(psc0_fifty_percent_comparison_values->ontime1);
00169     OCR0RBL = LOW (psc0_fifty_percent_comparison_values->ontime1);
00170     Update_psc0_compare_values();
00171 }
00172 #endif // USE_PFC0
00173 
00174 
00175 #ifdef USE_PSC1 
00176 
00177 
00178 
00179 
00180 
00181 
00182 
00183 
00184 void init_psc1(void)
00185 {
00186 #   if (PSC1_PLL_FREQUENCY == 64)
00187        Start_pll_64_mega();
00188 #   elif (PSC1_PLL_FREQUENCY == 32)
00189        Start_pll_32_mega();
00190 #   elif (PSC1_PLL_FREQUENCY == 0)
00191 #   else
00192 #      error (PSC1_PLL_FREQUENCY should be 0, 32, or 64... See config.h file)
00193 #   endif
00194 
00195 #   if (PSC1_OUTPUT_SELECTION == 3)
00196        Enable_both_psc1_outputs();
00197 #   elif (PSC1_OUTPUT_SELECTION == 2)
00198        Enable_pscout11();
00199 #   elif (PSC1_OUTPUT_SELECTION == 1)
00200        Enable_pscout10();
00201 #   elif (PSC1_OUTPUT_SELECTION == 0)
00202        Disable_both_psc1_outputs();
00203 #   else
00204 #      error (PSC1_OUTPUT_SELECTION should be 0, 1, 2, or 2... See config.h file)
00205 #   endif
00206 
00207 #   if (PSC1_ACTIVE_STATE == 1)
00208        Psc1_outputs_active_high();
00209 #   elif (PSC1_ACTIVE_STATE == 0)
00210        Psc1_outputs_active_low();
00211 #   else
00212 #      error (PSC1_ACTIVE_STATE should be 0, or 1... See config.h file)
00213 #   endif
00214 
00215 #   if (PSC1_RAMP_MODE == 4)
00216        Psc1_in_4_ramps_mode();
00217 #   elif (PSC1_RAMP_MODE == 2)
00218        Psc1_in_2_ramps_mode();
00219 #   elif (PSC1_RAMP_MODE == 1)
00220        Psc1_in_1_ramp_mode();
00221 #   elif (PSC1_RAMP_MODE == 0)
00222        Psc1_in_centered_aligned_mode();
00223 #   else
00224 #      error (PSC1_RAMP_MODE should be 0, 1, 3, or 4... See config.h file)
00225 #   endif
00226 
00227 #   if (PSC1_FIFTY_PERCENT_MODE == 1)
00228        Enable_psc1_fifty_percent_mode();
00229 #   elif (PSC1_FIFTY_PERCENT_MODE == 0)
00230        Disable_psc1_fifty_percent_mode();
00231 #   else
00232 #      error (PSC1_FIFTY_PERCENT_MODE should be 0, or 1)
00233 #   endif
00234 
00235 #   if (PSC1_SYMETRICAL_FLANK_WIDTH_MODULATION == 1)
00236        Psc1_symetrical_flank_width_modulation();
00237 #   elif (PSC1_SYMETRICAL_FLANK_WIDTH_MODULATION == 0)
00238        Psc1_end_of_cycle_flank_width_modulation();
00239 #   else
00240 #      error (PSC1_SYMETRICAL_FLANK_WIDTH_MODULATION should be 0, or 1... See config.h file)
00241 #   endif
00242 
00243 #   if (PSC1_AUTOLOCK_MODE == 1)
00244        Enable_psc1_autolock_mode();
00245 #   elif (PSC1_AUTOLOCK_MODE == 0)
00246        Disable_psc1_autolock_mode();
00247 #   else
00248 #      error (PSC1_AUTOLOCK_MODE should be 0, or 1... See config.h file)
00249 #   endif
00250 
00251 #   if (PSC1_PRESCALER_DIVIDER == 64)
00252        Divide_psc1_input_clock_by_64();
00253 #   elif (PSC1_PRESCALER_DIVIDER == 16)
00254        Divide_psc1_input_clock_by_16();
00255 #   elif (PSC1_PRESCALER_DIVIDER == 4)
00256        Divide_psc1_input_clock_by_4();
00257 #   elif (PSC1_PRESCALER_DIVIDER == 0)
00258        Disable_psc1_prescaler();
00259 #   else
00260 #      error (PSC1_PRESCALER_DIVIDER should be 0, 4, 16, or 64... See config.h file)
00261 #   endif
00262 
00263 #   if (PSC1_PLL_FREQUENCY == 64)
00264        Wait_pll_ready();
00265        Psc1_use_pll_clock();
00266 #   elif (PSC1_PLL_FREQUENCY == 32)
00267        Wait_pll_ready();
00268        Psc1_use_pll_clock();
00269 #   elif (PSC1_PLL_FREQUENCY == 0)
00270        Psc1_use_io_clock();
00271 #   else
00272 #      error (PSC1_PLL_FREQUENCY should be 0, 32, or 64... See config.h file)
00273 #   endif
00274 }
00275 
00285 void update_psc1 ( Psc_comparison_values *psc1_comparison_values )
00286 {
00287     Lock_psc1_compare_values();
00288     OCR1SAH = HIGH(psc1_comparison_values->deadtime0);
00289     OCR1SAL = LOW (psc1_comparison_values->deadtime0);
00290     OCR1RAH = HIGH(psc1_comparison_values->ontime0);
00291     OCR1RAL = LOW (psc1_comparison_values->ontime0);
00292     OCR1SBH = HIGH(psc1_comparison_values->deadtime1);
00293     OCR1SBL = LOW (psc1_comparison_values->deadtime1);
00294     OCR1RBH = HIGH(psc1_comparison_values->ontime1);
00295     OCR1RBL = LOW (psc1_comparison_values->ontime1);
00296     Update_psc1_compare_values();
00297 }
00298 
00307 void update_psc1_fifty ( Psc_fifty_percent_comparison_values *psc1_fifty_percent_comparison_values )
00308 {
00309     Lock_psc1_compare_values();
00310     OCR1SBH = HIGH(psc1_fifty_percent_comparison_values->deadtime1);
00311     OCR1SBL = LOW (psc1_fifty_percent_comparison_values->deadtime1);
00312     OCR1RBH = HIGH(psc1_fifty_percent_comparison_values->ontime1);
00313     OCR1RBL = LOW (psc1_fifty_percent_comparison_values->ontime1);
00314     Update_psc1_compare_values();
00315 }
00316 #endif // USE_PSC1
00317 
00318 #ifdef USE_PSC2 
00319 
00320 
00321 
00322 
00323 
00324 
00325 
00326 
00327 void init_psc2(void)
00328 {
00329 #   if (PSC2_PLL_FREQUENCY == 64)
00330        Start_pll_64_mega();
00331 #   elif (PSC2_PLL_FREQUENCY == 32)
00332        Start_pll_32_mega();
00333 #   elif (PSC2_PLL_FREQUENCY == 0)
00334 #   else
00335 #      error (PSC2_PLL_FREQUENCY should be 0, 32, or 64... See config.h file)
00336 #   endif
00337 
00338 #   if (PSC2_OUTPUT_SELECTION == 3)
00339        Enable_both_psc2_outputs();
00340 #   elif (PSC2_OUTPUT_SELECTION == 2)
00341        Enable_pscout21();
00342 #   elif (PSC2_OUTPUT_SELECTION == 1)
00343        Enable_pscout20();
00344 #   elif (PSC2_OUTPUT_SELECTION == 0)
00345        Disable_both_psc2_outputs();
00346 #   else
00347 #      error (PSC2_OUTPUT_SELECTION should be 0, 1, 2, or 2... See config.h file)
00348 #   endif
00349 
00350 #   if (PSC2_ACTIVE_STATE == 1)
00351        Psc2_outputs_active_high();
00352 #   elif (PSC2_ACTIVE_STATE == 0)
00353        Psc2_outputs_active_low();
00354 #   else
00355 #      error (PSC2_ACTIVE_STATE should be 0, or 1... See config.h file)
00356 #   endif
00357 
00358 #   if (PSC2_RAMP_MODE == 4)
00359        Psc2_in_4_ramps_mode();
00360 #   elif (PSC2_RAMP_MODE == 2)
00361        Psc2_in_2_ramps_mode();
00362 #   elif (PSC2_RAMP_MODE == 1)
00363        Psc2_in_1_ramp_mode();
00364 #   elif (PSC2_RAMP_MODE == 0)
00365        Psc2_in_centered_aligned_mode();
00366 #   else
00367 #      error (PSC2_RAMP_MODE should be 0, 1, 3, or 4... See config.h file)
00368 #   endif
00369 
00370 #   if (PSC2_FIFTY_PERCENT_MODE == 1)
00371        Enable_psc2_fifty_percent_mode();
00372 #   elif (PSC2_FIFTY_PERCENT_MODE == 0)
00373        Disable_psc2_fifty_percent_mode();
00374 #   else
00375 #      error (PSC2_FIFTY_PERCENT_MODE should be 0, or 1)
00376 #   endif
00377 
00378 #   if (PSC2_SYMETRICAL_FLANK_WIDTH_MODULATION == 1)
00379        Psc2_symetrical_flank_width_modulation();
00380 #   elif (PSC2_SYMETRICAL_FLANK_WIDTH_MODULATION == 0)
00381        Psc2_end_of_cycle_flank_width_modulation();
00382 #   else
00383 #      error (PSC2_SYMETRICAL_FLANK_WIDTH_MODULATION should be 0, or 1... See config.h file)
00384 #   endif
00385 
00386 #   if (PSC2_AUTOLOCK_MODE == 1)
00387        Enable_psc2_autolock_mode();
00388 #   elif (PSC2_AUTOLOCK_MODE == 0)
00389        Disable_psc2_autolock_mode();
00390 #   else
00391 #      error (PSC2_AUTOLOCK_MODE should be 0, or 1... See config.h file)
00392 #   endif
00393 
00394 #   if (PSC2_PRESCALER_DIVIDER == 64)
00395        Divide_psc2_input_clock_by_64();
00396 #   elif (PSC2_PRESCALER_DIVIDER == 16)
00397        Divide_psc2_input_clock_by_16();
00398 #   elif (PSC2_PRESCALER_DIVIDER == 4)
00399        Divide_psc2_input_clock_by_4();
00400 #   elif (PSC2_PRESCALER_DIVIDER == 0)
00401        Disable_psc2_prescaler();
00402 #   else
00403 #      error (PSC2_PRESCALER_DIVIDER should be 0, 4, 16, or 64... See config.h file)
00404 #   endif
00405 
00406 #   if (PSC2_PLL_FREQUENCY == 64)
00407        Wait_pll_ready();
00408        Psc2_use_pll_clock();
00409 #   elif (PSC2_PLL_FREQUENCY == 32)
00410        Wait_pll_ready();
00411        Psc2_use_pll_clock();
00412 #   elif (PSC2_PLL_FREQUENCY == 0)
00413        Psc2_use_io_clock();
00414 #   else
00415 #      error (PSC2_PLL_FREQUENCY should be 0, 32, or 64... See config.h file)
00416 #   endif
00417 }
00418 
00428 void update_psc2 ( Psc_comparison_values *psc2_comparison_values )
00429 {
00430     Lock_psc2_compare_values();
00431     OCR2SAH = HIGH(psc2_comparison_values->deadtime0);
00432     OCR2SAL = LOW (psc2_comparison_values->deadtime0);
00433     OCR2RAH = HIGH(psc2_comparison_values->ontime0);
00434     OCR2RAL = LOW (psc2_comparison_values->ontime0);
00435     OCR2SBH = HIGH(psc2_comparison_values->deadtime1);
00436     OCR2SBL = LOW (psc2_comparison_values->deadtime1);
00437     OCR2RBH = HIGH(psc2_comparison_values->ontime1);
00438     OCR2RBL = LOW (psc2_comparison_values->ontime1);
00439     Update_psc2_compare_values();
00440 }
00441 
00450 void update_psc2_fifty ( Psc_fifty_percent_comparison_values *psc2_fifty_percent_comparison_values )
00451 {
00452     Lock_psc2_compare_values();
00453     OCR2SBH = HIGH(psc2_fifty_percent_comparison_values->deadtime1);
00454     OCR2SBL = LOW (psc2_fifty_percent_comparison_values->deadtime1);
00455     OCR2RBH = HIGH(psc2_fifty_percent_comparison_values->ontime1);
00456     OCR2RBL = LOW (psc2_fifty_percent_comparison_values->ontime1);
00457     Update_psc2_compare_values();
00458 }
00459 #endif // USE_PSC2

Generated on Wed Jul 12 16:55:10 2006 for Atmel BLDC Sensorless on ATAVRMC100 by  doxygen 1.4.7