00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "config.h"
00016 #include "lib_mcu/psc/psc_drv.h"
00017 #include "lib_mcu/pll/pll_drv.h"
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
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