..

Dependencies:   mbed

Committer:
allanalpha
Date:
Fri Feb 01 15:24:15 2013 +0000
Revision:
0:ff5187998c84
what ev

Who changed what in which revision?

UserRevisionLine numberNew contents of line
allanalpha 0:ff5187998c84 1 /*
allanalpha 0:ff5187998c84 2 mbed touchpad & accelerometer experiments.
allanalpha 0:ff5187998c84 3
allanalpha 0:ff5187998c84 4 CPV, 14/09/2009
allanalpha 0:ff5187998c84 5 */
allanalpha 0:ff5187998c84 6
allanalpha 0:ff5187998c84 7
allanalpha 0:ff5187998c84 8 #include "my_pwm_out.h"
allanalpha 0:ff5187998c84 9
allanalpha 0:ff5187998c84 10
allanalpha 0:ff5187998c84 11 using namespace mbed;
allanalpha 0:ff5187998c84 12
allanalpha 0:ff5187998c84 13
allanalpha 0:ff5187998c84 14 MyPwmOut::MyPwmOut(PinName pin, const char *name) : PwmOut(pin,name)
allanalpha 0:ff5187998c84 15 {
allanalpha 0:ff5187998c84 16 m_channel = (pin&0x0000001f) + 1; // Between 1 and 6.
allanalpha 0:ff5187998c84 17 m_p_mrx = (uint32_t *)&LPC_PWM1->MR0 + m_channel; // Select MRx register for this channel.
allanalpha 0:ff5187998c84 18 if (m_channel>=4) m_p_mrx += 6; // Skip CR registers if needed.
allanalpha 0:ff5187998c84 19 m_pclk = get_pclk();
allanalpha 0:ff5187998c84 20 }
allanalpha 0:ff5187998c84 21
allanalpha 0:ff5187998c84 22
allanalpha 0:ff5187998c84 23 float MyPwmOut::get_pclk(void)
allanalpha 0:ff5187998c84 24 {
allanalpha 0:ff5187998c84 25 float Fin = 12000000; // From the mbed schematic.
allanalpha 0:ff5187998c84 26 uint32_t m = 1 + (LPC_SC->PLL0STAT&0x00007fff);
allanalpha 0:ff5187998c84 27 uint32_t n = 1 + ((LPC_SC->PLL0STAT&0x00ff0000)>>16);
allanalpha 0:ff5187998c84 28 float Fcco = 2*m*Fin/n; // PLL frequency.
allanalpha 0:ff5187998c84 29 float cclk = Fcco/(1+(LPC_SC->CCLKCFG&0x000000ff)); // Get CCLK from Fcco.
allanalpha 0:ff5187998c84 30
allanalpha 0:ff5187998c84 31 m_pclk = cclk/4;
allanalpha 0:ff5187998c84 32 switch ((LPC_SC->PCLKSEL0&0x00003000)>>12)
allanalpha 0:ff5187998c84 33 {
allanalpha 0:ff5187998c84 34 case 0: m_pclk = cclk/4; break;
allanalpha 0:ff5187998c84 35 case 1: m_pclk = cclk; break;
allanalpha 0:ff5187998c84 36 case 2: m_pclk = cclk/2; break;
allanalpha 0:ff5187998c84 37 case 3: m_pclk = cclk/8; break;
allanalpha 0:ff5187998c84 38 }
allanalpha 0:ff5187998c84 39
allanalpha 0:ff5187998c84 40 //printf("Fin = %0.0f\n",Fin);
allanalpha 0:ff5187998c84 41 //printf("m = %d, n = %d\n",m,n);
allanalpha 0:ff5187998c84 42 //printf("Fcco = %0.0f\n",Fcco);
allanalpha 0:ff5187998c84 43 //printf("CLKC = %0.0f\n",cclk);
allanalpha 0:ff5187998c84 44 //printf("PLCK = %0.0f\n",m_pclk);
allanalpha 0:ff5187998c84 45
allanalpha 0:ff5187998c84 46 return m_pclk;
allanalpha 0:ff5187998c84 47 }
allanalpha 0:ff5187998c84 48
allanalpha 0:ff5187998c84 49
allanalpha 0:ff5187998c84 50 void MyPwmOut::set(float period, float duty_cycle)
allanalpha 0:ff5187998c84 51 {
allanalpha 0:ff5187998c84 52 LPC_PWM1->MR0 = period*m_pclk; // Set new period in seconds.
allanalpha 0:ff5187998c84 53 *m_p_mrx = duty_cycle * LPC_PWM1->MR0; // Set new duty-cycle.
allanalpha 0:ff5187998c84 54 LPC_PWM1->LER |= (1<<m_channel)|1; // Use MRx & MR0 value on next TC reset.
allanalpha 0:ff5187998c84 55 }
allanalpha 0:ff5187998c84 56