اطلاعیه

Collapse
No announcement yet.

کوادروتور

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    #31
    پاسخ : کوادروتور

    دوستان من یه پیشنهادی دارم بهتره تمام وسایل مثل چهار تا موتور و باتری و... دست نگهداریم.
    وفقط یه موتور بخریم و اسپید کنترلر و... در سطح ازمایشی روی بردبرد یا PCB معمولی بسازیم وقتی به نتیجه کامل رسیدیم بقیه وسایل رو بخریم.
    ممکنه تو وسط کار به مشکل بخوریم اون موقه هزینه زیادی ممکنه از دست بدیم.
    انشلاء که به مشکل نمی خوریم. :redface:

    دیدگاه


      #32
      پاسخ : کوادروتور

      نوشته اصلی توسط payday
      دوستان من یه پیشنهادی دارم بهتره تمام وسایل مثل چهار تا موتور و باتری و... دست نگهداریم.
      وفقط یه موتور بخریم و اسپید کنترلر و... در سطح ازمایشی روی بردبرد یا PCB معمولی بسازیم وقتی به نتیجه کامل رسیدیم بقیه وسایل رو بخریم.
      ممکنه تو وسط کار به مشکل بخوریم اون موقه هزینه زیادی ممکنه از دست بدیم.
      انشلاء که به مشکل نمی خوریم. :redface:
      وسایلی که من استفاده کردم و جواب گرفتم اینها هست:
      موتور mt2213
      اسپید کنترل 20a simon
      یاطری kypom 3s 3300 25c
      فریم خودم درست کردم
      فلایت خودم درست کردم
      دسته کنترل خودم درست کردم
      از موتور cf2822 هم دوستانم استفاده کردن جواب گرفتن (بیشتر روی حرکات نمایشی چون دور موتور بالایی داره)
      ـــــــــــــــــ
      اگر قطعات بالا بگیرید صد در صد ازش جواب میگیرد

      دیدگاه


        #33
        پاسخ : کوادروتور

        نوشته اصلی توسط محمد مومنی تزنگی
        وسایلی که من استفاده کردم و جواب گرفتم اینها هست:
        موتور mt2213
        اسپید کنترل 20a simon
        یاطری kypom 3s 3300 25c
        فریم خودم درست کردم
        فلایت خودم درست کردم
        دسته کنترل خودم درست کردم
        از موتور cf2822 هم دوستانم استفاده کردن جواب گرفتن (بیشتر روی حرکات نمایشی چون دور موتور بالایی داره)
        ـــــــــــــــــ
        اگر قطعات بالا بگیرید صد در صد ازش جواب میگیرد
        محمد میشه درست کردن فریم و فلایت و دسته کنترل رو برا ماهم یادیدی

        دیدگاه


          #34
          پاسخ : کوادروتور

          این برنامه ای که توی کد ویژن آوردمش.بخونید ببینید باید کجا ها را توضیح بدم.فقط فعلا قسمت i2c بهش اضافه نکردم.تست هم نشده. :biggrin:
          زیاد به اون قسمت define ها اهمیت ندید.از main برنامه شروع کنید.

          کد:
          /*****************************************************
          This program was produced by the
          CodeWizardAVR V2.05.3 Standard
          Automatic Program Generator
          © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
          http://www.hpinfotech.com
          
          Project : BLDC MOTOR CONTROLLER
          Version : 1
          Date  : 24/06/2015
          Author :
          
          Chip type        : ATmega48PA
          AVR Core Clock frequency: 12.000000 MHz
          Memory model      : Small
          External RAM size    : 0
          Data Stack size     : 128
          *****************************************************/
          
          #include <mega48pa.h>
          #include <delay.h>
          //ACTIVE LOW OR HIGH ???????????????????????
          #define ACTIVE_LOW_LSIDES		  	0	// 1: Active-LOW, 0: Active-HIGH ( for low side MOSFETs )
          //PWM init value
          #define START_PWM  					30
          #define TOP_PWM							255
          ////////////////////////////////////////////////////
          
          //Pin configuration
            //PHASE1 (U)
            #define UH_DDR         DDRB.3
            #define UH_PRT         PORTB.3
          
            #define  UH_PWM_CTRL     TCCR2A
            #define  UH_PWM_MOD      COM2A1
            #define  UH_PWM_SET      OCR2A
          
            //PHASE1 (U)
            #define UL_DDR         DDRB.1
            #define UL_PRT					PORTB.1
          
          	//PHASE2 (V)
          	#define VH_DDR					DDRD.5
          	#define VH_PRT					PORTD.5
          
          	#define	VH_PWM_CTRL				TCCR0A
          	#define	VH_PWM_MOD				COM0B1
          	#define	VH_PWM_SET				OCR0B
          
          	//PHASE2 (V)
          	#define VL_DDR					DDRB.2
          	#define VL_PRT					PORTB.2
          
          	//PHASE3 (W)
          	#define WH_DDR					DDRD.3
          	#define WH_PRT					PORTD.3
          
          	#define	WH_PWM_CTRL				TCCR2A
          	#define	WH_PWM_MOD				COM2B1
          	#define	WH_PWM_SET				OCR2B
          
          	//PHASE3 (W)
          	#define WL_DDR					DDRC.3
          	#define WL_PRT					PORTC.3
          
          /////////////////////////////////////////////////////////
          
          	//SENSE ADC chanels
          	#define SENSE_U					ADMUX = 0;
          	#define SENSE_V					ADMUX = 1;
          	#define SENSE_W					ADMUX = 2;
          
          /////////////////////////////////////////////////////////
          
            #define OUT           1
            #define IN           0
          
          /////////////////////////////////////////////////////////
          
          	#define UH_ON()					UH_PWM_CTRL |= (1 << UH_PWM_MOD);
          	#define UH_OFF()				UH_PWM_CTRL &= ~(1 << UH_PWM_MOD);
          
          	#define VH_ON()					VH_PWM_CTRL |= (1 << VH_PWM_MOD);
          	#define VH_OFF()				VH_PWM_CTRL &= ~(1 << VH_PWM_MOD);
          
          	#define WH_ON()					WH_PWM_CTRL |= (1 << WH_PWM_MOD);
          	#define WH_OFF()				WH_PWM_CTRL &= ~(1 << WH_PWM_MOD);;
          
          //////////////////////////////////////////////////////////
          
          	#if ACTIVE_LOW_LSIDES					// Active-LOW
          		#define UL_ON()						UL_PRT = 0;
          		#define UL_OFF()					UL_PRT = 1;
          
          		#define VL_ON()						VL_PRT = 0;
          		#define VL_OFF()					VL_PRT = 1;
          
          		#define WL_ON()						WL_PRT = 0;
          		#define WL_OFF()					WL_PRT = 1;
          	#else								// Active-HIGH
          		#define UL_ON()						UL_PRT = 1;
          		#define UL_OFF()					UL_PRT = 0;
          
          		#define VL_ON()						VL_PRT = 1;
          		#define VL_OFF()					VL_PRT = 0;
          
          		#define WL_ON()						WL_PRT = 1;
          		#define WL_OFF()					WL_PRT = 0;
          	#endif
          
          ////////////////////////////////////////////////////////////
          
          	#define PHASE_ALL_OFF()				{UH_OFF(); UL_OFF(); VH_OFF(); VL_OFF(); WH_OFF(); WL_OFF();}
          
          	#define UH_SET(x)							UH_PWM_SET = x;
          	#define VH_SET(x)							VH_PWM_SET = x;
          	#define WH_SET(x)							WH_PWM_SET = x;
          
          /////////////////////////////////////////////////////////////
          #define TIMER1_reset()				TCNT1H = TCNT1L=0;					//set TIMER1 value (system tick)
          #define COMP_enable()				ACSR |= (1 << ACIE);
          #define TIMER1_enable()			TIMSK1 |= (1 << TOIE1);
          #define COMP_disable()				ACSR &= ~(1 << ACIE);
          #define TIMER1_disable()			TIMSK1 &= ~(1 << TOIE1);
          /////////////////////////////////////////////////////////////
          //functions prototype
          void next_commutate_state(unsigned char startup);
          ////////////////////////////////////////////////////////////
          unsigned char 					rotor_state = 0;
          unsigned char 					rotor_run = 0;
          bit               SENSE_H=0;
          unsigned char          current_pwm = START_PWM;
          /////////////////////////////////////////////////////////////
          interrupt [TIM1_OVF] void timer1_ovf_isr(void)
          {
          	next_commutate_state(1);
          	rotor_run = 0;
          
          	UH_SET(START_PWM);
          	VH_SET(START_PWM);
          	WH_SET(START_PWM);
          }
          /////////////////////////////////////////////////////////////
          interrupt [ANA_COMP] void ana_comp_isr(void)
          {
            SENSE_H = !SENSE_H;
          	if(rotor_run == 200)
              next_commutate_state(0);
          
          	rotor_run++;
          
          	if(rotor_run > 200)
            	rotor_run = 200;
          }
          /////////////////////////////////////////////////////////////
          void bldc_pin_DDR()//set pins connected to motor as output
          {
            UH_DDR = OUT;
            UL_DDR = OUT;
            VH_DDR = OUT;
            VL_DDR = OUT;
            WH_DDR = OUT;
            WL_DDR = OUT;
          }
          //////////////////////////////////////////////////////////////
          void pwm_init()    //PWM for UH, VH and WH (>32KHz)
          {
            TCCR0A |= (1 << COM0B1);
            TCCR0A |= (1 << WGM01);
            TCCR0A |= (1 << WGM00);
            TCCR0B |= (1 << CS02);//prescale 256
          
            TCCR2A |= (1 << COM2A1);
            TCCR2A |= (1 << COM2B1);
            TCCR2A |= (1 << WGM21);
            TCCR2A |= (1 << WGM20);
            TCCR2B |= (1 << CS21) | (1 << CS22); //prescale 256
          }
          //////////////////////////////////////////////////////////////
          void timer1_init()
          {
            TCCR1B |= (1 << CS11); //prescaler = CLK/8
            TIMSK1 |= (1 << TOIE1);
          }
          ///////////////////////////////////////////////////////////////
          void comp_init()
          {
            ADCSRB |= (1 << ACME); //use ADC multiplexer for AIN1
            DIDR1 |= (1 << AIN0D) | (1 << AIN1D); ////digital input disable
            ACSR |= (1 << ACIE);
          }
          void bldc_init()
          {
            bldc_pin_DDR(); //set pins connected to motor as output
            pwm_init();   //PWM for UH, VH and WH (>32KHz)
            timer1_init(); //for stat when there is no back emf.commutate in open loop
            PHASE_ALL_OFF();
            comp_init();  //Comperator init for back EMF
          }
          /////////////////////////////////////////////////////////////////
          void next_commutate_state(unsigned char startup)
          {
          	switch (rotor_state)
          	{
          		case (0):
          			if(!SENSE_H || startup)
          			{
          				WH_OFF();
          				UH_ON();
          
          				SENSE_W;
          				rotor_state = 1;
          				TIMER1_reset();
          			}
          			break;
          
          		case (1):
          			if(SENSE_H || startup)
          			{
          				VL_OFF();
          				WL_ON();
          
          				SENSE_V;
          				rotor_state = 2;
          				TIMER1_reset();
          			}
          			break;
          
          		case (2):
          			if(!SENSE_H || startup)
          			{
          				UH_OFF();
          				VH_ON();
          
          				SENSE_U;
          				rotor_state = 3;
          				TIMER1_reset();
          			}
          			break;
          
          		case (3):
          			if(SENSE_H || startup)
          			{
          				WL_OFF();
          				UL_ON();
          
          				SENSE_W;
          				rotor_state = 4;
          				TIMER1_reset();
          			}
          			break;
          
          		case (4):
          			if(!SENSE_H || startup)
          			{
          				VH_OFF();
          				WH_ON();
          
          				SENSE_V;
          				rotor_state = 5;
          				TIMER1_reset();
          			}
          			break;
          
          		case (5):
          			if(SENSE_H || startup)
          			{
          				UL_OFF();
          				VL_ON();
          
          				SENSE_U;
          				rotor_state = 0;
          				TIMER1_reset();
          			}
          			break;
          	}
          }
          /////////////////////////////////////////////////////
          // Declare your global variables here
          
          void main(void)
          {
          // Declare your local variables here
          
          // Crystal Oscillator division factor: 1
          #pragma optsize-
          CLKPR=0x80;
          CLKPR=0x00;
          #ifdef _OPTIMIZE_SIZE_
          #pragma optsize+
          #endif
          
          // TWI initialization
          // TWI disabled
          TWCR=0x00;
          bldc_init();
          #asm ("sei")
          while (1)
             {
          		if(current_pwm >= START_PWM)
          		{
          			COMP_enable();
          			TIMER1_enable();
          
          			if(rotor_run == 200)
          			{
          				UH_SET(current_pwm);
          				VH_SET(current_pwm);
          				WH_SET(current_pwm);
          			}
          		}
          		else
          		{
          			PHASE_ALL_OFF();
          			COMP_disable();
          			TIMER1_disable();
          		}
             }
          }
          آیا جهالت نیست که آدمی ساعات شیرین امروز را فدای روزهای آینده کند؟

          دیدگاه


            #35
            پاسخ : کوادروتور

            نوشته اصلی توسط pooyan-shafiei
            این برنامه ای که توی کد ویژن آوردمش.بخونید ببینید باید کجا ها را توضیح بدم.فقط فعلا قسمت i2c بهش اضافه نکردم.تست هم نشده. :biggrin:
            زیاد به اون قسمت define ها اهمیت ندید.از main برنامه شروع کنید.

            کد:
            /*****************************************************
            This program was produced by the
            CodeWizardAVR V2.05.3 Standard
            Automatic Program Generator
            © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
            http://www.hpinfotech.com
            
            Project : BLDC MOTOR CONTROLLER
            Version : 1
            Date  : 24/06/2015
            Author :
            
            Chip type        : ATmega48PA
            AVR Core Clock frequency: 12.000000 MHz
            Memory model      : Small
            External RAM size    : 0
            Data Stack size     : 128
            *****************************************************/
            
            #include <mega48pa.h>
            #include <delay.h>
            //ACTIVE LOW OR HIGH ???????????????????????
            #define ACTIVE_LOW_LSIDES		  	0	// 1: Active-LOW, 0: Active-HIGH ( for low side MOSFETs )
            //PWM init value
            #define START_PWM  					30
            #define TOP_PWM							255
            ////////////////////////////////////////////////////
            
            //Pin configuration
              //PHASE1 (U)
              #define UH_DDR         DDRB.3
              #define UH_PRT         PORTB.3
            
              #define  UH_PWM_CTRL     TCCR2A
              #define  UH_PWM_MOD      COM2A1
              #define  UH_PWM_SET      OCR2A
            
              //PHASE1 (U)
              #define UL_DDR         DDRB.1
              #define UL_PRT					PORTB.1
            
            	//PHASE2 (V)
            	#define VH_DDR					DDRD.5
            	#define VH_PRT					PORTD.5
            
            	#define	VH_PWM_CTRL				TCCR0A
            	#define	VH_PWM_MOD				COM0B1
            	#define	VH_PWM_SET				OCR0B
            
            	//PHASE2 (V)
            	#define VL_DDR					DDRB.2
            	#define VL_PRT					PORTB.2
            
            	//PHASE3 (W)
            	#define WH_DDR					DDRD.3
            	#define WH_PRT					PORTD.3
            
            	#define	WH_PWM_CTRL				TCCR2A
            	#define	WH_PWM_MOD				COM2B1
            	#define	WH_PWM_SET				OCR2B
            
            	//PHASE3 (W)
            	#define WL_DDR					DDRC.3
            	#define WL_PRT					PORTC.3
            
            /////////////////////////////////////////////////////////
            
            	//SENSE ADC chanels
            	#define SENSE_U					ADMUX = 0;
            	#define SENSE_V					ADMUX = 1;
            	#define SENSE_W					ADMUX = 2;
            
            /////////////////////////////////////////////////////////
            
              #define OUT           1
              #define IN           0
            
            /////////////////////////////////////////////////////////
            
            	#define UH_ON()					UH_PWM_CTRL |= (1 << UH_PWM_MOD);
            	#define UH_OFF()				UH_PWM_CTRL &= ~(1 << UH_PWM_MOD);
            
            	#define VH_ON()					VH_PWM_CTRL |= (1 << VH_PWM_MOD);
            	#define VH_OFF()				VH_PWM_CTRL &= ~(1 << VH_PWM_MOD);
            
            	#define WH_ON()					WH_PWM_CTRL |= (1 << WH_PWM_MOD);
            	#define WH_OFF()				WH_PWM_CTRL &= ~(1 << WH_PWM_MOD);;
            
            //////////////////////////////////////////////////////////
            
            	#if ACTIVE_LOW_LSIDES					// Active-LOW
            		#define UL_ON()						UL_PRT = 0;
            		#define UL_OFF()					UL_PRT = 1;
            
            		#define VL_ON()						VL_PRT = 0;
            		#define VL_OFF()					VL_PRT = 1;
            
            		#define WL_ON()						WL_PRT = 0;
            		#define WL_OFF()					WL_PRT = 1;
            	#else								// Active-HIGH
            		#define UL_ON()						UL_PRT = 1;
            		#define UL_OFF()					UL_PRT = 0;
            
            		#define VL_ON()						VL_PRT = 1;
            		#define VL_OFF()					VL_PRT = 0;
            
            		#define WL_ON()						WL_PRT = 1;
            		#define WL_OFF()					WL_PRT = 0;
            	#endif
            
            ////////////////////////////////////////////////////////////
            
            	#define PHASE_ALL_OFF()				{UH_OFF(); UL_OFF(); VH_OFF(); VL_OFF(); WH_OFF(); WL_OFF();}
            
            	#define UH_SET(x)							UH_PWM_SET = x;
            	#define VH_SET(x)							VH_PWM_SET = x;
            	#define WH_SET(x)							WH_PWM_SET = x;
            
            /////////////////////////////////////////////////////////////
            #define TIMER1_reset()				TCNT1H = TCNT1L=0;					//set TIMER1 value (system tick)
            #define COMP_enable()				ACSR |= (1 << ACIE);
            #define TIMER1_enable()			TIMSK1 |= (1 << TOIE1);
            #define COMP_disable()				ACSR &= ~(1 << ACIE);
            #define TIMER1_disable()			TIMSK1 &= ~(1 << TOIE1);
            /////////////////////////////////////////////////////////////
            //functions prototype
            void next_commutate_state(unsigned char startup);
            ////////////////////////////////////////////////////////////
            unsigned char 					rotor_state = 0;
            unsigned char 					rotor_run = 0;
            bit               SENSE_H=0;
            unsigned char          current_pwm = START_PWM;
            /////////////////////////////////////////////////////////////
            interrupt [TIM1_OVF] void timer1_ovf_isr(void)
            {
            	next_commutate_state(1);
            	rotor_run = 0;
            
            	UH_SET(START_PWM);
            	VH_SET(START_PWM);
            	WH_SET(START_PWM);
            }
            /////////////////////////////////////////////////////////////
            interrupt [ANA_COMP] void ana_comp_isr(void)
            {
              SENSE_H = !SENSE_H;
            	if(rotor_run == 200)
                next_commutate_state(0);
            
            	rotor_run++;
            
            	if(rotor_run > 200)
              	rotor_run = 200;
            }
            /////////////////////////////////////////////////////////////
            void bldc_pin_DDR()//set pins connected to motor as output
            {
              UH_DDR = OUT;
              UL_DDR = OUT;
              VH_DDR = OUT;
              VL_DDR = OUT;
              WH_DDR = OUT;
              WL_DDR = OUT;
            }
            //////////////////////////////////////////////////////////////
            void pwm_init()    //PWM for UH, VH and WH (>32KHz)
            {
              TCCR0A |= (1 << COM0B1);
              TCCR0A |= (1 << WGM01);
              TCCR0A |= (1 << WGM00);
              TCCR0B |= (1 << CS02);//prescale 256
            
              TCCR2A |= (1 << COM2A1);
              TCCR2A |= (1 << COM2B1);
              TCCR2A |= (1 << WGM21);
              TCCR2A |= (1 << WGM20);
              TCCR2B |= (1 << CS21) | (1 << CS22); //prescale 256
            }
            //////////////////////////////////////////////////////////////
            void timer1_init()
            {
              TCCR1B |= (1 << CS11); //prescaler = CLK/8
              TIMSK1 |= (1 << TOIE1);
            }
            ///////////////////////////////////////////////////////////////
            void comp_init()
            {
              ADCSRB |= (1 << ACME); //use ADC multiplexer for AIN1
              DIDR1 |= (1 << AIN0D) | (1 << AIN1D); ////digital input disable
              ACSR |= (1 << ACIE);
            }
            void bldc_init()
            {
              bldc_pin_DDR(); //set pins connected to motor as output
              pwm_init();   //PWM for UH, VH and WH (>32KHz)
              timer1_init(); //for stat when there is no back emf.commutate in open loop
              PHASE_ALL_OFF();
              comp_init();  //Comperator init for back EMF
            }
            /////////////////////////////////////////////////////////////////
            void next_commutate_state(unsigned char startup)
            {
            	switch (rotor_state)
            	{
            		case (0):
            			if(!SENSE_H || startup)
            			{
            				WH_OFF();
            				UH_ON();
            
            				SENSE_W;
            				rotor_state = 1;
            				TIMER1_reset();
            			}
            			break;
            
            		case (1):
            			if(SENSE_H || startup)
            			{
            				VL_OFF();
            				WL_ON();
            
            				SENSE_V;
            				rotor_state = 2;
            				TIMER1_reset();
            			}
            			break;
            
            		case (2):
            			if(!SENSE_H || startup)
            			{
            				UH_OFF();
            				VH_ON();
            
            				SENSE_U;
            				rotor_state = 3;
            				TIMER1_reset();
            			}
            			break;
            
            		case (3):
            			if(SENSE_H || startup)
            			{
            				WL_OFF();
            				UL_ON();
            
            				SENSE_W;
            				rotor_state = 4;
            				TIMER1_reset();
            			}
            			break;
            
            		case (4):
            			if(!SENSE_H || startup)
            			{
            				VH_OFF();
            				WH_ON();
            
            				SENSE_V;
            				rotor_state = 5;
            				TIMER1_reset();
            			}
            			break;
            
            		case (5):
            			if(SENSE_H || startup)
            			{
            				UL_OFF();
            				VL_ON();
            
            				SENSE_U;
            				rotor_state = 0;
            				TIMER1_reset();
            			}
            			break;
            	}
            }
            /////////////////////////////////////////////////////
            // Declare your global variables here
            
            void main(void)
            {
            // Declare your local variables here
            
            // Crystal Oscillator division factor: 1
            #pragma optsize-
            CLKPR=0x80;
            CLKPR=0x00;
            #ifdef _OPTIMIZE_SIZE_
            #pragma optsize+
            #endif
            
            // TWI initialization
            // TWI disabled
            TWCR=0x00;
            bldc_init();
            #asm ("sei")
            while (1)
               {
            		if(current_pwm >= START_PWM)
            		{
            			COMP_enable();
            			TIMER1_enable();
            
            			if(rotor_run == 200)
            			{
            				UH_SET(current_pwm);
            				VH_SET(current_pwm);
            				WH_SET(current_pwm);
            			}
            		}
            		else
            		{
            			PHASE_ALL_OFF();
            			COMP_disable();
            			TIMER1_disable();
            		}
               }
            }
            میتونی همه رو بجوز #define توضیح بدی
            و
            میتونی کد ویژن اش رو بزاری
            :angry:

            دیدگاه


              #36
              پاسخ : کوادروتور

              این کل پروزه کدویژن.
              http://s3.picofile.com/file/8195585000/codecision_code.zip.html
              اما توضیح کل برنامه خیلی زمانبره.من سعی میکنم قسمت های کلیدیش را بگم.
              UH_ON یعنی فاز U به ولتاژ مثبت وصل بشه.
              همین طور در مورد VH_ON و WH_ON.
              UL_ON یعنی فاز U به زمین وصل بشه.
              همین طور در مورد VL_ON و WL_ON.
              UH_OFF یعنی فاز U از ولتاژ مثبت قطع بشه.
              UL_OFF هم یعنی فاز U از زمین قطع بشه.
              حالا این عکس را که قبلا فرستادم را دوباره ببینید.

              جاهایی که مثلا نوشته SENSE_U یعنی داریم ولتاژ BACK_EMF فاز U را میخونیم.پس طبیعتا باید فاز U از ولتاژ مثبت و زمین قطع باشه.
              خوب حالا تابع next_commutate_state را ببینید.دقیقا 6 تا مرحله ای که تو عکس دیده میشه را پیدا کرده فقط جهت چرخشش برعکسه.
              متغیر rotor_state یه عددیه بین 0 تا 5 که میشه 6 حالت.
              متغیر SENSE_H که از نوع بیته توی وقفه ی واحد مقایسه کننده آنالوگ toggle میشه.
              و بعدش تابع next_commutate_state صدا زده میشه.
              اینجوری که معلومه این وقفه در هر تقییر وضعیت موتور اتفاق میوفته.یعنی هر 60 درجه که موتور بچرخه.
              خوب حالا اگه ما سه فاز موتور را طبق چیزی که تو عکسه تحریک کنیم موتور با حداکثر سرعتش راه اندازی میشه.
              برای کنترل سرعت زمانی که قراره مثلا فاز U به ولتاژ مثبت وصل بشه،به جای اینکه همین طور مداوم وصلش کنیم موج PWM اعمال میکنیم.البته باید فرکانس PWM از یه حدی بیشتر باشه.که توی کد قبلی نوشته بود باید از 32 کیلو هرتز بیشتر باشه.
              پس برای کنترل سرعت ما به فاز های مثبت PWM میدیم ولی به منفی ها دست نمیزنیم.یعنی کلا از سه کانال PWM استفاده میکنیم.
              برای تغییر دیوتی سایکل هم از دستور UH_SET و VH_SET و WH_SET استفاده میکنیم.
              نکته ی آخر هم اینه که موقع راه اندازی موتور هیچ ولتاژ BACK_EMF نداریم که بتونیم از روش موقعیت روتور را را تشخیص بدیم.راه اندازی باید به صورت open loop و بدون فید بک انجام بشه تا موتور به یک دور نسبی برسه تا ولتاژ BACK_EMF ایجاد بشه.
              دوباره تابع next_commutate_state را ببنید.ورودی این تابع اگه یک داده بشه دیگه احتیاجی نیست تا SENSE_H تغییر وضعیت بده.بلکه با هر بار صدا زدن این تابع سیم بندی موتور عوض میشود.
              خوب حالا به وقفه ی تایمر یک توجه کنید.این تایمر با مقسم فرکانسی 8 و وقفه ی overflow کار میکند.
              یعنی مثلا هر 40 میلی ثانیه یک بار رخ میده.در این وقفه تابع next_commutate_state با ورودی یک صدا زده شده.یعنی در ابتدای کار که قرار است موتور راه اندازی بشه.
              یعنی مثلا هر 50 میلی ثانیه یک بار فاز ها تفییر وضعیت میدهند تا موتور به یک دور کافی برسه و BACK_EMF کافی ساخته بشه.حالا دیگه وقفه ی مقایسه کننده رخ میتونه رخ بده و این بار تابع next_commutate_state با ورودی صفر به منزله ی این که موتور راه اندازی شده است صدا زده میشود.و با هر بار صدا زدن این تابع TIMER1 ریست میشود تا وقفه ی آن دیگر رخ ندهد.
              متغیر rotor_run هم در موقع راه اندازی صفر است و با هر وقفه ی تایمر یک دوباره صفر میشه.ولی در وقفه ی مقایسه کننده آنالوگ زیاد میشه تا به 200 میرسه و دیگه بیشتر نمیشه.حالا اگه while)1( را ببنید وقتی که این متغیر به 200 میرسه یعنی موتور کاملا راه اندازی شده مقدار PWM ها اعمال میشه.
              آیا جهالت نیست که آدمی ساعات شیرین امروز را فدای روزهای آینده کند؟

              دیدگاه


                #37
                پاسخ : کوادروتور

                نوشته اصلی توسط محمد مومنی تزنگی
                اصلا ۱ دلیل دیگه که من خودم شخصا ازش استفاده نکردم:
                اگر cf2218 بخرم:
                ۳۳۰۰۰ تومن
                ۱-اسپینر=3000 تومن
                ۲-ملخ=۶۰۰۰ تومن
                ۳-گلدکانکتور سه عدد =۱۲۰۰۰ تومن
                خب این شد ۲۱۰۰۰ تومن
                با ۳۳۰۰۰ تومن میشه ۵۴۰۰۰ تومن.
                اما اگر mt2213 بگیرم:
                51000 تومن قیمتش هست دوتا ملخ روش هست
                اسپینر داره
                گلد کانکتور شرکتی روش هست
                مخصوص کواد هم هست.
                ــــــــــــــــــــــــــــــــــــــــــــــــ
                میشه یه عکس از اسپینر و گلدکانکتور بذارید.
                آیا جهالت نیست که آدمی ساعات شیرین امروز را فدای روزهای آینده کند؟

                دیدگاه


                  #38
                  پاسخ : کوادروتور

                  نوشته اصلی توسط pooyan-shafiei
                  این کل پروزه کدویژن.
                  http://s3.picofile.com/file/8195585000/codecision_code.zip.html
                  اما توضیح کل برنامه خیلی زمانبره.من سعی میکنم قسمت های کلیدیش را بگم.
                  UH_ON یعنی فاز U به ولتاژ مثبت وصل بشه.
                  همین طور در مورد VH_ON و WH_ON.
                  UL_ON یعنی فاز U به زمین وصل بشه.
                  همین طور در مورد VL_ON و WL_ON.
                  UH_OFF یعنی فاز U از ولتاژ مثبت قطع بشه.
                  UL_OFF هم یعنی فاز U از زمین قطع بشه.
                  حالا این عکس را که قبلا فرستادم را دوباره ببینید.

                  جاهایی که مثلا نوشته SENSE_U یعنی داریم ولتاژ BACK_EMF فاز U را میخونیم.پس طبیعتا باید فاز U از ولتاژ مثبت و زمین قطع باشه.
                  خوب حالا تابع next_commutate_state را ببینید.دقیقا 6 تا مرحله ای که تو عکس دیده میشه را پیدا کرده فقط جهت چرخشش برعکسه.
                  متغیر rotor_state یه عددیه بین 0 تا 5 که میشه 6 حالت.
                  متغیر SENSE_H که از نوع بیته توی وقفه ی واحد مقایسه کننده آنالوگ toggle میشه.
                  و بعدش تابع next_commutate_state صدا زده میشه.
                  اینجوری که معلومه این وقفه در هر تقییر وضعیت موتور اتفاق میوفته.یعنی هر 60 درجه که موتور بچرخه.
                  خوب حالا اگه ما سه فاز موتور را طبق چیزی که تو عکسه تحریک کنیم موتور با حداکثر سرعتش راه اندازی میشه.
                  برای کنترل سرعت زمانی که قراره مثلا فاز U به ولتاژ مثبت وصل بشه،به جای اینکه همین طور مداوم وصلش کنیم موج PWM اعمال میکنیم.البته باید فرکانس PWM از یه حدی بیشتر باشه.که توی کد قبلی نوشته بود باید از 32 کیلو هرتز بیشتر باشه.
                  پس برای کنترل سرعت ما به فاز های مثبت PWM میدیم ولی به منفی ها دست نمیزنیم.یعنی کلا از سه کانال PWM استفاده میکنیم.
                  برای تغییر دیوتی سایکل هم از دستور UH_SET و VH_SET و WH_SET استفاده میکنیم.
                  نکته ی آخر هم اینه که موقع راه اندازی موتور هیچ ولتاژ BACK_EMF نداریم که بتونیم از روش موقعیت روتور را را تشخیص بدیم.راه اندازی باید به صورت open loop و بدون فید بک انجام بشه تا موتور به یک دور نسبی برسه تا ولتاژ BACK_EMF ایجاد بشه.
                  دوباره تابع next_commutate_state را ببنید.ورودی این تابع اگه یک داده بشه دیگه احتیاجی نیست تا SENSE_H تغییر وضعیت بده.بلکه با هر بار صدا زدن این تابع سیم بندی موتور عوض میشود.
                  خوب حالا به وقفه ی تایمر یک توجه کنید.این تایمر با مقسم فرکانسی 8 و وقفه ی overflow کار میکند.
                  یعنی مثلا هر 40 میلی ثانیه یک بار رخ میده.در این وقفه تابع next_commutate_state با ورودی یک صدا زده شده.یعنی در ابتدای کار که قرار است موتور راه اندازی بشه.
                  یعنی مثلا هر 50 میلی ثانیه یک بار فاز ها تفییر وضعیت میدهند تا موتور به یک دور کافی برسه و BACK_EMF کافی ساخته بشه.حالا دیگه وقفه ی مقایسه کننده رخ میتونه رخ بده و این بار تابع next_commutate_state با ورودی صفر به منزله ی این که موتور راه اندازی شده است صدا زده میشود.و با هر بار صدا زدن این تابع TIMER1 ریست میشود تا وقفه ی آن دیگر رخ ندهد.
                  متغیر rotor_run هم در موقع راه اندازی صفر است و با هر وقفه ی تایمر یک دوباره صفر میشه.ولی در وقفه ی مقایسه کننده آنالوگ زیاد میشه تا به 200 میرسه و دیگه بیشتر نمیشه.حالا اگه while)1( را ببنید وقتی که این متغیر به 200 میرسه یعنی موتور کاملا راه اندازی شده مقدار PWM ها اعمال میشه.
                  پویان جان مرسی مرسی ببخشید دیگه ضحمت دادم . من تازه کارم زیاد با این نوع مسائل اشنایی ندارم.

                  دیدگاه


                    #39
                    پاسخ : کوادروتور

                    خواهش میکنم.منم 3 روز در حال کشف و شهود بودم تا فهمیدم.
                    آیا جهالت نیست که آدمی ساعات شیرین امروز را فدای روزهای آینده کند؟

                    دیدگاه


                      #40
                      پاسخ : کوادروتور

                      نوشته اصلی توسط pooyan-shafiei
                      میشه یه عکس از اسپینر و گلدکانکتور بذارید.
                      اسپینر:(برای اتصال ملخ به موتور)


                      گلد کانکتور:(برای اتصالاتی که جریان زیاد عبور میکنن)

                      دیدگاه


                        #41
                        پاسخ : کوادروتور

                        سلام
                        تو شماتیک FB1 / VDR1
                        ,و Vin+/-Vin چیه

                        دیدگاه


                          #42
                          پاسخ : کوادروتور

                          FB فریت بید
                          VDR وریستور
                          vin+ و - را نمیدونم چیه
                          این موتور چه با فرقی با mt2213 داره؟
                          http://www.roboeq.ir/products/detail/0113026/
                          قیمتش خوبه.همه چی هم داره.
                          آیا جهالت نیست که آدمی ساعات شیرین امروز را فدای روزهای آینده کند؟

                          دیدگاه


                            #43
                            پاسخ : کوادروتور

                            نوشته اصلی توسط pooyan-shafiei
                            FB فریت بید
                            VDR وریستور
                            vin+ و - را نمیدونم چیه
                            این موتور چه با فرقی با mt2213 داره؟
                            http://www.roboeq.ir/products/detail/0113026/
                            قیمتش خوبه.همه چی هم داره.
                            همون mt2213 هستش(البته این فروشگاه هیچی نداره/هرچی میای بخری موجودی ندارن)

                            دیدگاه


                              #44
                              پاسخ : کوادروتور

                              نوشته اصلی توسط محمد مومنی تزنگی
                              همون mt2213 هستش(البته این فروشگاه هیچی نداره/هرچی میای بخری موجودی ندارن)
                              نه نوشته emax2213
                              یه مدل دیگه هم داره نوشته emax mt2213 که قیمتش بیشتره.
                              الان این موتورش موجود شده.
                              آیا جهالت نیست که آدمی ساعات شیرین امروز را فدای روزهای آینده کند؟

                              دیدگاه


                                #45
                                پاسخ : کوادروتور

                                نوشته اصلی توسط pooyan-shafiei
                                نه نوشته emax2213
                                یه مدل دیگه هم داره نوشته emax mt2213 که قیمتش بیشتره.
                                الان این موتورش موجود شده.
                                روی همون mt ها نوشته emax (روی بدنه موتور)

                                دیدگاه

                                لطفا صبر کنید...
                                X