TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: Abner_emanuel en 24 de Noviembre de 2017, 02:24:52

Título: Inicio Motor trifasico con pic
Publicado por: Abner_emanuel en 24 de Noviembre de 2017, 02:24:52
Un saludo.

Alguien tiene experiencia en como hacer un control de motor trifasico o variador de velocidad?. Bueno para empezar quiero generar los pulsos modulados de las tres fases pero no se que tiempo llevan entre pulsos de las fases.

Cualquier ayudas es bienvenida.
Título: Re:Inicio Motor trifasico con pic
Publicado por: Abner_emanuel en 27 de Noviembre de 2017, 13:52:02

Que opinan de este code que me encontré en la red.

Código: C++
  1. ////////////////////////////////////////////////////////////////////////////////
  2. ///           Three Phase PWM Control for AC Induction Motor                 ///
  3. ///                                 by                                       ///
  4. ///                           Larry E Himes Jr                               ///
  5. ///                            April 30, 2012                                ///
  6. ///                                                                          ///
  7. ///                  ECET 581 Applied Electronic Drives                      ///
  8. ///                                                                          ///
  9. ///          PIN A0 - AN0 is used for the Closed Loop Feedback               ///
  10. ///          PIN A1 - AN1 is used for User Speed Control Input               ///
  11. ///             PIN C3 - User Direction Control Switch Input                 ///
  12. ///                                                                          ///
  13. ///              Frequency Range Control from 20Hz to 120Hz                  ///
  14. ///                                                                          ///
  15. ///               Thirteen Samples per PWM Sine Wave Output                  ///
  16. ///                                                                          ///
  17. ////////////////////////////////////////////////////////////////////////////////
  18.  
  19. #include <18f4431.h>
  20. #device adc=10
  21. #fuses  INTRC_IO,NOWDT,NOPROTECT,NOMCLR
  22. #use delay(clock=8000000)
  23.  
  24. void main()
  25.    {
  26.    int16 adc_val;                                   // ADC Variable
  27.    int16 period;                                    // PWM Time Period Variable
  28.    int16 feedbackI;                                 // Feedback Varaiable
  29.    int16 feedbackL;                                 // Feedback Variable
  30.    int16 adjust;                                    // Speed Adjust Variable
  31.    int16 speed;                                     // Speed Control Variable
  32.    int16 i;                                         // Counter Variable
  33.    int8  x;                                         // Soft Start Variable
  34.  
  35.    //PPWM channels 0 and 1 are both on and always opposite values
  36.    setup_power_pwm_pins(PWM_COMPLEMENTARY,PWM_COMPLEMENTARY,PWM_COMPLEMENTARY,
  37.                         PWM_OFF);
  38.  
  39.    // Continuously Sample ADC Channels
  40.    setup_adc_ports(ADC_CONT_A | ADC_WHEN_PPWM | VSS_VDD);
  41.    setup_adc(ADC_CLOCK_INTERNAL);
  42.  
  43.    x=0;                                             // Initial Startup
  44.  
  45.    while(TRUE)
  46.       {
  47.       set_adc_channel(1);                           // Select ADC Channel 1
  48.       adc_val = read_adc();                         // Read Current ADC Value
  49.       feedbackL=0;                                  // Clear ADC Variable
  50.       feedbackI=0;                                  // Clear ADC Variable
  51.       // Prepare Variables for Startup
  52.       if (x==0)
  53.          {
  54.          feedbackL=adc_val;                         // Initial Speed Setting
  55.          adc_val=0;                                 // Clear ADC Variable
  56.          }
  57.       // Ramp Up Speed in Forward Direction
  58.       while(adc_val<<feedbackL && x==0 && !input(PIN_C3))
  59.          {
  60.          period = ( adc_val / 20 ) + 9;             // Set PR2 for Frequency
  61.          speed = 511 - ( ( 1023 - adc_val ) / 2 );  // Set User Specified Speed
  62.          adjust=0;                                  // Clear Adjust Variable
  63.          //add dead time for reactive loads
  64.          setup_power_pwm(PWM_CLOCK_DIV_128 | PWM_FREE_RUN,1,0,period,0,1,0);
  65.          // Phase Segment #1
  66.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  67.          set_power_pwm2_duty(adjust+29+speed/4);    // Phase V PWM Duty Setting
  68.          set_power_pwm4_duty(adjust+1);             // Phase W PWM Duty Setting
  69.          // Phase Segment #2
  70.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  71.          set_power_pwm2_duty(adjust+43+speed/2);    // Phase V PWM Duty Setting
  72.          set_power_pwm4_duty(adjust+1);             // Phase W PWM Duty Setting
  73.          // Phase Segment #3
  74.          set_power_pwm0_duty(adjust+43+speed/2);    // Phase U PWM Duty Setting
  75.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  76.          set_power_pwm4_duty(adjust+1);             // Phase W PWM Duty Setting
  77.          // Phase Segment #4
  78.          set_power_pwm0_duty(adjust+29+speed/4);    // Phase U PWM Duty Setting
  79.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  80.          set_power_pwm4_duty(adjust+14+speed/6);    // Phase W PWM Duty Setting
  81.          // Phase Segment #5
  82.          set_power_pwm0_duty(adjust+14+speed/6);    // Phase U PWM Duty Setting
  83.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  84.          set_power_pwm4_duty(adjust+29+speed/4);    // Phase W PWM Duty Setting
  85.          // Phase Segment #6
  86.          set_power_pwm0_duty(adjust+1);             // Phase U PWM Duty Setting
  87.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  88.          set_power_pwm4_duty(adjust+43+speed/2);    // Phase W PWM Duty Setting
  89.          // Phase Segment #7
  90.          set_power_pwm0_duty(adjust+1);             // Phase U PWM Duty Setting
  91.          set_power_pwm2_duty(adjust+43+speed/2);    // Phase V PWM Duty Setting
  92.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  93.          // Phase Segment #8
  94.          set_power_pwm0_duty(adjust+1);             // Phase U PWM Duty Setting
  95.          set_power_pwm2_duty(adjust+29+speed/4);    // Phase V PWM Duty Setting
  96.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  97.          // Phase Segment #9
  98.          set_power_pwm0_duty(adjust+14+speed/6);    // Phase U PWM Duty Setting
  99.          set_power_pwm2_duty(adjust+14+speed/6);    // Phase V PWM Duty Setting
  100.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  101.          // Phase Segment #10
  102.          set_power_pwm0_duty(adjust+29+speed/4);    // Phase U PWM Duty Setting
  103.          set_power_pwm2_duty(adjust+1);             // Phase V PWM Duty Setting
  104.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  105.          // Phase Segment #11
  106.          set_power_pwm0_duty(adjust+43+speed/2);    // Phase U PWM Duty Setting
  107.          set_power_pwm2_duty(adjust+1);             // Phase V PWM Duty Setting
  108.          set_power_pwm4_duty(adjust+43+speed/2);    // Phase W PWM Duty Setting
  109.          // Phase Segment #12
  110.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  111.          set_power_pwm2_duty(adjust+1);             // Phase V PWM Duty Setting
  112.          set_power_pwm4_duty(adjust+29+speed/4);    // Phase W PWM Duty Setting
  113.          // Phase Segment #13
  114.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  115.          set_power_pwm2_duty(adjust+14+speed/6);    // Phase V PWM Duty Setting
  116.          set_power_pwm4_duty(adjust+14+speed/6);    // Phase W PWM Duty Setting
  117.          x=1;                                       // Ramp Up Cycle Completed
  118.          adc_val=adc_val+3;                         // Increment ADC Value
  119.          }
  120.       i=0;                                          // Clear Counter Variable
  121.       feedbackL=0;                                  // Clear ADC Variable
  122.       // Rotate Motor in Forward Direction
  123.       while(!input(PIN_C3))
  124.          {
  125.          // Read Initial ADC Values
  126.          set_adc_channel(0);                        // Select ADC Channel 0
  127.          feedbackI = read_adc();                    // Read Initial Feedback
  128.          set_adc_channel(1);                        // Select ADC Channel 1
  129.          adc_val = read_adc();                      // Read Current ADC Value
  130.          period = ( adc_val / 20 ) + 9;             // Set PR2 for Frequency
  131.          speed = 511 - ( ( 1023 - adc_val ) / 2 );  // Set User Specified Speed
  132.          //add dead time for reactive loads
  133.          setup_power_pwm(PWM_CLOCK_DIV_128 | PWM_FREE_RUN,1,0,period,0,1,0);
  134.          // Phase Segment #1
  135.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  136.          set_power_pwm2_duty(adjust+29+speed/4);    // Phase V PWM Duty Setting
  137.          set_power_pwm4_duty(adjust+1);             // Phase W PWM Duty Setting
  138.          // Phase Segment #2
  139.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  140.          set_power_pwm2_duty(adjust+43+speed/2);    // Phase V PWM Duty Setting
  141.          set_power_pwm4_duty(adjust+1);             // Phase W PWM Duty Setting
  142.          // Phase Segment #3
  143.          set_power_pwm0_duty(adjust+43+speed/2);    // Phase U PWM Duty Setting
  144.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  145.          set_power_pwm4_duty(adjust+1);             // Phase W PWM Duty Setting
  146.          // Phase Segment #4
  147.          set_power_pwm0_duty(adjust+29+speed/4);    // Phase U PWM Duty Setting
  148.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  149.          set_power_pwm4_duty(adjust+14+speed/6);    // Phase W PWM Duty Setting
  150.          // Phase Segment #5
  151.          set_power_pwm0_duty(adjust+14+speed/6);    // Phase U PWM Duty Setting
  152.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  153.          set_power_pwm4_duty(adjust+29+speed/4);    // Phase W PWM Duty Setting
  154.          // Phase Segment #6
  155.          set_power_pwm0_duty(adjust+1);             // Phase U PWM Duty Setting
  156.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  157.          set_power_pwm4_duty(adjust+43+speed/2);    // Phase W PWM Duty Setting
  158.          // Phase Segment #7
  159.          set_power_pwm0_duty(adjust+1);             // Phase U PWM Duty Setting
  160.          set_power_pwm2_duty(adjust+43+speed/2);    // Phase V PWM Duty Setting
  161.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  162.          // Phase Segment #8
  163.          set_power_pwm0_duty(adjust+1);             // Phase U PWM Duty Setting
  164.          set_power_pwm2_duty(adjust+29+speed/4);    // Phase V PWM Duty Setting
  165.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  166.          // Phase Segment #9
  167.          set_power_pwm0_duty(adjust+14+speed/6);    // Phase U PWM Duty Setting
  168.          set_power_pwm2_duty(adjust+14+speed/6);    // Phase V PWM Duty Setting
  169.          set_power_pwm4_duty(adjust+speed);         // Phase W PWM Duty Setting
  170.          // Phase Segment #10
  171.          set_power_pwm0_duty(adjust+29+speed/4);    // Phase U PWM Duty Setting
  172.          set_power_pwm2_duty(adjust+1);             // Phase V PWM Duty Setting
  173.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  174.          // Phase Segment #11
  175.          set_power_pwm0_duty(adjust+43+speed/2);    // Phase U PWM Duty Setting
  176.          set_power_pwm2_duty(adjust+1);             // Phase V PWM Duty Setting
  177.          set_power_pwm4_duty(adjust+43+speed/2);    // Phase W PWM Duty Setting
  178.          // Phase Segment #12
  179.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  180.          set_power_pwm2_duty(adjust+1);             // Phase V PWM Duty Setting
  181.          set_power_pwm4_duty(adjust+29+speed/4);    // Phase W PWM Duty Setting
  182.          // Phase Segment #13
  183.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  184.          set_power_pwm2_duty(adjust+14+speed/6);    // Phase V PWM Duty Setting
  185.          set_power_pwm4_duty(adjust+14+speed/6);    // Phase W PWM Duty Setting
  186.          i++;                                       // Increment Counter
  187.          if (i>>1799)                               // Check Counter
  188.             {
  189.             set_adc_channel(0);                     // Select ADC Channel 0
  190.             feedbackL = read_adc();                 // Read Feedback from ADC
  191.             adjust = feedbackI - feedbackL;         // Calculate Speed Adjust
  192.             i=0;                                    // Clear Counter Variable
  193.             }
  194.          }
  195.          i=0;                                       // Clear Counter Variable
  196.       // Ramp Down Motor Speed for Direction Change
  197.       while(adc_val>>0 && input(PIN_C3))
  198.          {
  199.          period = ( adc_val / 20 ) + 9;             // Set PR2 for Frequency
  200.          speed = 511 - ( ( 1023 - adc_val ) / 2 );  // Set User Specified Speed
  201.          adjust=0;                                  // Clear Adjust Variable
  202.          //add dead time for reactive loads
  203.          setup_power_pwm(PWM_CLOCK_DIV_128 | PWM_FREE_RUN,1,0,period,0,1,0);
  204.          // Phase Segment #1
  205.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  206.          set_power_pwm2_duty(adjust+29+speed/4);    // Phase V PWM Duty Setting
  207.          set_power_pwm4_duty(adjust+1);             // Phase W PWM Duty Setting
  208.          // Phase Segment #2
  209.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  210.          set_power_pwm2_duty(adjust+43+speed/2);    // Phase V PWM Duty Setting
  211.          set_power_pwm4_duty(adjust+1);             // Phase W PWM Duty Setting
  212.          // Phase Segment #3
  213.          set_power_pwm0_duty(adjust+43+speed/2);    // Phase U PWM Duty Setting
  214.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  215.          set_power_pwm4_duty(adjust+1);             // Phase W PWM Duty Setting
  216.          // Phase Segment #4
  217.          set_power_pwm0_duty(adjust+29+speed/4);    // Phase U PWM Duty Setting
  218.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  219.          set_power_pwm4_duty(adjust+14+speed/6);    // Phase W PWM Duty Setting
  220.          // Phase Segment #5
  221.          set_power_pwm0_duty(adjust+14+speed/6);    // Phase U PWM Duty Setting
  222.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  223.          set_power_pwm4_duty(adjust+29+speed/4);    // Phase W PWM Duty Setting
  224.          // Phase Segment #6
  225.          set_power_pwm0_duty(adjust+1);             // Phase U PWM Duty Setting
  226.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  227.          set_power_pwm4_duty(adjust+43+speed/2);    // Phase W PWM Duty Setting
  228.          // Phase Segment #7
  229.          set_power_pwm0_duty(adjust+1);             // Phase U PWM Duty Setting
  230.          set_power_pwm2_duty(adjust+43+speed/2);    // Phase V PWM Duty Setting
  231.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  232.          // Phase Segment #8
  233.          set_power_pwm0_duty(adjust+1);             // Phase U PWM Duty Setting
  234.          set_power_pwm2_duty(adjust+29+speed/4);    // Phase V PWM Duty Setting
  235.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  236.          // Phase Segment #9
  237.          set_power_pwm0_duty(adjust+14+speed/6);    // Phase U PWM Duty Setting
  238.          set_power_pwm2_duty(adjust+14+speed/6);    // Phase V PWM Duty Setting
  239.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  240.          // Phase Segment #10
  241.          set_power_pwm0_duty(adjust+29+speed/4);    // Phase U PWM Duty Setting
  242.          set_power_pwm2_duty(adjust+1);             // Phase V PWM Duty Setting
  243.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  244.          // Phase Segment #11
  245.          set_power_pwm0_duty(adjust+43+speed/2);    // Phase U PWM Duty Setting
  246.          set_power_pwm2_duty(adjust+1);             // Phase V PWM Duty Setting
  247.          set_power_pwm4_duty(adjust+43+speed/2);    // Phase W PWM Duty Setting
  248.          // Phase Segment #12
  249.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  250.          set_power_pwm2_duty(adjust+1);             // Phase V PWM Duty Setting
  251.          set_power_pwm4_duty(adjust+29+speed/4);    // Phase W PWM Duty Setting
  252.          // Phase Segment #13
  253.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  254.          set_power_pwm2_duty(adjust+14+speed/6);    // Phase V PWM Duty Setting
  255.          set_power_pwm4_duty(adjust+14+speed/6);    // Phase W PWM Duty Setting
  256.          adc_val=adc_val-3;                         // Decrement ADC Value
  257.          x=0;                                       // Direction Change Complete
  258.          }
  259.       i=0;                                          // Clear Counter Variable
  260.       // Ramp Up Speed in Reverse Direction
  261.       while(adc_val<<feedbackL && x==0 && !input(PIN_C3))
  262.          {
  263.          period = ( adc_val / 20 ) + 9;             // Set PR2 for Frequency
  264.          speed = 511 - ( ( 1023 - adc_val ) / 2 );  // Set User Specified Speed
  265.          adjust=0;                                  // Clear Adjust Variable
  266.          //add dead time for reactive loads
  267.          setup_power_pwm(PWM_CLOCK_DIV_128 | PWM_FREE_RUN,1,0,period,0,1,0);
  268.          // Phase Segment #1
  269.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  270.          set_power_pwm2_duty(adjust+29+speed/4);    // Phase V PWM Duty Setting
  271.          set_power_pwm4_duty(adjust+1);             // Phase W PWM Duty Setting
  272.          // Phase Segment #2
  273.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  274.          set_power_pwm2_duty(adjust+43+speed/2);    // Phase V PWM Duty Setting
  275.          set_power_pwm4_duty(adjust+1);             // Phase W PWM Duty Setting
  276.          // Phase Segment #3
  277.          set_power_pwm0_duty(adjust+43+speed/2);    // Phase U PWM Duty Setting
  278.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  279.          set_power_pwm4_duty(adjust+1);             // Phase W PWM Duty Setting
  280.          // Phase Segment #4
  281.          set_power_pwm0_duty(adjust+29+speed/4);    // Phase U PWM Duty Setting
  282.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  283.          set_power_pwm4_duty(adjust+14+speed/6);    // Phase W PWM Duty Setting
  284.          // Phase Segment #5
  285.          set_power_pwm0_duty(adjust+14+speed/6);    // Phase U PWM Duty Setting
  286.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  287.          set_power_pwm4_duty(adjust+29+speed/4);    // Phase W PWM Duty Setting
  288.          // Phase Segment #6
  289.          set_power_pwm0_duty(adjust+1);             // Phase U PWM Duty Setting
  290.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  291.          set_power_pwm4_duty(adjust+43+speed/2);    // Phase W PWM Duty Setting
  292.          // Phase Segment #7
  293.          set_power_pwm0_duty(adjust+1);             // Phase U PWM Duty Setting
  294.          set_power_pwm2_duty(adjust+43+speed/2);    // Phase V PWM Duty Setting
  295.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  296.          // Phase Segment #8
  297.          set_power_pwm0_duty(adjust+1);             // Phase U PWM Duty Setting
  298.          set_power_pwm2_duty(adjust+29+speed/4);    // Phase V PWM Duty Setting
  299.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  300.          // Phase Segment #9
  301.          set_power_pwm0_duty(adjust+14+speed/6);    // Phase U PWM Duty Setting
  302.          set_power_pwm2_duty(adjust+14+speed/6);    // Phase V PWM Duty Setting
  303.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  304.          // Phase Segment #10
  305.          set_power_pwm0_duty(adjust+29+speed/4);    // Phase U PWM Duty Setting
  306.          set_power_pwm2_duty(adjust+1);             // Phase V PWM Duty Setting
  307.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  308.          // Phase Segment #11
  309.          set_power_pwm0_duty(adjust+43+speed/2);    // Phase U PWM Duty Setting
  310.          set_power_pwm2_duty(adjust+1);             // Phase V PWM Duty Setting
  311.          set_power_pwm4_duty(adjust+43+speed/2);    // Phase W PWM Duty Setting
  312.          // Phase Segment #12
  313.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  314.          set_power_pwm2_duty(adjust+1);             // Phase V PWM Duty Setting
  315.          set_power_pwm4_duty(adjust+29+speed/4);    // Phase W PWM Duty Setting
  316.          // Phase Segment #13
  317.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  318.          set_power_pwm2_duty(adjust+14+speed/6);    // Phase V PWM Duty Setting
  319.          set_power_pwm4_duty(adjust+14+speed/6);    // Phase W PWM Duty Setting
  320.          adc_val=adc_val+3;                         // Increment ADC Value
  321.          x=-1;                                      // Ramp Up Cycle Complete
  322.          }
  323.       feedbackL=0;                                  // Clear Feedback Variable
  324.       // Rotate Motor in Reverse Direction
  325.       while(input(PIN_C3) && x<<0)
  326.          {
  327.          // Read Initial ADC Values
  328.          set_adc_channel(0);                        // Select ADC Channel 0
  329.          feedbackI=read_adc();                      // Read Initial Feedback
  330.          set_adc_channel(1);                        // Select ADC Channel 1
  331.          adc_val=read_adc();                        // Read Current ADC Value
  332.          period = ( adc_val / 20 ) + 9;             // Set PR2 for Frequency
  333.          speed = 568 - ( adc_val / 2 );             // Set User Specified Speed
  334.          //add dead time for reactive loads
  335.          setup_power_pwm(PWM_CLOCK_DIV_128 | PWM_FREE_RUN,1,0,period,0,1,0);
  336.          // Phase Segment #1
  337.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  338.          set_power_pwm2_duty(adjust+1);             // Phase V PWM Duty Setting
  339.          set_power_pwm4_duty(adjust+29+speed/4);    // Phase W PWM Duty Setting
  340.          // Phase Segment #2
  341.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  342.          set_power_pwm2_duty(adjust+1);             // Phase V PWM Duty Setting
  343.          set_power_pwm4_duty(adjust+29+speed/2);    // Phase W PWM Duty Setting
  344.          // Phase Segment #3
  345.          set_power_pwm0_duty(adjust+29+speed/2);    // Phase U PWM Duty Setting
  346.          set_power_pwm2_duty(adjust+1);             // Phase V PWM Duty Setting
  347.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  348.          // Phase Segment #4
  349.          set_power_pwm0_duty(adjust+29+speed/4);    // Phase U PWM Duty Setting
  350.          set_power_pwm2_duty(adjust+14+speed/6);    // Phase V PWM Duty Setting
  351.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  352.          // Phase Segment #5
  353.          set_power_pwm0_duty(adjust+14+speed/6);    // Phase U PWM Duty Setting
  354.          set_power_pwm2_duty(adjust+29+speed/4);    // Phase V PWM Duty Setting
  355.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  356.          // Phase Segment #6
  357.          set_power_pwm0_duty(adjust+1);             // Phase U PWM Duty Setting
  358.          set_power_pwm2_duty(adjust+43+speed/2);    // Phase V PWM Duty Setting
  359.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  360.          // Phase Segment #7
  361.          set_power_pwm0_duty(adjust+1);             // Phase U PWM Duty Setting
  362.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  363.          set_power_pwm4_duty(adjust+43+speed/2);    // Phase W PWM Duty Setting
  364.          // Phase Segment #8
  365.          set_power_pwm0_duty(adjust+1);             // Phase U PWM Duty Setting
  366.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  367.          set_power_pwm4_duty(adjust+29+speed/4);    // Phase W PWM Duty Setting
  368.          // Phase Segment #9
  369.          set_power_pwm0_duty(adjust+14+speed/6);    // Phase U PWM Duty Setting
  370.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  371.          set_power_pwm4_duty(adjust+14+speed/6);    // Phase W PWM Duty Setting
  372.          // Phase Segment #10
  373.          set_power_pwm0_duty(adjust+29+speed/4);    // Phase U PWM Duty Setting
  374.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  375.          set_power_pwm4_duty(adjust+1);             // Phase W PWM Duty Setting
  376.          // Phase Segment #11
  377.          set_power_pwm0_duty(adjust+43+speed/2);    // Phase U PWM Duty Setting
  378.          set_power_pwm2_duty(adjust+43+speed/2);    // Phase V PWM Duty Setting
  379.          set_power_pwm4_duty(adjust+1);             // Phase W PWM Duty Setting
  380.          // Phase Segment #12
  381.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  382.          set_power_pwm2_duty(adjust+29+speed/4);    // Phase V PWM Duty Setting
  383.          set_power_pwm4_duty(adjust+1);             // Phase W PWM Duty Setting
  384.          // Phase Segment #13
  385.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  386.          set_power_pwm2_duty(adjust+14+speed/6);    // Phase V PWM Duty Setting
  387.          set_power_pwm4_duty(adjust+14+speed/6);    // Phase W PWM Duty Setting
  388.          if (i>>1799)                               // Check Counter
  389.             {
  390.             set_adc_channel(0);                     // Select ADC Channel 0
  391.             feedbackL = read_adc();                 // Read Feedback from ADC
  392.             adjust = feedbackI - feedbackL;         // Calculate Speed Adjust
  393.             i=0;                                    // Clear Counter Variable
  394.             }      
  395.          }
  396.          i=0;                                       // Clear Counter Variable
  397.       // Ramp Down Motor Speed for Direction Change
  398.       while(adc_val>>0 && input(PIN_C3))
  399.          {
  400.          period = ( adc_val / 20 ) + 9;             // Set PR2 for Frequency
  401.          speed = 511 - ( ( 1023 - adc_val ) / 2 );  // Set User Specified Speed
  402.          adjust=0;                                  // Clear Adjust Variable
  403.          //add dead time for reactive loads
  404.          setup_power_pwm(PWM_CLOCK_DIV_128 | PWM_FREE_RUN,1,0,period,0,1,0);
  405.          // Phase Segment #1
  406.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  407.          set_power_pwm2_duty(adjust+29+speed/4);    // Phase V PWM Duty Setting
  408.          set_power_pwm4_duty(adjust+1);             // Phase W PWM Duty Setting
  409.          // Phase Segment #2
  410.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  411.          set_power_pwm2_duty(adjust+43+speed/2);    // Phase V PWM Duty Setting
  412.          set_power_pwm4_duty(adjust+1);             // Phase W PWM Duty Setting
  413.          // Phase Segment #3
  414.          set_power_pwm0_duty(adjust+43+speed/2);    // Phase U PWM Duty Setting
  415.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  416.          set_power_pwm4_duty(adjust+1);             // Phase W PWM Duty Setting
  417.          // Phase Segment #4
  418.          set_power_pwm0_duty(adjust+29+speed/4);    // Phase U PWM Duty Setting
  419.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  420.          set_power_pwm4_duty(adjust+14+speed/6);    // Phase W PWM Duty Setting
  421.          // Phase Segment #5
  422.          set_power_pwm0_duty(adjust+14+speed/6);    // Phase U PWM Duty Setting
  423.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  424.          set_power_pwm4_duty(adjust+29+speed/4);    // Phase W PWM Duty Setting
  425.          // Phase Segment #6
  426.          set_power_pwm0_duty(adjust+1);             // Phase U PWM Duty Setting
  427.          set_power_pwm2_duty(adjust+57+speed);      // Phase V PWM Duty Setting
  428.          set_power_pwm4_duty(adjust+43+speed/2);    // Phase W PWM Duty Setting
  429.          // Phase Segment #7
  430.          set_power_pwm0_duty(adjust+1);             // Phase U PWM Duty Setting
  431.          set_power_pwm2_duty(adjust+43+speed/2);    // Phase V PWM Duty Setting
  432.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  433.          // Phase Segment #8
  434.          set_power_pwm0_duty(adjust+1);             // Phase U PWM Duty Setting
  435.          set_power_pwm2_duty(adjust+29+speed/4);    // Phase V PWM Duty Setting
  436.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  437.          // Phase Segment #9
  438.          set_power_pwm0_duty(adjust+14+speed/6);    // Phase U PWM Duty Setting
  439.          set_power_pwm2_duty(adjust+14+speed/6);    // Phase V PWM Duty Setting
  440.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  441.          // Phase Segment #10
  442.          set_power_pwm0_duty(adjust+29+speed/4);    // Phase U PWM Duty Setting
  443.          set_power_pwm2_duty(adjust+1);             // Phase V PWM Duty Setting
  444.          set_power_pwm4_duty(adjust+57+speed);      // Phase W PWM Duty Setting
  445.          // Phase Segment #11
  446.          set_power_pwm0_duty(adjust+43+speed/2);    // Phase U PWM Duty Setting
  447.          set_power_pwm2_duty(adjust+1);             // Phase V PWM Duty Setting
  448.          set_power_pwm4_duty(adjust+43+speed/2);    // Phase W PWM Duty Setting
  449.          // Phase Segment #12
  450.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  451.          set_power_pwm2_duty(adjust+1);             // Phase V PWM Duty Setting
  452.          set_power_pwm4_duty(adjust+29+speed/4);    // Phase W PWM Duty Setting
  453.          // Phase Segment #13
  454.          set_power_pwm0_duty(adjust+57+speed);      // Phase U PWM Duty Setting
  455.          set_power_pwm2_duty(adjust+14+speed/6);    // Phase V PWM Duty Setting
  456.          set_power_pwm4_duty(adjust+14+speed/6);    // Phase W PWM Duty Setting
  457.          adc_val=adc_val-3;                         // Decrement ADC Value
  458.          x=0;                                       // Direction Change Complete
  459.          }
  460.          i=0;                                       // Clear Counter Variable
  461.       }
  462.    }