Fork of the Ben Katz's motor controller firmware.

Committer:
MartinGurtner
Date:
Fri Jan 22 13:10:37 2021 +0000
Revision:
60:8399756e1ba1
.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MartinGurtner 60:8399756e1ba1 1 #if defined(TARGET_KPSDK_MCUS)
MartinGurtner 60:8399756e1ba1 2
MartinGurtner 60:8399756e1ba1 3 #include "FastPWM.h"
MartinGurtner 60:8399756e1ba1 4 #include "fsl_clock_manager.h"
MartinGurtner 60:8399756e1ba1 5
MartinGurtner 60:8399756e1ba1 6
MartinGurtner 60:8399756e1ba1 7 #define PWM_CNV (*(((fastpwm_struct*)fast_obj)->CnV))
MartinGurtner 60:8399756e1ba1 8 #define PWM_MOD (*(((fastpwm_struct*)fast_obj)->MOD))
MartinGurtner 60:8399756e1ba1 9 #define PWM_SC (*(((fastpwm_struct*)fast_obj)->SC))
MartinGurtner 60:8399756e1ba1 10
MartinGurtner 60:8399756e1ba1 11 typedef struct {
MartinGurtner 60:8399756e1ba1 12 __IO uint32_t *CnV;
MartinGurtner 60:8399756e1ba1 13 __IO uint32_t *MOD;
MartinGurtner 60:8399756e1ba1 14 __IO uint32_t *SC;
MartinGurtner 60:8399756e1ba1 15 } fastpwm_struct;
MartinGurtner 60:8399756e1ba1 16
MartinGurtner 60:8399756e1ba1 17 static uint32_t pwm_prescaler;
MartinGurtner 60:8399756e1ba1 18
MartinGurtner 60:8399756e1ba1 19 void FastPWM::initFastPWM( void ) {
MartinGurtner 60:8399756e1ba1 20 fast_obj = new fastpwm_struct;
MartinGurtner 60:8399756e1ba1 21 bits = 16;
MartinGurtner 60:8399756e1ba1 22
MartinGurtner 60:8399756e1ba1 23 uint32_t pwm_base_clock;
MartinGurtner 60:8399756e1ba1 24 CLOCK_SYS_GetFreq(kBusClock, &pwm_base_clock);
MartinGurtner 60:8399756e1ba1 25 pwm_prescaler = SystemCoreClock / pwm_base_clock;
MartinGurtner 60:8399756e1ba1 26
MartinGurtner 60:8399756e1ba1 27 uint32_t ftms[] = FTM_BASE_ADDRS;
MartinGurtner 60:8399756e1ba1 28 unsigned int ch_n = (_pwm.pwm_name & 0xFF);
MartinGurtner 60:8399756e1ba1 29 FTM_Type *ftm = (FTM_Type *)ftms[_pwm.pwm_name >> TPM_SHIFT];
MartinGurtner 60:8399756e1ba1 30
MartinGurtner 60:8399756e1ba1 31 ((fastpwm_struct*)fast_obj)->CnV = &ftm->CONTROLS[ch_n].CnV;
MartinGurtner 60:8399756e1ba1 32 ((fastpwm_struct*)fast_obj)->MOD = &ftm->MOD;
MartinGurtner 60:8399756e1ba1 33 ((fastpwm_struct*)fast_obj)->SC = &ftm->SC;
MartinGurtner 60:8399756e1ba1 34 }
MartinGurtner 60:8399756e1ba1 35
MartinGurtner 60:8399756e1ba1 36 void FastPWM::pulsewidth_ticks( uint32_t ticks ) {
MartinGurtner 60:8399756e1ba1 37 PWM_CNV = ticks;
MartinGurtner 60:8399756e1ba1 38 }
MartinGurtner 60:8399756e1ba1 39
MartinGurtner 60:8399756e1ba1 40 void FastPWM::period_ticks( uint32_t ticks ) {
MartinGurtner 60:8399756e1ba1 41 PWM_MOD = ticks - 1;
MartinGurtner 60:8399756e1ba1 42 }
MartinGurtner 60:8399756e1ba1 43
MartinGurtner 60:8399756e1ba1 44 uint32_t FastPWM::getPeriod( void ) {
MartinGurtner 60:8399756e1ba1 45 return PWM_MOD + 1;
MartinGurtner 60:8399756e1ba1 46 }
MartinGurtner 60:8399756e1ba1 47
MartinGurtner 60:8399756e1ba1 48 uint32_t FastPWM::setPrescaler(uint32_t reqScale) {
MartinGurtner 60:8399756e1ba1 49
MartinGurtner 60:8399756e1ba1 50 uint32_t prescalers[] = {1, 2, 4, 8, 16, 32, 64, 128};
MartinGurtner 60:8399756e1ba1 51
MartinGurtner 60:8399756e1ba1 52 for (int i = 0; i<8; i++)
MartinGurtner 60:8399756e1ba1 53 prescalers[i] = prescalers[i] * pwm_prescaler;
MartinGurtner 60:8399756e1ba1 54
MartinGurtner 60:8399756e1ba1 55 //If prescaler is 0, return current one
MartinGurtner 60:8399756e1ba1 56 if (reqScale == 0)
MartinGurtner 60:8399756e1ba1 57 return (prescalers[(PWM_SC) & 0x07]);
MartinGurtner 60:8399756e1ba1 58
MartinGurtner 60:8399756e1ba1 59 uint32_t retval = 0;
MartinGurtner 60:8399756e1ba1 60 char bin;
MartinGurtner 60:8399756e1ba1 61
MartinGurtner 60:8399756e1ba1 62 for (bin = 0; bin<8; bin++) {
MartinGurtner 60:8399756e1ba1 63 retval = prescalers[bin];
MartinGurtner 60:8399756e1ba1 64 if (retval >= reqScale)
MartinGurtner 60:8399756e1ba1 65 break;
MartinGurtner 60:8399756e1ba1 66 }
MartinGurtner 60:8399756e1ba1 67 if (bin == 8)
MartinGurtner 60:8399756e1ba1 68 bin = 7;
MartinGurtner 60:8399756e1ba1 69
MartinGurtner 60:8399756e1ba1 70 //Clear lower 5 bits, write new value:
MartinGurtner 60:8399756e1ba1 71 char clockbits = PWM_SC & (3<<3);
MartinGurtner 60:8399756e1ba1 72
MartinGurtner 60:8399756e1ba1 73 //For some reason clearing them takes some effort
MartinGurtner 60:8399756e1ba1 74 while ((PWM_SC & 0x1F) != 0)
MartinGurtner 60:8399756e1ba1 75 PWM_SC &= ~0x1F;
MartinGurtner 60:8399756e1ba1 76
MartinGurtner 60:8399756e1ba1 77
MartinGurtner 60:8399756e1ba1 78 PWM_SC = bin + clockbits;
MartinGurtner 60:8399756e1ba1 79
MartinGurtner 60:8399756e1ba1 80 return retval;
MartinGurtner 60:8399756e1ba1 81 }
MartinGurtner 60:8399756e1ba1 82 #endif