Allan Green
/
touchpad
..
my_pwm_out.cpp@0:ff5187998c84, 2013-02-01 (annotated)
- Committer:
- allanalpha
- Date:
- Fri Feb 01 15:24:15 2013 +0000
- Revision:
- 0:ff5187998c84
what ev
Who changed what in which revision?
User | Revision | Line number | New 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 |