diff options
| author | lynxeyed-atsu <lynxeyed@xj9.so-net.ne.jp> | 2012-05-24 23:44:07 +0900 |
|---|---|---|
| committer | lynxeyed-atsu <lynxeyed@xj9.so-net.ne.jp> | 2012-05-24 23:44:07 +0900 |
| commit | 6b93dda53ce509e95763f2151241dc136c9a1ff5 (patch) | |
| tree | 294e8fcd82d017eb5a995f3dfea3616df4af4bb4 | |
| parent | e60b2d72d02f0200d75bf10932b8cacbb7d0f809 (diff) | |
fixed PWM function which we're able to use GPIO as PWM pins up to 4.
| -rwxr-xr-x | src/core/analogio.cpp | 77 | ||||
| -rwxr-xr-x | src/core/analogio.h | 3 |
2 files changed, 66 insertions, 14 deletions
diff --git a/src/core/analogio.cpp b/src/core/analogio.cpp index 8ac240d..2ce70de 100755 --- a/src/core/analogio.cpp +++ b/src/core/analogio.cpp @@ -1,6 +1,6 @@ #include "analogio.h"
-#define PWM_MAX_PINS 2
+#define PWM_MAX_PINS 4
static int pwm_pin_num[PWM_MAX_PINS]; // PWM出力に使うピン番号を格納する
static int pwm_duty_value[PWM_MAX_PINS]; // それぞれのピンのデューティを格納する
static int pwm_already_inuse = 0; // すでに登録しているピンの数
@@ -16,6 +16,7 @@ void analogWrite(int pinnum, int value) if(pwm_init_done == 0)
{
setup_TIMER16_0();
+ setup_TIMER16_1();
pwm_init_done = 1;
}
@@ -55,8 +56,8 @@ void analogWrite(int pinnum, int value) {
case 0: LPC_TMR16B0->MR1 = pwm_duty_value[i]; break;
case 1: LPC_TMR16B0->MR2 = pwm_duty_value[i]; break;
- //case 2: LPC_TMR16B1->MR1 = pwm_duty_value[i]; break;
- //case 3: LPC_TMR16B1->MR2 = pwm_duty_value[i]; break;
+ case 2: LPC_TMR16B1->MR1 = pwm_duty_value[i]; break;
+ case 3: LPC_TMR16B1->MR2 = pwm_duty_value[i]; break;
default: break;
}
@@ -92,12 +93,35 @@ void setup_TIMER16_0(void) // Start Timer
LPC_TMR16B0->TCR = 1;
- for(int i=0; i < PWM_MAX_PINS; i++) // まだ登録可能
+ for(int i = 0; i < PWM_MAX_PINS; i++) // まだ登録可能
{
pwm_duty_value[i] = -1; // 登録されていないピン
}
}
+void setup_TIMER16_1(void)
+{
+ LPC_SYSCON->SYSAHBCLKCTRL |= (1U << 8);
+
+ // 1周期490Hzで分解能8bit => 約125kHz (125kHz = 48MHz / 382)
+ LPC_TMR16B1->PR = 382; // Pre-Scaler
+
+ LPC_TMR16B1->MR3 = 255; // Interval
+ LPC_TMR16B1->MR2 = 200;
+ LPC_TMR16B1->MR1 = 200;
+ // Interval Interrupt Operation
+ // Clear TC when MR3 match
+ // Interrupt when MR1 reset /MR2 reset /MR3 match
+ LPC_TMR16B1->MCR = ((3U << 9)|(1U << 6)|(1U << 3));
+
+ // Enable Interrupt
+ NVIC_EnableIRQ(TIMER_16_1_IRQn);
+ NVIC_SetPriority(TIMER_16_1_IRQn, 3);
+
+ // Start Timer
+ LPC_TMR16B1->TCR = 1;
+
+}
//===========================
// Timer16 Interrupt Handler
//===========================
@@ -119,18 +143,45 @@ void TIMER16_0_IRQHandler(void) LPC_TMR16B0->IR = (1U << 2);
}
- else if(LPC_TMR16B0->IR & (1U << 3)) //MR3INT
+// Timer16_1
+ if (LPC_TMR16B1->IR & (1U << 1)) //MR1INT = case0
+ {
+ //Do something
+ if(pwm_duty_value[2] != -1) digitalWrite(pwm_pin_num[2],LOW);
+ // Clear Flag
+ LPC_TMR16B1->IR = (1U << 1);
+ }
+
+ if (LPC_TMR16B1->IR & (1U << 2)) //MR2INT = case1
+ {
+ //Do something
+ if(pwm_duty_value[3] != -1) digitalWrite(pwm_pin_num[3],LOW);
+ // Clear Flag
+ LPC_TMR16B1->IR = (1U << 2);
+ }
+
+ if(LPC_TMR16B0->IR & (1U << 3)) //MR3INT
{
- //Do something
- for(int i = 0; i < PWM_MAX_PINS; i++)
- {
- if(pwm_duty_value[i] != -1)
- {
- if(pwm_duty_value[i] > 1) digitalWrite(pwm_pin_num[i],HIGH);
- }
- }
+ if(pwm_duty_value[0] > 1) digitalWrite(pwm_pin_num[0],HIGH);
+ if(pwm_duty_value[1] > 1) digitalWrite(pwm_pin_num[1],HIGH);
+
// Clear Flag
LPC_TMR16B0->IR = (1U << 3);
}
+//Timer1
+ if(LPC_TMR16B1->IR & (1U << 3)) //MR3INT
+ {
+ //Do something
+ if(pwm_duty_value[2] > 1) digitalWrite(pwm_pin_num[2],HIGH);
+ if(pwm_duty_value[3] > 1) digitalWrite(pwm_pin_num[3],HIGH);
+ // Clear Flag
+ LPC_TMR16B1->IR = (1U << 3);
+ }
+}
+
+
+void TIMER16_1_IRQHandler(void)
+{
+ TIMER16_0_IRQHandler();
}
diff --git a/src/core/analogio.h b/src/core/analogio.h index caa7608..62d357f 100755 --- a/src/core/analogio.h +++ b/src/core/analogio.h @@ -35,7 +35,8 @@ void analogWrite(int pinnum, int value); //low level functions for software PWM
void setup_TIMER16_0(void);
void TIMER16_0_IRQHandler(void);
-
+void setup_TIMER16_1(void);
+void TIMER16_1_IRQHandler(void);
#ifdef __cplusplus
}
#endif
|
