Ben Katz / FastPWM3

Dependents:   qonly_controller foc-ed_in_the_bot_compact foc-ed_in_the_bot_compact CurrentModeSine ... more

Fork of FastPWM by Erik -

Committer:
Sissors
Date:
Wed Jul 25 07:14:39 2012 +0000
Revision:
3:3094d3806cfc
Parent:
2:4b8de6ae5885
Fixed clk_sel, latch registers and constant duty when changing period

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sissors 0:f8c1b0ad5371 1 #include "FastPWM.h"
Sissors 0:f8c1b0ad5371 2
Sissors 0:f8c1b0ad5371 3 FastPWM::FastPWM(PinName pin) : PWMObject(pin){
Sissors 3:3094d3806cfc 4 //Set clock source
Sissors 3:3094d3806cfc 5 LPC_SC->PCLKSEL0|=1<<12;
Sissors 3:3094d3806cfc 6
Sissors 0:f8c1b0ad5371 7 _duty=0;
Sissors 0:f8c1b0ad5371 8 _period=0.02;
Sissors 3:3094d3806cfc 9 if (pin==p26||pin==LED1) {
Sissors 3:3094d3806cfc 10 PWMUnit=1;
Sissors 0:f8c1b0ad5371 11 MR=&LPC_PWM1->MR1;
Sissors 3:3094d3806cfc 12 }
Sissors 3:3094d3806cfc 13 else if (pin==p25||pin==LED2){
Sissors 3:3094d3806cfc 14 PWMUnit=2;
Sissors 0:f8c1b0ad5371 15 MR=&LPC_PWM1->MR2;
Sissors 3:3094d3806cfc 16 }
Sissors 3:3094d3806cfc 17 else if (pin==p24||pin==LED3){
Sissors 3:3094d3806cfc 18 PWMUnit=3;
Sissors 0:f8c1b0ad5371 19 MR=&LPC_PWM1->MR3;
Sissors 3:3094d3806cfc 20 }
Sissors 3:3094d3806cfc 21 else if (pin==p23||pin==LED4){
Sissors 3:3094d3806cfc 22 PWMUnit=4;
Sissors 0:f8c1b0ad5371 23 MR=&LPC_PWM1->MR4;
Sissors 3:3094d3806cfc 24 }
Sissors 3:3094d3806cfc 25 else if (pin==p22){
Sissors 3:3094d3806cfc 26 PWMUnit=5;
Sissors 0:f8c1b0ad5371 27 MR=&LPC_PWM1->MR5;
Sissors 3:3094d3806cfc 28 }
Sissors 3:3094d3806cfc 29 else if (pin==p21){
Sissors 3:3094d3806cfc 30 PWMUnit=6;
Sissors 0:f8c1b0ad5371 31 MR=&LPC_PWM1->MR6;
Sissors 3:3094d3806cfc 32 }
Sissors 0:f8c1b0ad5371 33 else
Sissors 0:f8c1b0ad5371 34 error("No hardware PWM pin\n\r");
Sissors 0:f8c1b0ad5371 35
Sissors 0:f8c1b0ad5371 36 period(_period);
Sissors 0:f8c1b0ad5371 37 }
Sissors 0:f8c1b0ad5371 38
Sissors 0:f8c1b0ad5371 39 void FastPWM::period(double seconds) {
Sissors 0:f8c1b0ad5371 40 LPC_PWM1->MR0 = (unsigned int) (seconds * (double)F_CLK);
Sissors 3:3094d3806cfc 41 LPC_PWM1->LER |= 1;
Sissors 0:f8c1b0ad5371 42 _period = seconds;
Sissors 3:3094d3806cfc 43 pulsewidth(_duty*_period);
Sissors 0:f8c1b0ad5371 44 }
Sissors 0:f8c1b0ad5371 45
Sissors 0:f8c1b0ad5371 46 void FastPWM::period_ms(int ms) {
Sissors 2:4b8de6ae5885 47 period((double)ms/1000.0);
Sissors 0:f8c1b0ad5371 48 }
Sissors 0:f8c1b0ad5371 49
Sissors 0:f8c1b0ad5371 50 void FastPWM::period_us(int us) {
Sissors 2:4b8de6ae5885 51 period((double)us/1000000.0);
Sissors 0:f8c1b0ad5371 52 }
Sissors 0:f8c1b0ad5371 53
Sissors 0:f8c1b0ad5371 54 void FastPWM::period_us(double us) {
Sissors 2:4b8de6ae5885 55 period(us/1000000.0);
Sissors 0:f8c1b0ad5371 56 }
Sissors 0:f8c1b0ad5371 57
Sissors 0:f8c1b0ad5371 58 void FastPWM::pulsewidth(double seconds) {
Sissors 0:f8c1b0ad5371 59 *MR=(unsigned int) (seconds * (double)F_CLK);
Sissors 3:3094d3806cfc 60 LPC_PWM1->LER |= 1<<PWMUnit;
Sissors 3:3094d3806cfc 61 _duty=seconds/_period;
Sissors 0:f8c1b0ad5371 62 }
Sissors 0:f8c1b0ad5371 63
Sissors 0:f8c1b0ad5371 64 void FastPWM::pulsewidth_ms(int ms) {
Sissors 2:4b8de6ae5885 65 pulsewidth((double)ms/1000.0);
Sissors 0:f8c1b0ad5371 66 }
Sissors 0:f8c1b0ad5371 67
Sissors 0:f8c1b0ad5371 68 void FastPWM::pulsewidth_us(int us) {
Sissors 2:4b8de6ae5885 69 pulsewidth((double)us/1000000.0);
Sissors 0:f8c1b0ad5371 70 }
Sissors 0:f8c1b0ad5371 71
Sissors 0:f8c1b0ad5371 72 void FastPWM::pulsewidth_us(double us) {
Sissors 2:4b8de6ae5885 73 pulsewidth(us/1000000.0);
Sissors 0:f8c1b0ad5371 74 }
Sissors 0:f8c1b0ad5371 75
Sissors 0:f8c1b0ad5371 76 void FastPWM::write(double duty) {
Sissors 0:f8c1b0ad5371 77 _duty=duty;
Sissors 0:f8c1b0ad5371 78 pulsewidth(duty*_period);
Sissors 0:f8c1b0ad5371 79 }
Sissors 0:f8c1b0ad5371 80
Sissors 0:f8c1b0ad5371 81 double FastPWM::read( void ) {
Sissors 0:f8c1b0ad5371 82 return _duty;
Sissors 0:f8c1b0ad5371 83 }
Sissors 0:f8c1b0ad5371 84
Sissors 0:f8c1b0ad5371 85 FastPWM & FastPWM::operator= (double value) {
Sissors 0:f8c1b0ad5371 86 write(value);
Sissors 0:f8c1b0ad5371 87 return(*this);
Sissors 0:f8c1b0ad5371 88 }
Sissors 0:f8c1b0ad5371 89
Sissors 0:f8c1b0ad5371 90 FastPWM::operator double() {
Sissors 0:f8c1b0ad5371 91 return _duty;
Sissors 0:f8c1b0ad5371 92 }
Sissors 0:f8c1b0ad5371 93