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