// 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 } |