// PWM
volatile uint32_tpwmUpTime[6] = { 0, 0, 0, 0, 0, 500000 };
volatile uint32_tpwmDownTime[6] = { 0, 0, 0, 0, 0, 500000 };
//Tacho
uint8_t tachoMuxChannels[TACHO_MUX_NUM] = {TACHO_MUX_PUMP_LEFT, TACHO_MUX_PUMP_RIGHT, TACHO_MUX_FLOW_LEFT, TACHO_MUX_FLOW_RIGHT};
extern uint8_t tachoEdgesRising;
// temperature before and after cooling element in left and right cooling circuit
extern uint16_t tempLeftIn,
tempLeftOut,
tempRightIn,
tempRightOut;
enum CoolingState
{
hold= 0,
faster= 1,
slower= 2,
warning= 3
} CoolingStateLeft = 0, CoolingStateRight = 0;
typedef struct {
__IO uint32_t IR;
__IO uint32_t TCR;
__IO uint32_t TC;
__IO uint32_t PR;
__IO uint32_t PC;
__IO uint32_t MCR;
__IO uint32_t MR0;
__IO uint32_t MR1;
__IO uint32_t MR2;
__IO uint32_t MR3;
__IO uint32_t CCR;
__I uint32_t CR0;
__I uint32_t CR1;
__I uint32_t CR2;
__I uint32_t CR3;
__I uint32_t RESERVED0;
__IO uint32_t MR4;
__IO uint32_t MR5;
__IO uint32_t MR6;
__IO uint32_t PCR;
__IO uint32_t LER;
__I uint32_t RESERVED1[7];
__IO uint32_t CTCR;
} LPC_PWM_T;
volatile uint8_t i = 0;
volatile static uint32_t pwmOut[6] = { 0, 0, 0, 0, 0, 0 };
void PWM1_IRQHandler(void)
{
uint32_t intFlags = 0;
intFlags = LPC_PWM1->IR;
uint32_t time = LPC_PWM1->TC;
if(intFlags & 0b1)
{
intFlags = intFlags & ~(0b1);
pwmOut[0] = !pwmOut[0];
if(pwmOut[0] == 0)
LPC_PWM1->MR0 = time + pwmDownTime[0];
else if(pwmOut[0] == 1)
LPC_PWM1->MR0 = time + pwmUpTime[0];
Chip_GPIO_SetPinState(LPC_GPIO, 1, 26, pwmOut[0]);
}
if(intFlags & 0b10)
{
intFlags = intFlags & ~(0b10);
pwmOut[1] = !pwmOut[1];
if(pwmOut[1] == 0)
LPC_PWM1->MR1 = time + pwmDownTime[1];
else if(pwmOut[1] == 1)
LPC_PWM1->MR1 = time + pwmUpTime[1];
Chip_GPIO_SetPinState(LPC_GPIO, 1, 24, pwmOut[1]);
}
if(intFlags & 0b100)
{
intFlags = intFlags & ~(0b100);
pwmOut[2] = !pwmOut[2];
if(pwmOut[2] == 2)
LPC_PWM1->MR2 = time + pwmDownTime[2];
else if(pwmOut[0] == 1)
LPC_PWM1->MR2 = time + pwmUpTime[2];
Chip_GPIO_SetPinState(LPC_GPIO, 1, 23, pwmOut[2]);
}
if(intFlags & 0b1000)
{
intFlags = intFlags & ~(0b1000);
pwmOut[3] = !pwmOut[3];
if(pwmOut[1] == 0)
LPC_PWM1->MR3 = time + pwmDownTime[3];
else if(pwmOut[1] == 1)
LPC_PWM1->MR3 = time + pwmUpTime[3];
Chip_GPIO_SetPinState(LPC_GPIO, 1, 21, pwmOut[3]);
}
if(intFlags & 0b100000000)
{
intFlags = intFlags & ~(0b100000000);
pwmOut[4] = !pwmOut[4];
if(pwmOut[4] == 4)
LPC_PWM1->MR4 = time + pwmDownTime[4];
else if(pwmOut[0] == 1)
LPC_PWM1->MR4 = time + pwmUpTime[4];
Chip_GPIO_SetPinState(LPC_GPIO, 1, 20, pwmOut[4]);
}
if(intFlags & 0b1000000000)
{
intFlags = intFlags & ~(0b1000000000);
pwmOut[5] = !pwmOut[5];
if(pwmOut[5] == 0)
LPC_PWM1->MR5 = time + pwmDownTime[5];
else if(pwmOut[5] == 1)
LPC_PWM1->MR5 = time + pwmUpTime[5];
Chip_GPIO_SetPinState(LPC_GPIO, 1, 18, pwmOut[5]);
}
}
void pwmInit(uint8_t uBitPattern)
{
Chip_GPIO_GetPinDIR(LPC_GPIO, 1, 26);// Output for PWM0
Chip_GPIO_GetPinDIR(LPC_GPIO, 1, 24);// Output for PWM1
Chip_GPIO_GetPinDIR(LPC_GPIO, 1, 23);// Output for PWM2
Chip_GPIO_GetPinDIR(LPC_GPIO, 1, 21);// Output for PWM3
Chip_GPIO_GetPinDIR(LPC_GPIO, 1, 20);// Output for PWM4
Chip_GPIO_GetPinDIR(LPC_GPIO, 1, 18);// Output for PWM5
Chip_GPIO_SetPinState(LPC_GPIO, 1, 26, 0);// Reset all Pins
Chip_GPIO_SetPinState(LPC_GPIO, 1, 24, 0);
Chip_GPIO_SetPinState(LPC_GPIO, 1, 23, 0);
Chip_GPIO_SetPinState(LPC_GPIO, 1, 21, 0);
Chip_GPIO_SetPinState(LPC_GPIO, 1, 20, 0);
Chip_GPIO_SetPinState(LPC_GPIO, 1, 18, 0);
Chip_IOCON_EnableOD(LPC_IOCON, 1, 26);// Enable open drain mode for all pins
Chip_IOCON_EnableOD(LPC_IOCON, 1, 24);
Chip_IOCON_EnableOD(LPC_IOCON, 1, 23);
Chip_IOCON_EnableOD(LPC_IOCON, 1, 21);
Chip_IOCON_EnableOD(LPC_IOCON, 1, 20);
Chip_IOCON_EnableOD(LPC_IOCON, 1, 18);
LPC_SYSCTL->PCONP |= (1 << 6);// Enable Clock
LPC_SYSCTL->PCLKSEL[0] |= (3 << 12);// Peripheral Clock Selection for PWM
LPC_PWM1->TCR = (1 << 1);// Reset Timer Counter and PWM Prescale Counter
LPC_PWM1->PR = 1000;// TC is incremented every PR+1 cycles of PCLK
LPC_PWM1->MR0 = pwmDownTime[0];
LPC_PWM1->MR1 = pwmDownTime[1];
LPC_PWM1->MR2 = pwmDownTime[2];
LPC_PWM1->MR3 = pwmDownTime[3];
LPC_PWM1->MR4 = pwmDownTime[4];
LPC_PWM1->MR5 = pwmDownTime[5];
LPC_PWM1->MR6 = 0;// Reset value
LPC_PWM1->MCR = ( (1 << 0) | (1 << 3) | // Interrupts on PWMMR0, when PWMMR0 matches PWMTC
(1 << 6) | (1 << 9) |
(1 << 12) | (1 << 15) );
LPC_PWM1->PCR = (1 << 9) | (1 << 10) |// Enable PWM Output (perhaps i have to set it to 0
(1 << 11) | (1 << 12) |
(1 << 13) | (1 << 14);
LPC_PWM1->LER = (1 << 0) | (1 << 1) |// Enable PWM Latch (perhaps i have to set it to 0
(1 << 2) | (1 << 3) |
(1 << 4) | (1 << 5);
NVIC_EnableIRQ(PWM1_IRQn);
}
void pwmStart(uint8_t uBitPattern)
{
LPC_PWM1->TCR = (1 << 0) | (1 << 3);// Enable Counter and Enable PWM
} |