//////////////////////////////////////////////////////////////////////////////// /// Three Phase PWM Control for AC Induction Motor /// /// by /// /// Larry E Himes Jr /// /// April 30, 2012 /// /// /// /// ECET 581 Applied Electronic Drives /// /// /// /// PIN A0 - AN0 is used for the Closed Loop Feedback /// /// PIN A1 - AN1 is used for User Speed Control Input /// /// PIN C3 - User Direction Control Switch Input /// /// /// /// Frequency Range Control from 20Hz to 120Hz /// /// /// /// Thirteen Samples per PWM Sine Wave Output /// /// /// //////////////////////////////////////////////////////////////////////////////// #include <18f4431.h> #device adc=10 #fuses INTRC_IO,NOWDT,NOPROTECT,NOMCLR #use delay(clock=8000000) void main() { int16 adc_val; // ADC Variable int16 period; // PWM Time Period Variable int16 feedbackI; // Feedback Varaiable int16 feedbackL; // Feedback Variable int16 adjust; // Speed Adjust Variable int16 speed; // Speed Control Variable int16 i; // Counter Variable int8 x; // Soft Start Variable //PPWM channels 0 and 1 are both on and always opposite values setup_power_pwm_pins(PWM_COMPLEMENTARY,PWM_COMPLEMENTARY,PWM_COMPLEMENTARY, PWM_OFF); // Continuously Sample ADC Channels setup_adc_ports(ADC_CONT_A | ADC_WHEN_PPWM | VSS_VDD); setup_adc(ADC_CLOCK_INTERNAL); x=0; // Initial Startup while(TRUE) { set_adc_channel(1); // Select ADC Channel 1 adc_val = read_adc(); // Read Current ADC Value feedbackL=0; // Clear ADC Variable feedbackI=0; // Clear ADC Variable // Prepare Variables for Startup if (x==0) { feedbackL=adc_val; // Initial Speed Setting adc_val=0; // Clear ADC Variable } // Ramp Up Speed in Forward Direction while(adc_val<>1799) // Check Counter { set_adc_channel(0); // Select ADC Channel 0 feedbackL = read_adc(); // Read Feedback from ADC adjust = feedbackI - feedbackL; // Calculate Speed Adjust i=0; // Clear Counter Variable } } i=0; // Clear Counter Variable // Ramp Down Motor Speed for Direction Change while(adc_val>>0 && input(PIN_C3)) { period = ( adc_val / 20 ) + 9; // Set PR2 for Frequency speed = 511 - ( ( 1023 - adc_val ) / 2 ); // Set User Specified Speed adjust=0; // Clear Adjust Variable //add dead time for reactive loads setup_power_pwm(PWM_CLOCK_DIV_128 | PWM_FREE_RUN,1,0,period,0,1,0); // Phase Segment #1 set_power_pwm0_duty(adjust+57+speed); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+29+speed/4); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+1); // Phase W PWM Duty Setting // Phase Segment #2 set_power_pwm0_duty(adjust+57+speed); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+43+speed/2); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+1); // Phase W PWM Duty Setting // Phase Segment #3 set_power_pwm0_duty(adjust+43+speed/2); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+57+speed); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+1); // Phase W PWM Duty Setting // Phase Segment #4 set_power_pwm0_duty(adjust+29+speed/4); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+57+speed); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+14+speed/6); // Phase W PWM Duty Setting // Phase Segment #5 set_power_pwm0_duty(adjust+14+speed/6); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+57+speed); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+29+speed/4); // Phase W PWM Duty Setting // Phase Segment #6 set_power_pwm0_duty(adjust+1); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+57+speed); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+43+speed/2); // Phase W PWM Duty Setting // Phase Segment #7 set_power_pwm0_duty(adjust+1); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+43+speed/2); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+57+speed); // Phase W PWM Duty Setting // Phase Segment #8 set_power_pwm0_duty(adjust+1); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+29+speed/4); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+57+speed); // Phase W PWM Duty Setting // Phase Segment #9 set_power_pwm0_duty(adjust+14+speed/6); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+14+speed/6); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+57+speed); // Phase W PWM Duty Setting // Phase Segment #10 set_power_pwm0_duty(adjust+29+speed/4); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+1); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+57+speed); // Phase W PWM Duty Setting // Phase Segment #11 set_power_pwm0_duty(adjust+43+speed/2); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+1); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+43+speed/2); // Phase W PWM Duty Setting // Phase Segment #12 set_power_pwm0_duty(adjust+57+speed); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+1); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+29+speed/4); // Phase W PWM Duty Setting // Phase Segment #13 set_power_pwm0_duty(adjust+57+speed); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+14+speed/6); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+14+speed/6); // Phase W PWM Duty Setting adc_val=adc_val-3; // Decrement ADC Value x=0; // Direction Change Complete } i=0; // Clear Counter Variable // Ramp Up Speed in Reverse Direction while(adc_val<>1799) // Check Counter { set_adc_channel(0); // Select ADC Channel 0 feedbackL = read_adc(); // Read Feedback from ADC adjust = feedbackI - feedbackL; // Calculate Speed Adjust i=0; // Clear Counter Variable } } i=0; // Clear Counter Variable // Ramp Down Motor Speed for Direction Change while(adc_val>>0 && input(PIN_C3)) { period = ( adc_val / 20 ) + 9; // Set PR2 for Frequency speed = 511 - ( ( 1023 - adc_val ) / 2 ); // Set User Specified Speed adjust=0; // Clear Adjust Variable //add dead time for reactive loads setup_power_pwm(PWM_CLOCK_DIV_128 | PWM_FREE_RUN,1,0,period,0,1,0); // Phase Segment #1 set_power_pwm0_duty(adjust+57+speed); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+29+speed/4); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+1); // Phase W PWM Duty Setting // Phase Segment #2 set_power_pwm0_duty(adjust+57+speed); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+43+speed/2); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+1); // Phase W PWM Duty Setting // Phase Segment #3 set_power_pwm0_duty(adjust+43+speed/2); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+57+speed); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+1); // Phase W PWM Duty Setting // Phase Segment #4 set_power_pwm0_duty(adjust+29+speed/4); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+57+speed); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+14+speed/6); // Phase W PWM Duty Setting // Phase Segment #5 set_power_pwm0_duty(adjust+14+speed/6); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+57+speed); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+29+speed/4); // Phase W PWM Duty Setting // Phase Segment #6 set_power_pwm0_duty(adjust+1); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+57+speed); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+43+speed/2); // Phase W PWM Duty Setting // Phase Segment #7 set_power_pwm0_duty(adjust+1); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+43+speed/2); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+57+speed); // Phase W PWM Duty Setting // Phase Segment #8 set_power_pwm0_duty(adjust+1); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+29+speed/4); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+57+speed); // Phase W PWM Duty Setting // Phase Segment #9 set_power_pwm0_duty(adjust+14+speed/6); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+14+speed/6); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+57+speed); // Phase W PWM Duty Setting // Phase Segment #10 set_power_pwm0_duty(adjust+29+speed/4); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+1); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+57+speed); // Phase W PWM Duty Setting // Phase Segment #11 set_power_pwm0_duty(adjust+43+speed/2); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+1); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+43+speed/2); // Phase W PWM Duty Setting // Phase Segment #12 set_power_pwm0_duty(adjust+57+speed); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+1); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+29+speed/4); // Phase W PWM Duty Setting // Phase Segment #13 set_power_pwm0_duty(adjust+57+speed); // Phase U PWM Duty Setting set_power_pwm2_duty(adjust+14+speed/6); // Phase V PWM Duty Setting set_power_pwm4_duty(adjust+14+speed/6); // Phase W PWM Duty Setting adc_val=adc_val-3; // Decrement ADC Value x=0; // Direction Change Complete } i=0; // Clear Counter Variable } }