FastPWM clone
Device/FastPWM_KSDK.cpp@31:10e2e171f430, 2016-09-06 (annotated)
- Committer:
- Sissors
- Date:
- Tue Sep 06 20:17:21 2016 +0000
- Revision:
- 31:10e2e171f430
- Parent:
- 14:b30038fbba51
- Child:
- 33:2ca2e47f9650
Temporary fix for K64F with new mbed lib:
; 1. KSDK funtions changed (fixed)
; 2. Mbed uses a completely different mode for the PWM, which screws up my code. (Temp fix, don't call write directly after setting a new period, but wait 1 pwm period)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Sissors | 14:b30038fbba51 | 1 | #if defined(TARGET_KPSDK_MCUS) |
Sissors | 14:b30038fbba51 | 2 | |
Sissors | 14:b30038fbba51 | 3 | #include "FastPWM.h" |
Sissors | 31:10e2e171f430 | 4 | #include "fsl_ftm.h" |
Sissors | 14:b30038fbba51 | 5 | |
Sissors | 14:b30038fbba51 | 6 | |
Sissors | 14:b30038fbba51 | 7 | #define PWM_CNV (*(((fastpwm_struct*)fast_obj)->CnV)) |
Sissors | 14:b30038fbba51 | 8 | #define PWM_MOD (*(((fastpwm_struct*)fast_obj)->MOD)) |
Sissors | 14:b30038fbba51 | 9 | #define PWM_SC (*(((fastpwm_struct*)fast_obj)->SC)) |
Sissors | 14:b30038fbba51 | 10 | |
Sissors | 14:b30038fbba51 | 11 | typedef struct { |
Sissors | 14:b30038fbba51 | 12 | __IO uint32_t *CnV; |
Sissors | 14:b30038fbba51 | 13 | __IO uint32_t *MOD; |
Sissors | 14:b30038fbba51 | 14 | __IO uint32_t *SC; |
Sissors | 14:b30038fbba51 | 15 | } fastpwm_struct; |
Sissors | 14:b30038fbba51 | 16 | |
Sissors | 14:b30038fbba51 | 17 | static uint32_t pwm_prescaler; |
Sissors | 31:10e2e171f430 | 18 | static FTM_Type *const ftm_addrs[] = FTM_BASE_PTRS; |
Sissors | 14:b30038fbba51 | 19 | |
Sissors | 14:b30038fbba51 | 20 | void FastPWM::initFastPWM( void ) { |
Sissors | 14:b30038fbba51 | 21 | fast_obj = new fastpwm_struct; |
Sissors | 14:b30038fbba51 | 22 | bits = 16; |
Sissors | 31:10e2e171f430 | 23 | |
Sissors | 31:10e2e171f430 | 24 | pwm_prescaler = SystemCoreClock / CLOCK_GetFreq(kCLOCK_BusClk);; |
Sissors | 14:b30038fbba51 | 25 | |
Sissors | 31:10e2e171f430 | 26 | unsigned int ch_n = (_pwm.pwm_name & 0xF); |
Sissors | 31:10e2e171f430 | 27 | FTM_Type *ftm = ftm_addrs[_pwm.pwm_name >> TPM_SHIFT]; |
Sissors | 14:b30038fbba51 | 28 | |
Sissors | 14:b30038fbba51 | 29 | ((fastpwm_struct*)fast_obj)->CnV = &ftm->CONTROLS[ch_n].CnV; |
Sissors | 14:b30038fbba51 | 30 | ((fastpwm_struct*)fast_obj)->MOD = &ftm->MOD; |
Sissors | 14:b30038fbba51 | 31 | ((fastpwm_struct*)fast_obj)->SC = &ftm->SC; |
Sissors | 14:b30038fbba51 | 32 | } |
Sissors | 14:b30038fbba51 | 33 | |
Sissors | 14:b30038fbba51 | 34 | void FastPWM::pulsewidth_ticks( uint32_t ticks ) { |
Sissors | 14:b30038fbba51 | 35 | PWM_CNV = ticks; |
Sissors | 31:10e2e171f430 | 36 | |
Sissors | 31:10e2e171f430 | 37 | //Temporary work around until I figure out which settings mbed screwed up in this update |
Sissors | 31:10e2e171f430 | 38 | FTM_Type *ftm = ftm_addrs[_pwm.pwm_name >> TPM_SHIFT]; |
Sissors | 31:10e2e171f430 | 39 | FTM_SetSoftwareTrigger(ftm, true); |
Sissors | 14:b30038fbba51 | 40 | } |
Sissors | 14:b30038fbba51 | 41 | |
Sissors | 14:b30038fbba51 | 42 | void FastPWM::period_ticks( uint32_t ticks ) { |
Sissors | 14:b30038fbba51 | 43 | PWM_MOD = ticks - 1; |
Sissors | 14:b30038fbba51 | 44 | } |
Sissors | 14:b30038fbba51 | 45 | |
Sissors | 14:b30038fbba51 | 46 | uint32_t FastPWM::getPeriod( void ) { |
Sissors | 14:b30038fbba51 | 47 | return PWM_MOD + 1; |
Sissors | 14:b30038fbba51 | 48 | } |
Sissors | 14:b30038fbba51 | 49 | |
Sissors | 14:b30038fbba51 | 50 | uint32_t FastPWM::setPrescaler(uint32_t reqScale) { |
Sissors | 14:b30038fbba51 | 51 | |
Sissors | 14:b30038fbba51 | 52 | uint32_t prescalers[] = {1, 2, 4, 8, 16, 32, 64, 128}; |
Sissors | 14:b30038fbba51 | 53 | |
Sissors | 14:b30038fbba51 | 54 | for (int i = 0; i<8; i++) |
Sissors | 14:b30038fbba51 | 55 | prescalers[i] = prescalers[i] * pwm_prescaler; |
Sissors | 14:b30038fbba51 | 56 | |
Sissors | 14:b30038fbba51 | 57 | //If prescaler is 0, return current one |
Sissors | 14:b30038fbba51 | 58 | if (reqScale == 0) |
Sissors | 14:b30038fbba51 | 59 | return (prescalers[(PWM_SC) & 0x07]); |
Sissors | 14:b30038fbba51 | 60 | |
Sissors | 14:b30038fbba51 | 61 | uint32_t retval = 0; |
Sissors | 14:b30038fbba51 | 62 | char bin; |
Sissors | 14:b30038fbba51 | 63 | |
Sissors | 14:b30038fbba51 | 64 | for (bin = 0; bin<8; bin++) { |
Sissors | 14:b30038fbba51 | 65 | retval = prescalers[bin]; |
Sissors | 14:b30038fbba51 | 66 | if (retval >= reqScale) |
Sissors | 14:b30038fbba51 | 67 | break; |
Sissors | 14:b30038fbba51 | 68 | } |
Sissors | 14:b30038fbba51 | 69 | if (bin == 8) |
Sissors | 14:b30038fbba51 | 70 | bin = 7; |
Sissors | 14:b30038fbba51 | 71 | |
Sissors | 14:b30038fbba51 | 72 | //Clear lower 5 bits, write new value: |
Sissors | 14:b30038fbba51 | 73 | char clockbits = PWM_SC & (3<<3); |
Sissors | 14:b30038fbba51 | 74 | |
Sissors | 14:b30038fbba51 | 75 | //For some reason clearing them takes some effort |
Sissors | 14:b30038fbba51 | 76 | while ((PWM_SC & 0x1F) != 0) |
Sissors | 14:b30038fbba51 | 77 | PWM_SC &= ~0x1F; |
Sissors | 14:b30038fbba51 | 78 | |
Sissors | 14:b30038fbba51 | 79 | |
Sissors | 14:b30038fbba51 | 80 | PWM_SC = bin + clockbits; |
Sissors | 14:b30038fbba51 | 81 | |
Sissors | 14:b30038fbba51 | 82 | return retval; |
Sissors | 14:b30038fbba51 | 83 | } |
Sissors | 14:b30038fbba51 | 84 | #endif |