mbed with Nintendo DS touchpad, accelerometer & touchpad.

Dependencies:   mbed

Committer:
Clemo
Date:
Wed May 05 12:10:15 2010 +0000
Revision:
0:0a76ae27065b

        

Who changed what in which revision?

UserRevisionLine numberNew 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