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_KLXX) || defined(TARGET_K20D50M)
MartinGurtner 60:8399756e1ba1 2
MartinGurtner 60:8399756e1ba1 3 #include "FastPWM.h"
MartinGurtner 60:8399756e1ba1 4
MartinGurtner 60:8399756e1ba1 5 void FastPWM::initFastPWM( void ) {
MartinGurtner 60:8399756e1ba1 6 bits = 16;
MartinGurtner 60:8399756e1ba1 7 }
MartinGurtner 60:8399756e1ba1 8
MartinGurtner 60:8399756e1ba1 9 void FastPWM::pulsewidth_ticks( uint32_t ticks ) {
MartinGurtner 60:8399756e1ba1 10 *(_pwm.CnV) = ticks;
MartinGurtner 60:8399756e1ba1 11 }
MartinGurtner 60:8399756e1ba1 12
MartinGurtner 60:8399756e1ba1 13 void FastPWM::period_ticks( uint32_t ticks ) {
MartinGurtner 60:8399756e1ba1 14 *(_pwm.MOD) = ticks - 1;
MartinGurtner 60:8399756e1ba1 15 }
MartinGurtner 60:8399756e1ba1 16
MartinGurtner 60:8399756e1ba1 17 uint32_t FastPWM::getPeriod( void ) {
MartinGurtner 60:8399756e1ba1 18 return *(_pwm.MOD) + 1;
MartinGurtner 60:8399756e1ba1 19 }
MartinGurtner 60:8399756e1ba1 20
MartinGurtner 60:8399756e1ba1 21 uint32_t FastPWM::setPrescaler(uint32_t reqScale) {
MartinGurtner 60:8399756e1ba1 22
MartinGurtner 60:8399756e1ba1 23 //Yes this is ugly, yes I should feel bad about it
MartinGurtner 60:8399756e1ba1 24 volatile uint32_t *TPM_SC = _pwm.MOD - 2;
MartinGurtner 60:8399756e1ba1 25
MartinGurtner 60:8399756e1ba1 26 const char prescalers[] = {1, 2, 4, 8, 16, 32, 64, 128};
MartinGurtner 60:8399756e1ba1 27
MartinGurtner 60:8399756e1ba1 28 //If prescaler is 0, return current one
MartinGurtner 60:8399756e1ba1 29 if (reqScale == 0)
MartinGurtner 60:8399756e1ba1 30 return (prescalers[(*TPM_SC) & 0x07]);
MartinGurtner 60:8399756e1ba1 31
MartinGurtner 60:8399756e1ba1 32 uint32_t retval = 0;
MartinGurtner 60:8399756e1ba1 33 char bin;
MartinGurtner 60:8399756e1ba1 34
MartinGurtner 60:8399756e1ba1 35 for (bin = 0; bin<8; bin++) {
MartinGurtner 60:8399756e1ba1 36 retval = prescalers[bin];
MartinGurtner 60:8399756e1ba1 37 if (retval >= reqScale)
MartinGurtner 60:8399756e1ba1 38 break;
MartinGurtner 60:8399756e1ba1 39 }
MartinGurtner 60:8399756e1ba1 40 if (bin == 8)
MartinGurtner 60:8399756e1ba1 41 bin = 7;
MartinGurtner 60:8399756e1ba1 42
MartinGurtner 60:8399756e1ba1 43 //Clear lower 5 bits, write new value:
MartinGurtner 60:8399756e1ba1 44 char clockbits = *TPM_SC & (3<<3);
MartinGurtner 60:8399756e1ba1 45
MartinGurtner 60:8399756e1ba1 46 //For some reason clearing them takes some effort
MartinGurtner 60:8399756e1ba1 47 while ((*TPM_SC & 0x1F) != 0)
MartinGurtner 60:8399756e1ba1 48 *TPM_SC &= ~0x1F;
MartinGurtner 60:8399756e1ba1 49
MartinGurtner 60:8399756e1ba1 50
MartinGurtner 60:8399756e1ba1 51 *TPM_SC = bin + clockbits;
MartinGurtner 60:8399756e1ba1 52
MartinGurtner 60:8399756e1ba1 53 return retval;
MartinGurtner 60:8399756e1ba1 54 }
MartinGurtner 60:8399756e1ba1 55 #endif