LPC800-MAX RGB demo using SCT and MRT

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SCT_PWM.cpp Source File

SCT_PWM.cpp

00001 #include "SCT_PWM.h"
00002 
00003 #define BIT_ON(A) (1<<A)
00004 
00005 // http://www.lpcware.com/content/nxpfile/lpc80-sct-cookbook-and-tutorial-code-examples
00006 
00007 SCT_PWM::SCT_PWM(int pin, int channel) : ch(channel)
00008 {
00009     static bool insted = false;
00010 
00011     if (!insted) {
00012         inst();
00013         insted = true;
00014     }
00015     swm(pin);
00016 
00017     LPC_SCT->EVENT[ch + 1].STATE = LPC_SCT->EVENT[0].STATE;
00018     LPC_SCT->EVENT[ch + 1].CTRL = LPC_SCT->EVENT[0].CTRL | (ch+1)<<0; // match 1...5
00019 
00020     LPC_SCT->OUT[ch].SET = BIT_ON(0); // event 0
00021     LPC_SCT->OUT[ch].CLR = BIT_ON(ch+1); // event 1...5
00022 }
00023 
00024 void SCT_PWM::inst()
00025 {
00026     LPC_SYSCON->SYSAHBCLKCTRL |= (1<<8); // enable SCT
00027     LPC_SYSCON->PRESETCTRL |= (1<<8); // reset SCT
00028 
00029     LPC_SCT->EVENT[0].STATE = BIT_ON(0); // state 0
00030     LPC_SCT->EVENT[0].CTRL = (1<<12) | (1<<14);
00031 
00032     LPC_SCT->LIMIT_L |= BIT_ON(0); // event 0
00033 
00034     LPC_SCT->CONFIG |= (1<<0) | (1<<17); // unify, auto limit
00035     LPC_SCT->CTRL_L |= (SystemCoreClock/1000000-1)<<5; // set prescaler, SCT clock = 1 MHz
00036 
00037     LPC_SCT->CTRL_L &= ~(1<<2); // unhalt it by clearing bit 2 of CTRL reg
00038 }
00039 
00040 void SCT_PWM::swm(int pin)
00041 {
00042     switch(ch) {
00043         case 0: // CTOUT_0
00044             LPC_SWM->PINASSIGN6 = (LPC_SWM->PINASSIGN6 & 0x00ffffff) | pin<<24;
00045             break;
00046         case 1: // CTOUT_1
00047             LPC_SWM->PINASSIGN7 = (LPC_SWM->PINASSIGN7 & 0xffffff00) | pin<<0;
00048             break;
00049         case 2: // CTOUT_2
00050             LPC_SWM->PINASSIGN7 = (LPC_SWM->PINASSIGN7 & 0xffff00ff) | pin<<8;
00051             break;
00052         case 3: // CTOUT_3
00053             LPC_SWM->PINASSIGN7 = (LPC_SWM->PINASSIGN7 & 0xff00ffff) | pin<<16;
00054             break;
00055     }
00056 }
00057 
00058 void SCT_PWM::period(float seconds)
00059 {
00060     period_us(seconds * 1000000);
00061 }
00062 
00063 void SCT_PWM::period_ms(int ms)
00064 {
00065     period_us(ms * 1000);
00066 }
00067 
00068 void SCT_PWM::period_us(int us)
00069 {
00070     LPC_SCT->MATCHREL[0].U = us - 1;
00071 }
00072 
00073 void SCT_PWM::pulsewidth(float seconds)
00074 {
00075     pulsewidth_us(seconds * 1000000);
00076 }
00077 
00078 void SCT_PWM::pulsewidth_ms(int ms)
00079 {
00080     pulsewidth_us(ms * 1000);
00081 }
00082 
00083 void SCT_PWM::pulsewidth_us(int us)
00084 {
00085     LPC_SCT->MATCHREL[ch + 1].U = us;
00086 }
00087 
00088 void SCT_PWM::write(float value)
00089 {
00090     LPC_SCT->MATCHREL[ch + 1].U = value * LPC_SCT->MATCHREL[0].U;
00091 }
00092 
00093 float SCT_PWM::read()
00094 {
00095     if (LPC_SCT->MATCHREL[0].U == 0) {
00096         return 0.0;
00097     }
00098     return (float)LPC_SCT->MATCHREL[ch + 1].U / LPC_SCT->MATCHREL[0].U;
00099 }