#include "fans.h" FanConfig fans[FAN_COUNT]; int8_t current_speed[3]; /** * Initialize the motor system to standby action. */ void fan_init() { // Clear the timer counters and Set up mode TA0CTL |= TASSEL_1 + MC_1 + TACLR; // Set TA_0 to control LFAN,RFAN ACLK, up mode, 10 KHZ TA1CTL |= TASSEL_1 + MC_1 + TACLR; //motor standby intialize TA0CCR0 = PWM_PERIOD-1; // PWM frequency is 624 HZ TA1CCR0 = PWM_PERIOD-1; TA1CCR1 = PWM_PERIOD; TA1CCR2 = PWM_PERIOD; TA0CCR1 = PWM_PERIOD; // PWM duty cycle D=1; TA0CCR2 = PWM_PERIOD; TA0CCR3 = PWM_PERIOD; TA0CCR4 = PWM_PERIOD; P1OUT |= BIT0+BIT1; // p1.0,p1.1 set high TA1CCTL0 = CCIE; // CCR1 reset/set TA1CCTL1 = OUTMOD_7; TA1CCTL1 = OUTMOD_7+CCIE; // CCR1 reset/set TA0CCTL5 = OUTMOD_7; TA1CCTL2 = OUTMOD_7+CCIE; // CCR1 reset/set TA2CCTL6 = OUTMOD_7; TA0CCTL1 = OUTMOD_7; // CCR1 reset/set TA0CCTL1 = OUTMOD_7; TA0CCTL2 = OUTMOD_7; // CCR2 reset/set TA0CCTL3 = OUTMOD_7; // CCR2 reset/set TA0CCTL4 = OUTMOD_7; // CCR2 reset/set // Initialize fan configurations fans[FAN_VERTICAL].ccr0 = &TA1CCR1; fans[FAN_VERTICAL].ccr1 = &TA1CCR2; fans[FAN_LEFT ].ccr0 = &TA0CCR1; fans[FAN_LEFT ].ccr1 = &TA0CCR2; fans[FAN_RIGHT ].ccr0 = &TA0CCR3; fans[FAN_RIGHT ].ccr1 = &TA0CCR4; } /** * Sets a given fan's speed. */ void set_fan(FANS fan_index, int8_t speed) { FanConfig* config = fans + fan_index; if (speed < -4) { // TODO: make directions work *(config->ccr0) = PWM_PERIOD; *(config->ccr1) = PWM_PERIOD - (uint16_t)(((unsigned long)PWM_PERIOD) * -speed / 128); } else if (speed > 4){ *(config->ccr0) = PWM_PERIOD - (uint16_t)(((unsigned long)PWM_PERIOD) * speed / 128); *(config->ccr1) = PWM_PERIOD; } else { speed = 0; *(config->ccr0) = *(config->ccr1) = PWM_PERIOD; } //store the speed which is already set current_speed[fan_index] = speed; } /** * Turn off the fans. */ void fan_stop_all() { int i; for (i = 0; i < FAN_COUNT; i++) { set_fan(i, 0); } } /** * Timer interrupt to turn the vertical fan off. */ #pragma vector=TIMER1_A0_VECTOR __interrupt void TIMER1_A0_ISR(void) { // Turn the vertical fan off P1OUT |= BIT0 + BIT1; } /** * Timer interrupt to turn the vertical fan on. */ #pragma vector=TIMER1_A1_VECTOR __interrupt void TIMER1_A1_ISR(void) { if (TA1IV == 0x02) { P1OUT &= ~BIT0; } else { P1OUT &= ~BIT1; } }