LPC812 PWM

题:LPC812 输出两路2Mhz PWM方波,死区时间<50ns.

系统时钟设置30Mhz(MSEL = 00100b, PSEL = 01b); The SCTimer clock set to equal system clock, so the PWM period should be 15 clk period, i.e. Tpwm = 30/2 = 15; and then each PWM pulse width is half:

 LPC_SCT->MATCH[0].L = 15; // match on (half) PWM period
 LPC_SCT->MATCHREL[0].L = 15;
 LPC_SCT->MATCH[1].L = 6; // match on duty cycle 1
 LPC_SCT->MATCHREL[1].L = 6;
 LPC_SCT->MATCH[2].L = 8; // match on duty cycle 2
 LPC_SCT->MATCHREL[2].L = 8;

There are also an ABORT pin which could be use as a brake function. But I do not use this function and I do not configure this pin. The finally code as below:

 /* Generic Initialization */
 SystemCoreClockUpdate();
 
 LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 8);                 // enable the SCT clock
 LPC_SWM->PINASSIGN[6] = 0x07FFFFFF;//p0.7
 LPC_SWM->PINASSIGN[7] = 0xFFFFFF06; //p0.6
 
 LPC_SCT->CONFIG |= (1 << 17); // split timers, auto limit
// LPC_SCT->CTRL_L |= (SystemCoreClock/10000000-1) << 5; // configure SCT1 as BIDIR
 LPC_SCT->CTRL_L |= (1 << 4); // configure SCT1 as BIDIR
 
 LPC_SCT->MATCH[0].L = 15; // match on (half) PWM period
 LPC_SCT->MATCHREL[0].L = 15;
 LPC_SCT->MATCH[1].L = 6; // match on duty cycle 1
 LPC_SCT->MATCHREL[1].L = 6;
 LPC_SCT->MATCH[2].L = 8; // match on duty cycle 2
 LPC_SCT->MATCHREL[2].L = 8;
 
 //simple function of pwm with deadtime
 LPC_SCT->EV[0].STATE = 0xFFFFFFFF; // event 2 happens in all states
 LPC_SCT->EV[0].CTRL = (1 << 0) | (1 << 12); // match 1 (DC1) only condition
 
 LPC_SCT->EV[1].STATE = 0xFFFFFFFF; // event 3 happens in all states
 LPC_SCT->EV[1].CTRL = (2 << 0) | (1 << 12); // match 2 (DC2) only condition
 
 LPC_SCT->OUT[0].SET = (1 << 0); // event 0 set OUT0 (blue LED)
 LPC_SCT->OUT[0].CLR = (1 << 0); // event 0 clears OUT0 (blue LED)
 
 LPC_SCT->OUT[1].SET = (1 << 1); // event 1 sets OUT1 (red LED)
 LPC_SCT->OUT[1].CLR = (1 << 1); // event 1 clear OUT1 (red LED)
 
 LPC_SCT->RES |= 0x0000000F; // toggle OUT0 and OUT1 on conflict
 LPC_SCT->OUTPUT |= 1; // default set OUT0 and clear OUT1
 
 LPC_SCT->CTRL_L &= ~(1 << 2); // start timer

OR LIKE THIS:

 /* Generic Initialization */
 SystemCoreClockUpdate();
 
 LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 8);                 // enable the SCT clock
 LPC_SWM->PINASSIGN[6] = 0x07FFFFFF;//p0.7
 LPC_SWM->PINASSIGN[7] = 0xFFFFFF06; //p0.6
 LPC_SCT->CONFIG |= (1 << 17); // split timers, auto limit
 LPC_SCT->CTRL_L |= (1 << 4); // configure SCT1 as BIDIR
 
 LPC_SCT->MATCH[0].L = 15; // match on (half) PWM period
 LPC_SCT->MATCHREL[0].L = 15;
 LPC_SCT->MATCH[1].L = 6; // match on duty cycle 1
 LPC_SCT->MATCHREL[1].L = 6;
 LPC_SCT->MATCH[2].L = 8; // match on duty cycle 2
 LPC_SCT->MATCHREL[2].L = 8;
 
 //full function of pwm with deadtime
 LPC_SCT->EV[0].STATE = 0xFFFFFFFF; // event 0 happens in all states
 LPC_SCT->EV[0].CTRL = (2 << 10) | (2 << 12); // IN_0 falling edge only condition
 
 LPC_SCT->EV[1].STATE = 0xFFFFFFFF; // event 1 happens in all states
 LPC_SCT->EV[1].CTRL = (1 << 10) | (2 << 12); // IN_0 rising edge only condition
 
 LPC_SCT->EV[2].STATE = 0xFFFFFFFF; // event 2 happens in all states
 LPC_SCT->EV[2].CTRL = (1 << 0) | (1 << 12); // match 1 (DC1) only condition
 
 LPC_SCT->EV[3].STATE = 0xFFFFFFFF; // event 3 happens in all states
 LPC_SCT->EV[3].CTRL = (2 << 0) | (1 << 12); // match 2 (DC2) only condition
 
 LPC_SCT->OUT[0].SET = (1 << 0) | (1 << 2); // event 0 and 2 set OUT0 (blue LED)
 LPC_SCT->OUT[0].CLR = (1 << 2); // event 2 clears OUT0 (blue LED)
 
 LPC_SCT->OUT[1].SET = (1 << 3); // event 3 sets OUT1 (red LED)
 LPC_SCT->OUT[1].CLR = (1 << 0) | (1 << 3); // event 0 and 3 clear OUT1 (red LED)
 
 LPC_SCT->RES |= 0x0000000F; // toggle OUT0 and OUT1 on conflict
 LPC_SCT->OUTPUT |= 1; // default set OUT0 and clear OUT1
 
 LPC_SCT->STOP_L = (1 << 0); // event 0 will stop the timer
 LPC_SCT->EVEN = (1 << 1); // event 1 will generate an irq
 
 NVIC_EnableIRQ(SCT_IRQn); // enable SCTx interrupt
 LPC_SCT->CTRL_L &= ~(1 << 2); // start timer

Work finish! The result as the picture below:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值