اطلاعیه

Collapse
No announcement yet.

ساخت درایور موتور براشلس

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

    ساخت درایور موتور براشلس

    سلام!
    دوستان تو این تاپیک به کمک شما میخوایم یک درایور موتور براشلس که هم قابلیت کنترل با pwm و هم قابلیت کنترل با پتانسیومتر داره رو قرار بدیم و بطور عملی تست و راه اندازی کنیم!موتور براشلس نوعی موتور سنکرون سه فازبا آهنربای ثابت هست! ازونجایی که موتور های سنکرون برای تغییر سرعت به تغییر فرکانس و تغییر ولتاژ نیاز دارن در مرحله اول باید توسط تایمر
    پی دبلیو ام خاصی طراحی کنیم که با داشتن اینداکتنس بین هر دو فاز(یا هر کویل) و مقاومت کویل و فرکانس ؛ ولتاژ رو تایین کنه و بده به موتور(در واقع میشه گفت جریان رو کنترل کنه چون جریانه که میدان مغناطیسی رو ایجا میکنه) پس از یک مقاومت شنت هم استفاده میکنیم تا جریان رو در هر لحظه بدونیم و بدیم به MCU! در مرحله ی دوم باید سه فاز با اختلاف۱۲۰ درجه تولید کنیم البته این فاز ها متناوب هستند ولی سینوسی نیستد و به اصطلاح بهشون میگن دایرکت کارنت(ولی در واقع جهت جریان عوض میشه! و قسمت اصلی بر میگرده به اینکه روتور توسط میدان مغناطیسی چرخنده قفل و سینک باشه! معمولا از دو روش استفاده میکنن یک روش استفاده از سه عدد سنسور اثر هال هست که میاد با توجه به اینکه کدوم سنسور در چه وضعیتی هست وضعیت روتور رو میده به ام سی یو روش دیگه که مرسوم تر هست استفاده از بک ای ام اف هست BEMF( قانون فاراده/لنز) که میاد هنگامی که فقط یک کویل فعال هست ولتاژ دو کویل دیگه رو بررسی میکنه این ولتاژ توسط عبور اهنربا از کویل تولید میشه! چون موتور داره میچرخه . و لحظه ای که این ولتاژ به صفر میرسه و میخواد منفی بشه رو ثبت میکنه و میفهمه که چه زمانی باید پالس بعدی رو بده.

    میرسیم به سخت افزار:
    اول از همه یک ام سی یو نیازه تا پردازش و تولید پالس رو بر عهده بگیره. در ثانی ما یک درایور نیاز داریم تا پالس هارو امپلیفای کنه و به پالس هایی قابل فهم و مناسب برای بخش قدرت در بیاره(درایور) و بخش سوم بخش قدرت هست (شامل سه عدد هف بریج) و بخش چهارم قسمت فید بک هست
    خب! من خیلی مبسوط تا اینجا توضیح دادم حالا از کاربرد هاش بگم/ موتور های bldc خیلی جاها کاربرد دارن و به روش های گوناگون میتونن درایو بشن و امروزه با گسترش این موتور ها و پایین اومدن قیمتشون و پیشرفت علم الکترونیک و آسان شدن درایو کردنشون دارن جای موتور های دیگرو میگیرن همچنین بازده بالای این موتور ها باعث شده تو ماشین های الکتریک
    درون ها و توربین ها و خیلی چیزای دیگه استفاده بشن
    ///////////////////////////////////////
    من یک درایور ساده رو مورد بررسی قرار دادم و دوستان مهندسی معکوس اگه زحمت بکشن شماتیک رو اینجا بفرستن من با قدرت بیشتری ادامه میدم و تمامی فیلم ها و تلاش هامو میذارم
    حتی قصد دارم یک موتور اینداکشن رو به موتور BLDC تبدیل کنم همچنین یک پروژه ی اوپن سورس عظیم به نام VESC هم وجود داره. اما چرا ما ایرانیا نه؟ من مطمعنم این پروژه
    در سال های آتی به ثمر خواهد رسید و ما هم درایور اوپن سورس خودمون رو خواهیم داشت چون حداقلش من دست از تلاش نمیکشم
    :دی
    عکس هارو از درایور میذارم و باقی درایور ها مخصوصا vesc رو هم بررسی میکنیم.

    این قسمت قدرت که کاملا مشخصه چی به چیه! دو عدد رگولاتور 5 ولت که برای تغذیه ی میکرو و خروجی BEC استفاده شده و 6 عدد ماسفت خفن قدرت(که تو ایران پیدا نکردم نمیدونم
    چرا هر چی ماسفت تکنولوژی جدیده وازد نمیشه)

    اینم قسمت درایور و میکرو کنترلر / البته این اسپید کنترلر خاص اومده از C8051F330 استفاده کرده!
    و vescهم اومده از stm32F4 استفاده کرده/
    سمت راست تصویر سه تا قسمت مشابه میبینیم که هر قسمت از یک درایور شش پایه ، یک دیود ، یک خازن ، مقاومت و یک ترانزیستور تشکیل شده! پر واضحه که بخش درایور قضیه هست! احتمال میدم این سه تا فقط بخش های ساید رو درایو کنن و داره از تکنیک بوت استرپ برای روشن کردن ماسفت های ساید استفاده میکنه(متاسفانه پراب اسیلوسکوپ ندارم که با اسیلوسکوپ تستش کنم ببینم با چه ولتاژ و پالسی داره ماسفت هارو روشن میکنه احتمال میدم پنج ولت باشه بزودی پراب میخرم و تست میکنم درگیر کنکورم)
    وسط تصویر هم میکروی نام برده مشاهده میشه و یسری قطعه دور و برش! حالا میریم سراغ حدسیات! حدس میزنم سه عدد آیسی که در بالا وجود داره آپ امپ باشه برای تقویت BEMF
    مقاومت های سمت چپ تصویر هم تقسیم کننده های ولتاژ هستن! که در واقع از هر فاز یک فید بک گرفته شده و ولتاژش کاهش داده شده و رفته تو اپ امپ! و احتمالا از اپ امپ استفاده شده تا مثلا اشمیت تریگر کرده باشه قضیه رو(چون ولتاژ بک emf تقریبا سینوسیه و این احتمالا اومده مربعی کرده دوستان اگه فهمیدن توضیح بدن) و اگر نه قسمت لو ساید رو درایو میکنه
    شماتیک VESC رو هم قرار میدم و یسری شماتیک دیگه مربوط به درایور st
    خب این مهندسای عزیز هم برای بخش درایور ماسفت ها اومدن از L6398 که یک درایور دوبل برای لو ساید و های ساید هست استفاده کردن
    که میشه از خیلی آیسی های دیگه مثل ir2110 ir2113 ir2112 و حتی ir2102 که هشت پایه هست استفاده کرد! برای بخش کنترلی اومدن سه تا آپ امپ گذاشتن که BEMF رو تقویت کنه و حتی در سرعت های پایین که مقدارBEMF پایین هست و یکی از مشکلات درایو موتور سنسورلس در سرعت پایین هست حل بشه.
    خب این هم پروژه ی تسلا طور! VESC
    https://github.com/vedderb/bldc-hardware

    یه برنامه ی خیلی ساده هم میذارم که برای آردویینو نوشته شده
    با مراجعه به دیتاشیت atmega328 و مطالعه ی رجیستر ها و مشاهده ی دستورات اختصاصی کامپایلر-بوت لودر آردویینو IDE میبینین که چقدر واضح هست
    کد:
    // Sensorless brushless DC (BLDC) motor control with Arduino UNO and IR2101 (Arduino DIY ESC).// This is a free software without any warranty.
     
     
    #define SPEED_UP          A0          // BLDC motor speed-up button
    #define SPEED_DOWN        A1          // BLDC motor speed-down button
    #define PWM_MAX_DUTY      255
    #define PWM_MIN_DUTY      50
    #define PWM_START_DUTY    100
     
    byte bldc_step = 0, motor_speed;
    unsigned int i;
    void setup() {
      DDRD  |= 0x38;           // Configure pins 3, 4 and 5 as outputs
      PORTD  = 0x00;
      DDRB  |= 0x0E;           // Configure pins 9, 10 and 11 as outputs
      PORTB  = 0x31;
      // Timer1 module setting: set clock source to clkI/O / 1 (no prescaling)
      TCCR1A = 0;
      TCCR1B = 0x01;
      // Timer2 module setting: set clock source to clkI/O / 1 (no prescaling)
      TCCR2A = 0;
      TCCR2B = 0x01;
      // Analog comparator setting
      ACSR   = 0x10;           // Disable and clear (flag bit) analog comparator interrupt
      pinMode(SPEED_UP,   INPUT_PULLUP);
      pinMode(SPEED_DOWN, INPUT_PULLUP);
    }
    // Analog comparator ISR
    ISR (ANALOG_COMP_vect) {
      // BEMF debounce
      for(i = 0; i < 10; i++) {
        if(bldc_step & 1){
          if(!(ACSR & 0x20)) i -= 1;
        }
        else {
          if((ACSR & 0x20))  i -= 1;
        }
      }
      bldc_move();
      bldc_step++;
      bldc_step %= 6;
    }
    void bldc_move(){        // BLDC motor commutation function
      switch(bldc_step){
        case 0:
          AH_BL();
          BEMF_C_RISING();
          break;
        case 1:
          AH_CL();
          BEMF_B_FALLING();
          break;
        case 2:
          BH_CL();
          BEMF_A_RISING();
          break;
        case 3:
          BH_AL();
          BEMF_C_FALLING();
          break;
        case 4:
          CH_AL();
          BEMF_B_RISING();
          break;
        case 5:
          CH_BL();
          BEMF_A_FALLING();
          break;
      }
    }
     
    void loop() {
      SET_PWM_DUTY(PWM_START_DUTY);    // Setup starting PWM with duty cycle = PWM_START_DUTY
      i = 5000;
      // Motor start
      while(i > 100) {
        delayMicroseconds(i);
        bldc_move();
        bldc_step++;
        bldc_step %= 6;
        i = i - 20;
      }
      motor_speed = PWM_START_DUTY;
      ACSR |= 0x08;                    // Enable analog comparator interrupt
      while(1) {
        while(!(digitalRead(SPEED_UP)) && motor_speed < PWM_MAX_DUTY){
          motor_speed++;
          SET_PWM_DUTY(motor_speed);
          delay(100);
        }
        while(!(digitalRead(SPEED_DOWN)) && motor_speed > PWM_MIN_DUTY){
          motor_speed--;
          SET_PWM_DUTY(motor_speed);
          delay(100);
        }
      }
    }
     
    void BEMF_A_RISING(){
      ADCSRB = (0 << ACME);    // Select AIN1 as comparator negative input
      ACSR |= 0x03;            // Set interrupt on rising edge
    }
    void BEMF_A_FALLING(){
      ADCSRB = (0 << ACME);    // Select AIN1 as comparator negative input
      ACSR &= ~0x01;           // Set interrupt on falling edge
    }
    void BEMF_B_RISING(){
      ADCSRA = (0 << ADEN);   // Disable the ADC module
      ADCSRB = (1 << ACME);
      ADMUX = 2;              // Select analog channel 2 as comparator negative input
      ACSR |= 0x03;
    }
    void BEMF_B_FALLING(){
      ADCSRA = (0 << ADEN);   // Disable the ADC module
      ADCSRB = (1 << ACME);
      ADMUX = 2;              // Select analog channel 2 as comparator negative input
      ACSR &= ~0x01;
    }
    void BEMF_C_RISING(){
      ADCSRA = (0 << ADEN);   // Disable the ADC module
      ADCSRB = (1 << ACME);
      ADMUX = 3;              // Select analog channel 3 as comparator negative input
      ACSR |= 0x03;
    }
    void BEMF_C_FALLING(){
      ADCSRA = (0 << ADEN);   // Disable the ADC module
      ADCSRB = (1 << ACME);
      ADMUX = 3;              // Select analog channel 3 as comparator negative input
      ACSR &= ~0x01;
    }
     
    void AH_BL(){
      PORTD &= ~0x28;
      PORTD |=  0x10;
      TCCR1A =  0;            // Turn pin 11 (OC2A) PWM ON (pin 9 & pin 10 OFF)
      TCCR2A =  0x81;         //
    }
    void AH_CL(){
      PORTD &= ~0x30;
      PORTD |=  0x08;
      TCCR1A =  0;            // Turn pin 11 (OC2A) PWM ON (pin 9 & pin 10 OFF)
      TCCR2A =  0x81;         //
    }
    void BH_CL(){
      PORTD &= ~0x30;
      PORTD |=  0x08;
      TCCR2A =  0;            // Turn pin 10 (OC1B) PWM ON (pin 9 & pin 11 OFF)
      TCCR1A =  0x21;         //
    }
    void BH_AL(){
      PORTD &= ~0x18;
      PORTD |=  0x20;
      TCCR2A =  0;            // Turn pin 10 (OC1B) PWM ON (pin 9 & pin 11 OFF)
      TCCR1A =  0x21;         //
    }
    void CH_AL(){
      PORTD &= ~0x18;
      PORTD |=  0x20;
      TCCR2A =  0;            // Turn pin 9 (OC1A) PWM ON (pin 10 & pin 11 OFF)
      TCCR1A =  0x81;         //
    }
    void CH_BL(){
      PORTD &= ~0x28;
      PORTD |=  0x10;
      TCCR2A =  0;            // Turn pin 9 (OC1A) PWM ON (pin 10 & pin 11 OFF)
      TCCR1A =  0x81;         //
    }
     
    void SET_PWM_DUTY(byte duty){
      if(duty < PWM_MIN_DUTY)
        duty  = PWM_MIN_DUTY;
      if(duty > PWM_MAX_DUTY)
        duty  = PWM_MAX_DUTY;
      OCR1A  = duty;                   // Set pin 9  PWM duty cycle
      OCR1B  = duty;                   // Set pin 10 PWM duty cycle
      OCR2A  = duty;                   // Set pin 11 PWM duty cycle
    }
    جدیدترین ویرایش توسط Amir Zia; ۲۲:۵۹ ۱۳۹۷/۱۱/۳۰.






    امیرحسین ضیا

    #2
    پاسخ : ساخت درایور موتور براشلس

    خب در ادامه میپردازیم به بقش(بخش) قدرت!
    من چند عدد ESC که توسط ATmega8 ساخته و تولید شده رو میذارم و کمی بررسی میکنیم که چجوری ماسفت هارو درایو کردن و بخش قدرت شامل چی میشه
    رنگ ها به این صورته که
    سبز=مقاومت های تقسیم ولتاژ برای مناسب سازی ولتاژ BEMF برای پردازش
    سفید=درایور ماسفت های ساید
    قرمز=MCU
    زرد=تقسیم مقاومتی
    آبی=رگولاتور 5 ولت

    استفاده از دیود فست+خازن+BJT برای درایور های ساید(تکنیک بوت استرپ)

    همان تکنیک

    همان تکنیک

    استفاده از ترانزیستور های متمم(ماسفت پی و ماسفت ان) برای ساده سازی درایو

    با اینکه این درایور 30 آمپر هست باز نیز از ماسفت p و n استفاده شده. در توان های بالاتر ماسفت های p به علت بالاتر بودن مقاومت درین سورس شروع به داغ شدن میکنند



    در این سه نیز بجای استفاده از BJT برای بوت استرپ از آیسی های درایور دوبل استفاده شده(آیسی های نامبرده مانند ir2101-ir2102-ir2103-ir2113-ir2110 و درایور های دیگر(من فقط واس شرکت ior رو میدونستم
    مزیت این روش این است که در روش استفاده از bjt ها برای بوت استرپ ، مقاومت گیت و زمین در لحظه ی خاموشی(فالینگ) پایین و مقاومت گیت و پالس مثبت در لحظه روشن شدن(رایزینگ)زیاد است. یعنی ماسفت
    دیر روشن میشه و زود خاموش میشه و این دیر روشن شدن ماسفت اگه چه به این معنی نیست که خیلی طول میکشه تا روشن شه! ولی حتی در حد چند میکرو ثانیه دیر تر رایز شدن پالس میتونه باعث ایجاد تلفات بشه
    برای همین در توان های بالا میان از آیسی درایور استفاده میکنن یا کلا میان ایزوله میکنن گراند هارو یا از ترانس پالس استفاده میشه و کلی روش های دیگه
    اینجا اومدن از آیسی درایور استفاده کردن با مراجعه به دیتاشیت آیسی متوجه میشین که

    از دو فت متمم استفاده شده پس بوم! سریع گیت رو میکشه بالا و سریع گیت رو میکشه پایین!
    در قسمت بعد در مورد مقاومت های تقسیم کننده برای مناسب سازی ولتاژ جهت تشخیص BEMF صحبت میکنیم
    جدیدترین ویرایش توسط Amir Zia; ۰۵:۲۹ ۱۳۹۷/۱۲/۰۴.






    امیرحسین ضیا

    دیدگاه


      #3
      پاسخ : ساخت درایور موتور براشلس

      پالس های گیت ماسفت لو ساید با یه اسیلوسکوپ قدیمی فلورسنت در دو حالت فول تراتل(دیوتی سایکل 100 ) و حالت هف تراتل(دیوتی سایکل 50 موج pwm) رو با هم مشاهده میکنیم.
      (ESC SimonK)
      همچنین پالس های هر فاز نیز در دیوتی سایکل صد در صد بصورت مربعی نبود بلکه ذوزنقه ای بود و متاسفانه نشد فیلم بگیرم ولی اینجوریه _\---/___\---/__( برای بیماران او سی دی مثل خودم عرض شه
      واقعا شرمندم که گراند وسط اسکوپ نیس )
      آپلود عکس، فایل، آهنگ و فیلم رایگان و با لینک مستقیم و ماندگاری دائمی و سرعت بالا در آپلود سنتر عکس و فایل یو آپلود

      آپلود عکس، فایل، آهنگ و فیلم رایگان و با لینک مستقیم و ماندگاری دائمی و سرعت بالا در آپلود سنتر عکس و فایل یو آپلود
      جدیدترین ویرایش توسط Amir Zia; ۱۶:۵۶ ۱۳۹۸/۰۱/۲۲.






      امیرحسین ضیا

      دیدگاه


        #4
        پاسخ : ساخت درایور موتور براشلس

        نوشته اصلی توسط azjaguar نمایش پست ها
        سلام!
        دوستان تو این تاپیک به کمک شما میخوایم یک درایور موتور براشلس که هم قابلیت کنترل با pwm و هم قابلیت کنترل با پتانسیومتر داره رو قرار بدیم و بطور عملی تست و راه اندازی کنیم!موتور براشلس نوعی موتور سنکرون سه فازبا آهنربای ثابت هست! ازونجایی که موتور های سنکرون برای تغییر سرعت به تغییر فرکانس و تغییر ولتاژ نیاز دارن در مرحله اول باید توسط تایمر
        پی دبلیو ام خاصی طراحی کنیم که با داشتن اینداکتنس بین هر دو فاز(یا هر کویل) و مقاومت کویل و فرکانس ؛ ولتاژ رو تایین کنه و بده به موتور(در واقع میشه گفت جریان رو کنترل کنه چون جریانه که میدان مغناطیسی رو ایجا میکنه) پس از یک مقاومت شنت هم استفاده میکنیم تا جریان رو در هر لحظه بدونیم و بدیم به MCU! در مرحله ی دوم باید سه فاز با اختلاف۱۲۰ درجه تولید کنیم البته این فاز ها متناوب هستند ولی سینوسی نیستد و به اصطلاح بهشون میگن دایرکت کارنت(ولی در واقع جهت جریان عوض میشه! و قسمت اصلی بر میگرده به اینکه روتور توسط میدان مغناطیسی چرخنده قفل و سینک باشه! معمولا از دو روش استفاده میکنن یک روش استفاده از سه عدد سنسور اثر هال هست که میاد با توجه به اینکه کدوم سنسور در چه وضعیتی هست وضعیت روتور رو میده به ام سی یو روش دیگه که مرسوم تر هست استفاده از بک ای ام اف هست BEMF( قانون فاراده/لنز) که میاد هنگامی که فقط یک کویل فعال هست ولتاژ دو کویل دیگه رو بررسی میکنه این ولتاژ توسط عبور اهنربا از کویل تولید میشه! چون موتور داره میچرخه . و لحظه ای که این ولتاژ به صفر میرسه و میخواد منفی بشه رو ثبت میکنه و میفهمه که چه زمانی باید پالس بعدی رو بده.

        میرسیم به سخت افزار:
        اول از همه یک ام سی یو نیازه تا پردازش و تولید پالس رو بر عهده بگیره. در ثانی ما یک درایور نیاز داریم تا پالس هارو امپلیفای کنه و به پالس هایی قابل فهم و مناسب برای بخش قدرت در بیاره(درایور) و بخش سوم بخش قدرت هست (شامل سه عدد هف بریج) و بخش چهارم قسمت فید بک هست
        خب! من خیلی مبسوط تا اینجا توضیح دادم حالا از کاربرد هاش بگم/ موتور های bldc خیلی جاها کاربرد دارن و به روش های گوناگون میتونن درایو بشن و امروزه با گسترش این موتور ها و پایین اومدن قیمتشون و پیشرفت علم الکترونیک و آسان شدن درایو کردنشون دارن جای موتور های دیگرو میگیرن همچنین بازده بالای این موتور ها باعث شده تو ماشین های الکتریک
        درون ها و توربین ها و خیلی چیزای دیگه استفاده بشن
        ///////////////////////////////////////
        من یک درایور ساده رو مورد بررسی قرار دادم و دوستان مهندسی معکوس اگه زحمت بکشن شماتیک رو اینجا بفرستن من با قدرت بیشتری ادامه میدم و تمامی فیلم ها و تلاش هامو میذارم
        حتی قصد دارم یک موتور اینداکشن رو به موتور BLDC تبدیل کنم همچنین یک پروژه ی اوپن سورس عظیم به نام VESC هم وجود داره. اما چرا ما ایرانیا نه؟ من مطمعنم این پروژه
        در سال های آتی به ثمر خواهد رسید و ما هم درایور اوپن سورس خودمون رو خواهیم داشت چون حداقلش من دست از تلاش نمیکشم
        :دی
        عکس هارو از درایور میذارم و باقی درایور ها مخصوصا vesc رو هم بررسی میکنیم.

        این قسمت قدرت که کاملا مشخصه چی به چیه! دو عدد رگولاتور 5 ولت که برای تغذیه ی میکرو و خروجی BEC استفاده شده و 6 عدد ماسفت خفن قدرت(که تو ایران پیدا نکردم نمیدونم
        چرا هر چی ماسفت تکنولوژی جدیده وازد نمیشه)

        اینم قسمت درایور و میکرو کنترلر / البته این اسپید کنترلر خاص اومده از C8051F330 استفاده کرده!
        و vescهم اومده از stm32F4 استفاده کرده/
        سمت راست تصویر سه تا قسمت مشابه میبینیم که هر قسمت از یک درایور شش پایه ، یک دیود ، یک خازن ، مقاومت و یک ترانزیستور تشکیل شده! پر واضحه که بخش درایور قضیه هست! احتمال میدم این سه تا فقط بخش های ساید رو درایو کنن و داره از تکنیک بوت استرپ برای روشن کردن ماسفت های ساید استفاده میکنه(متاسفانه پراب اسیلوسکوپ ندارم که با اسیلوسکوپ تستش کنم ببینم با چه ولتاژ و پالسی داره ماسفت هارو روشن میکنه احتمال میدم پنج ولت باشه بزودی پراب میخرم و تست میکنم درگیر کنکورم)
        وسط تصویر هم میکروی نام برده مشاهده میشه و یسری قطعه دور و برش! حالا میریم سراغ حدسیات! حدس میزنم سه عدد آیسی که در بالا وجود داره آپ امپ باشه برای تقویت BEMF
        مقاومت های سمت چپ تصویر هم تقسیم کننده های ولتاژ هستن! که در واقع از هر فاز یک فید بک گرفته شده و ولتاژش کاهش داده شده و رفته تو اپ امپ! و احتمالا از اپ امپ استفاده شده تا مثلا اشمیت تریگر کرده باشه قضیه رو(چون ولتاژ بک emf تقریبا سینوسیه و این احتمالا اومده مربعی کرده دوستان اگه فهمیدن توضیح بدن) و اگر نه قسمت لو ساید رو درایو میکنه
        شماتیک VESC رو هم قرار میدم و یسری شماتیک دیگه مربوط به درایور st
        خب این مهندسای عزیز هم برای بخش درایور ماسفت ها اومدن از L6398 که یک درایور دوبل برای لو ساید و های ساید هست استفاده کردن
        که میشه از خیلی آیسی های دیگه مثل ir2110 ir2113 ir2112 و حتی ir2102 که هشت پایه هست استفاده کرد! برای بخش کنترلی اومدن سه تا آپ امپ گذاشتن که BEMF رو تقویت کنه و حتی در سرعت های پایین که مقدارBEMF پایین هست و یکی از مشکلات درایو موتور سنسورلس در سرعت پایین هست حل بشه.
        خب این هم پروژه ی تسلا طور! VESC
        https://github.com/vedderb/bldc-hardware

        یه برنامه ی خیلی ساده هم میذارم که برای آردویینو نوشته شده
        با مراجعه به دیتاشیت atmega328 و مطالعه ی رجیستر ها و مشاهده ی دستورات اختصاصی کامپایلر-بوت لودر آردویینو IDE میبینین که چقدر واضح هست
        کد:
        // Sensorless brushless DC (BLDC) motor control with Arduino UNO and IR2101 (Arduino DIY ESC).// This is a free software without any warranty.
         
         
        #define SPEED_UP          A0          // BLDC motor speed-up button
        #define SPEED_DOWN        A1          // BLDC motor speed-down button
        #define PWM_MAX_DUTY      255
        #define PWM_MIN_DUTY      50
        #define PWM_START_DUTY    100
         
        byte bldc_step = 0, motor_speed;
        unsigned int i;
        void setup() {
          DDRD  |= 0x38;           // Configure pins 3, 4 and 5 as outputs
          PORTD  = 0x00;
          DDRB  |= 0x0E;           // Configure pins 9, 10 and 11 as outputs
          PORTB  = 0x31;
          // Timer1 module setting: set clock source to clkI/O / 1 (no prescaling)
          TCCR1A = 0;
          TCCR1B = 0x01;
          // Timer2 module setting: set clock source to clkI/O / 1 (no prescaling)
          TCCR2A = 0;
          TCCR2B = 0x01;
          // Analog comparator setting
          ACSR   = 0x10;           // Disable and clear (flag bit) analog comparator interrupt
          pinMode(SPEED_UP,   INPUT_PULLUP);
          pinMode(SPEED_DOWN, INPUT_PULLUP);
        }
        // Analog comparator ISR
        ISR (ANALOG_COMP_vect) {
          // BEMF debounce
          for(i = 0; i < 10; i++) {
            if(bldc_step & 1){
              if(!(ACSR & 0x20)) i -= 1;
            }
            else {
              if((ACSR & 0x20))  i -= 1;
            }
          }
          bldc_move();
          bldc_step++;
          bldc_step %= 6;
        }
        void bldc_move(){        // BLDC motor commutation function
          switch(bldc_step){
            case 0:
              AH_BL();
              BEMF_C_RISING();
              break;
            case 1:
              AH_CL();
              BEMF_B_FALLING();
              break;
            case 2:
              BH_CL();
              BEMF_A_RISING();
              break;
            case 3:
              BH_AL();
              BEMF_C_FALLING();
              break;
            case 4:
              CH_AL();
              BEMF_B_RISING();
              break;
            case 5:
              CH_BL();
              BEMF_A_FALLING();
              break;
          }
        }
         
        void loop() {
          SET_PWM_DUTY(PWM_START_DUTY);    // Setup starting PWM with duty cycle = PWM_START_DUTY
          i = 5000;
          // Motor start
          while(i > 100) {
            delayMicroseconds(i);
            bldc_move();
            bldc_step++;
            bldc_step %= 6;
            i = i - 20;
          }
          motor_speed = PWM_START_DUTY;
          ACSR |= 0x08;                    // Enable analog comparator interrupt
          while(1) {
            while(!(digitalRead(SPEED_UP)) && motor_speed < PWM_MAX_DUTY){
              motor_speed++;
              SET_PWM_DUTY(motor_speed);
              delay(100);
            }
            while(!(digitalRead(SPEED_DOWN)) && motor_speed > PWM_MIN_DUTY){
              motor_speed--;
              SET_PWM_DUTY(motor_speed);
              delay(100);
            }
          }
        }
         
        void BEMF_A_RISING(){
          ADCSRB = (0 << ACME);    // Select AIN1 as comparator negative input
          ACSR |= 0x03;            // Set interrupt on rising edge
        }
        void BEMF_A_FALLING(){
          ADCSRB = (0 << ACME);    // Select AIN1 as comparator negative input
          ACSR &= ~0x01;           // Set interrupt on falling edge
        }
        void BEMF_B_RISING(){
          ADCSRA = (0 << ADEN);   // Disable the ADC module
          ADCSRB = (1 << ACME);
          ADMUX = 2;              // Select analog channel 2 as comparator negative input
          ACSR |= 0x03;
        }
        void BEMF_B_FALLING(){
          ADCSRA = (0 << ADEN);   // Disable the ADC module
          ADCSRB = (1 << ACME);
          ADMUX = 2;              // Select analog channel 2 as comparator negative input
          ACSR &= ~0x01;
        }
        void BEMF_C_RISING(){
          ADCSRA = (0 << ADEN);   // Disable the ADC module
          ADCSRB = (1 << ACME);
          ADMUX = 3;              // Select analog channel 3 as comparator negative input
          ACSR |= 0x03;
        }
        void BEMF_C_FALLING(){
          ADCSRA = (0 << ADEN);   // Disable the ADC module
          ADCSRB = (1 << ACME);
          ADMUX = 3;              // Select analog channel 3 as comparator negative input
          ACSR &= ~0x01;
        }
         
        void AH_BL(){
          PORTD &= ~0x28;
          PORTD |=  0x10;
          TCCR1A =  0;            // Turn pin 11 (OC2A) PWM ON (pin 9 & pin 10 OFF)
          TCCR2A =  0x81;         //
        }
        void AH_CL(){
          PORTD &= ~0x30;
          PORTD |=  0x08;
          TCCR1A =  0;            // Turn pin 11 (OC2A) PWM ON (pin 9 & pin 10 OFF)
          TCCR2A =  0x81;         //
        }
        void BH_CL(){
          PORTD &= ~0x30;
          PORTD |=  0x08;
          TCCR2A =  0;            // Turn pin 10 (OC1B) PWM ON (pin 9 & pin 11 OFF)
          TCCR1A =  0x21;         //
        }
        void BH_AL(){
          PORTD &= ~0x18;
          PORTD |=  0x20;
          TCCR2A =  0;            // Turn pin 10 (OC1B) PWM ON (pin 9 & pin 11 OFF)
          TCCR1A =  0x21;         //
        }
        void CH_AL(){
          PORTD &= ~0x18;
          PORTD |=  0x20;
          TCCR2A =  0;            // Turn pin 9 (OC1A) PWM ON (pin 10 & pin 11 OFF)
          TCCR1A =  0x81;         //
        }
        void CH_BL(){
          PORTD &= ~0x28;
          PORTD |=  0x10;
          TCCR2A =  0;            // Turn pin 9 (OC1A) PWM ON (pin 10 & pin 11 OFF)
          TCCR1A =  0x81;         //
        }
         
        void SET_PWM_DUTY(byte duty){
          if(duty < PWM_MIN_DUTY)
            duty  = PWM_MIN_DUTY;
          if(duty > PWM_MAX_DUTY)
            duty  = PWM_MAX_DUTY;
          OCR1A  = duty;                   // Set pin 9  PWM duty cycle
          OCR1B  = duty;                   // Set pin 10 PWM duty cycle
          OCR2A  = duty;                   // Set pin 11 PWM duty cycle
        }
        سلام دوست عزیز.
        ارمیچرهای که در پرینترهستن چهارسیمه هستن بااین مدار راه میافته؟
        جدیدترین ویرایش توسط pika3; ۱۸:۲۸ ۱۳۹۸/۰۱/۲۲. دلیل: غلط املائی
        همیشه در قلبم زنده ی استاد تحیری

        دیدگاه


          #5
          پاسخ : ساخت درایور موتور براشلس

          نوشته اصلی توسط pika3 نمایش پست ها
          سلام دوست عزیز.
          ارمیچرهای که در پرینترهستن چهارسیمه هستن بااین مدار راه میافته؟
          سلام خیر اونا استپ موتور هستن و معمولا دو فاز هستن






          امیرحسین ضیا

          دیدگاه


            #6
            پاسخ : ساخت درایور موتور براشلس

            دوستان سلام. من میخواستم یک موتور آسنکرون القایی قفس سنجابی رو تبدیل کنم به موتور سنکرون آهنربا داعم. برای اینکار قصد دارم قفس سنجاب رو ببرم تراشکاری و حدود 3 الی 4 میل از محیط دایره رو تراش بدم( در واقع قطر قفس سنجاب رو کم کنم تا آهنربا هارو بتونم بچسبونم به روتور) و بعد آهنربا های نعودیمیوم رو توسط چسب اپوکسی و نخ کولار بچسبونم به روتور و استاتور رو مثل موتور BLDC سیم پیچ کنم.
            آیا به نظرتون با رعایت فاصله هوایی خیلی کم بین روتور و استاتور بازده موتور پایین خواهد بود به دلیل اینکه دست ساخت هست؟ آیا لینکی برای خرید موتور های BLDC سنسور دار(سنسور هال) با توانی مثل 3-4 کیلو وات دارین؟ بهتره موتور رو خریداری کنم یا خودم با تغییر یک موتور دیگه که هستش رو دارم بسازم؟(خرید آهنربا و چسباندن به روتور و تراشکاری فکر میکنم ارزون تر از خرید یک موتور BLDC با توان 3-4 کیلووات در بیاد)






            امیرحسین ضیا

            دیدگاه


              #7
              پاسخ : ساخت درایور موتور براشلس

              سلام دوست عزیز لطفا در رابطه با قسمت BEMF بیشتر توضیح بدید.
              من یک برنامه از نت پیدا کردم ولی مثل اینکه درست کار نمیکنه میشه کمک کنید این برنامه و مدار و بهینه کنیم و راه اندازیش بکنیم.به زبان بسکام هست
              $regfile = "m8def.dat"
              $crystal = 8000000
              '-------------------------------------------------------------------------------
              Dim Wysw As Word
              Dim Bat As Word
              Dim Impuls As Integer
              Dim K As Byte
              Dim F As Byte
              '-----------------Pomiar BMF----------------------------------------------------
              Sig1 Alias Pinc.2 'pin pomiarowy 1
              Sig2 Alias Pinc.3 'pin pomiarowy 2
              Sig3 Alias Pinc.4 'pin pomiarowy 3


              Sig0 Alias Pind.6 'impulsy
              '-----------------Klucze_Mosfet-------------------------------------------------
              'G1na Alias Pinb.4 'Klucz L1 - N
              'G2pa Alias Pinb.1 'Klucz L1 - P
              'G1nb Alias Pinb.5 'Klucz L2 - N
              'G2pb Alias Pinb.2 'Klucz L2 - P
              'G1nc Alias Pinb.7 'Klucz L3 - N
              'G2pc Alias Pinb.6 'Klucz L3 - P
              Ster Alias Pind.2 'sterowanie


              '-----------------Konfiguracja_Pull_UP--------------------------------------------------------------
              Config Portd = &B10111011 'PD2 i PD6 jako wejœcia
              Config Portc = &B11100001 'x-x-x-sig3-sig2-sig1-x-x
              Config Portb = &B11111111
              Config Int0 = Low Level
              Config Timer0 = Timer , Prescale = 8 : Stop Timer0


              Portd = &B00000100
              Portc = &B00011110
              Portb = &B00000000
              Enable Interrupts
              Enable Int0
              Declare Sub Obroty


              Config Adc = Single , Prescaler = Auto , Reference = Avcc
              Start Adc : Bat = Getadc(1)




              Input Ster
              F = 65000 - Ster




              Do
              K = Tcnt0 + F
              Call Obroty




              Loop


              Sub Obroty


              Portb = Lookup(0 , Kroki) 'krok zerowy
              Start Timer0
              While Sig1 = 0
              Stop Timer0
              Waitus K
              Tcnt0 = 0
              Wend


              Portb = Lookup(1 , Kroki) 'krok pierwszy
              Start Timer0
              While Sig2 = 0
              Stop Timer0
              Waitus K
              Tcnt0 = 0
              Wend


              Portb = Lookup(2 , Kroki) 'krok drugi
              Start Timer0
              While Sig3 = 0
              Stop Timer0
              Waitus K
              Tcnt0 = 0
              Wend


              Portb = Lookup(3 , Kroki) 'krok trzeci
              Start Timer0
              While Sig1 = 0
              Stop Timer0
              Waitus K
              Wend


              Portb = Lookup(4 , Kroki) 'krok czwarty
              Start Timer0
              While Sig2 = 0
              Stop Timer0
              Waitus K
              Wend


              Portb = Lookup(5 , Kroki) 'krok piaty - ostatni
              Start Timer0
              While Sig3 = 0
              Stop Timer0
              Waitus K
              Wend
              End Sub






              '-----------------------Kroki---------------------------------------
              Kroki:
              Data &B00111000 'x011100x ZLH ADC2
              Data &B00011010 'x001101x HLZ ADC4
              Data &B00001110 'x000111x HZL ADC3
              Data &B00100110 'x010011x ZHL ADC2
              Data &B01100010 'x110001x LHZ ADC4
              Data &B01101000 'x110100x LZH ADC3

              دلیل: ادغام دو پست برای جلوگیری از اسپم

              شماتیک مدارو نتونستم اضافه کنم

              دیدگاه


                #8
                پاسخ : ساخت درایور موتور براشلس

                با تشکر از زحماتتون. اگر امکان داره در مورد شکل موج های اعمالی به موتور و نحوه ی کنترل بیشتر توضیح بفرمایید
                گویند سنگ لعل شود در مقام صبر اری شود ولی به خون جگر شود
                همیشه آخر همه چیز خوبه، اگر هم هنوز خوب نشده پس هنوز آخرش نشده(چارلی چاپلین)

                دیدگاه


                  #9
                  پاسخ : ساخت درایور موتور براشلس

                  نوشته اصلی توسط alireza61sh2000 نمایش پست ها
                  سلام دوست عزیز لطفا در رابطه با قسمت BEMF بیشتر توضیح بدید.
                  من یک برنامه از نت پیدا کردم ولی مثل اینکه درست کار نمیکنه میشه کمک کنید این برنامه و مدار و بهینه کنیم و راه اندازیش بکنیم.به زبان بسکام هست
                  $regfile = "m8def.dat"
                  $crystal = 8000000
                  '-------------------------------------------------------------------------------
                  Dim Wysw As Word
                  Dim Bat As Word
                  Dim Impuls As Integer
                  Dim K As Byte
                  Dim F As Byte
                  '-----------------Pomiar BMF----------------------------------------------------
                  Sig1 Alias Pinc.2 'pin pomiarowy 1
                  Sig2 Alias Pinc.3 'pin pomiarowy 2
                  Sig3 Alias Pinc.4 'pin pomiarowy 3


                  Sig0 Alias Pind.6 'impulsy
                  '-----------------Klucze_Mosfet-------------------------------------------------
                  'G1na Alias Pinb.4 'Klucz L1 - N
                  'G2pa Alias Pinb.1 'Klucz L1 - P
                  'G1nb Alias Pinb.5 'Klucz L2 - N
                  'G2pb Alias Pinb.2 'Klucz L2 - P
                  'G1nc Alias Pinb.7 'Klucz L3 - N
                  'G2pc Alias Pinb.6 'Klucz L3 - P
                  Ster Alias Pind.2 'sterowanie


                  '-----------------Konfiguracja_Pull_UP--------------------------------------------------------------
                  Config Portd = &B10111011 'PD2 i PD6 jako wejœcia
                  Config Portc = &B11100001 'x-x-x-sig3-sig2-sig1-x-x
                  Config Portb = &B11111111
                  Config Int0 = Low Level
                  Config Timer0 = Timer , Prescale = 8 : Stop Timer0


                  Portd = &B00000100
                  Portc = &B00011110
                  Portb = &B00000000
                  Enable Interrupts
                  Enable Int0
                  Declare Sub Obroty


                  Config Adc = Single , Prescaler = Auto , Reference = Avcc
                  Start Adc : Bat = Getadc(1)




                  Input Ster
                  F = 65000 - Ster




                  Do
                  K = Tcnt0 + F
                  Call Obroty




                  Loop


                  Sub Obroty


                  Portb = Lookup(0 , Kroki) 'krok zerowy
                  Start Timer0
                  While Sig1 = 0
                  Stop Timer0
                  Waitus K
                  Tcnt0 = 0
                  Wend


                  Portb = Lookup(1 , Kroki) 'krok pierwszy
                  Start Timer0
                  While Sig2 = 0
                  Stop Timer0
                  Waitus K
                  Tcnt0 = 0
                  Wend


                  Portb = Lookup(2 , Kroki) 'krok drugi
                  Start Timer0
                  While Sig3 = 0
                  Stop Timer0
                  Waitus K
                  Tcnt0 = 0
                  Wend


                  Portb = Lookup(3 , Kroki) 'krok trzeci
                  Start Timer0
                  While Sig1 = 0
                  Stop Timer0
                  Waitus K
                  Wend


                  Portb = Lookup(4 , Kroki) 'krok czwarty
                  Start Timer0
                  While Sig2 = 0
                  Stop Timer0
                  Waitus K
                  Wend


                  Portb = Lookup(5 , Kroki) 'krok piaty - ostatni
                  Start Timer0
                  While Sig3 = 0
                  Stop Timer0
                  Waitus K
                  Wend
                  End Sub






                  '-----------------------Kroki---------------------------------------
                  Kroki:
                  Data &B00111000 'x011100x ZLH ADC2
                  Data &B00011010 'x001101x HLZ ADC4
                  Data &B00001110 'x000111x HZL ADC3
                  Data &B00100110 'x010011x ZHL ADC2
                  Data &B01100010 'x110001x LHZ ADC4
                  Data &B01101000 'x110100x LZH ADC3

                  دلیل: ادغام دو پست برای جلوگیری از اسپم

                  شماتیک مدارو نتونستم اضافه کنم
                  سلام خوبین خوشین؟
                  من بسکام رو میتونم دست و پا شکسته ترجمه کنم و تسلط ندارم رو بسکام/ همچنین چون قراره کلید این پروژه بعد کنکورم بچرخه حتما این کد رو بررسی خواهم کرد و ممنون میشم شماتیک رو قرار بدین تا بررسی کنیم با هم

                  دلیل: ادغام دو پست برای جلوگیری از اسپم

                  نوشته اصلی توسط amin20107 نمایش پست ها
                  با تشکر از زحماتتون. اگر امکان داره در مورد شکل موج های اعمالی به موتور و نحوه ی کنترل بیشتر توضیح بفرمایید
                  سلام امیدوارم حالتون خوب باشه/موتور های براشلسی که امروزه داریم زیاد میشنویم در واقع یک نوع موتور سنکرون آهنربا داعم هستن(به اختصار بهشون میگن PMSM )
                  و خب دو نوع اینرانر و اوت رانر دارن / پالس اعمالی در این دو میتونه فرق کنه و واس همین برخی تفاوت BLDC و PMSM رو در پالس اعمالی میدونن! همچنین در برخی موتور های PMSM یک قفس سنجابی هم در کنار این آهنربا های داعم وجود داره تا در مرحله ی شروع به کار مانند موتور القایی آسنکرون عمل کنه و لغزش (و بوجود آمدن فرکانس روتور) باعث چرخش اولیه در آنها بشه و سینک بشه با چرخش میدان مغناطیسی
                  تفاوت در پالس اعمالی هم این هست که برخی میگن PMSM اگه با AC راه اندازی بشه اسمش PMSM هست و اگه با مربعی راه اندازی بشه اسمش میشه PMBLDC یا همون BLDC البته که ما میتونیم جفت این موتور هارو هم با AC همون سینوسی به عبارتی و هم با DC (مربعی) ران کنیم و تفاوت در این خواهد بود که اگه با سه فاز سینوسی ران کنیم چرخش نرم تر خواهد بود (در سروو ها و جیمبال ها)در سرعت های پایین و هارمونیک بهتری در هسته خواهیم داشت و تلفات کمتر خواهد بود(در تعوری) / برای کنترل بهتر در زمان استارت موتور (همانند موتور های dc که در زمان استارت BEMF پایین هست و جریان زیادی کشیده میشه) ما میایم پالس های مربعی رو بصورت pwm به هسته اعمال میکنیم(سه فاز بصورت PWM ) که جریان بالایی در زمان استارت نداشته باشیم و بالا رفتن RPM ناگهانی به بالبیرینگ ها و کلا بار صدمه نرسونه/ همچنین در موتور های سنکرون برای کنترل بهتر و تولید گشتاور بهتر حتما باید زاویه ی روتور نسبت به استاتور رو داشت تا بشه پالس بعدی رو اعمال کرد
                  جدیدترین ویرایش توسط Amir Zia; ۱۳:۲۱ ۱۳۹۸/۰۱/۳۰.






                  امیرحسین ضیا

                  دیدگاه


                    #10
                    پاسخ : ساخت درایور موتور براشلس


                    شماتیک برنامه بالا
                    بیشتر مشکل من تو قسمت BEMF هست .اگه ممکنه بیشتر توضیح بدید.
                    این BEMF رو تو LTSPICE شبیه سازی کردم الان این درسته؟
                    جدیدترین ویرایش توسط alireza61sh2000; ۱۴:۵۸ ۱۳۹۸/۰۱/۳۰.

                    دیدگاه


                      #11
                      پاسخ : ساخت درایور موتور براشلس

                      نوشته اصلی توسط alireza61sh2000 نمایش پست ها
                      http://s9.picofile.com/file/8357916326/Capture.JPG
                      شماتیک برنامه بالا
                      بیشتر مشکل من تو قسمت BEMF هست .اگه ممکنه بیشتر توضیح بدید.
                      این BEMF رو تو LTSPICE شبیه سازی کردم الان این درسته؟
                      http://s8.picofile.com/file/8357916692/BEMF.JPG
                      توی برنامه نویسیش مشکل دارین یا توی مدارش؟ مدار رو مثل عکسی که دادین ببندین مشکلی وجود نخواهد داشت(اون عکسی که مربوط به شبیه ساز هم میشد به نظر مشکلی نداشت)
                      شما اول باید یک گراند مجازی بسازین چون اتصال دلتا هست و گراند نداریم بعد توی برنامه نویسی زمانی که کویل های دیگر انرجایز میشه کویلی که انرجایز نیست رو بررسی کنین و ببینین کی زیرو کراس میشه

                      معمولا میان از تایمر استفاده میکنن و دلتای زیرو کراس قبلی و فعلی رو میخونن و طبق اون پالس بعدی رو به کویل میدن
                      به نظرم این روش مناسب نیست چون طبق دیتای قبلی آینده ی وضعیت روتور رو پیشبینی میکنه و پالس میده
                      من از هال سنسور استفاده میکنم ولی اگه میخواین برای درونتون esc بسازین از همین BEMF استفاده کنین.
                      آیا PCB طراحی کردین؟






                      امیرحسین ضیا

                      دیدگاه


                        #12
                        پاسخ : ساخت درایور موتور براشلس

                        نوشته اصلی توسط azjaguar نمایش پست ها
                        توی برنامه نویسیش مشکل دارین یا توی مدارش؟ مدار رو مثل عکسی که دادین ببندین مشکلی وجود نخواهد داشت(اون عکسی که مربوط به شبیه ساز هم میشد به نظر مشکلی نداشت)
                        شما اول باید یک گراند مجازی بسازین چون اتصال دلتا هست و گراند نداریم بعد توی برنامه نویسی زمانی که کویل های دیگر انرجایز میشه کویلی که انرجایز نیست رو بررسی کنین و ببینین کی زیرو کراس میشه

                        معمولا میان از تایمر استفاده میکنن و دلتای زیرو کراس قبلی و فعلی رو میخونن و طبق اون پالس بعدی رو به کویل میدن
                        به نظرم این روش مناسب نیست چون طبق دیتای قبلی آینده ی وضعیت روتور رو پیشبینی میکنه و پالس میده
                        من از هال سنسور استفاده میکنم ولی اگه میخواین برای درونتون esc بسازین از همین BEMF استفاده کنین.
                        آیا PCB طراحی کردین؟
                        البته من با کمی تغییرات مدارو ساختم که اونم عکسش رو میزارم .مشکل من تو قسمت bemfهست که متوجه نمیشم .مقدار مقاومت ها رو چطوری انتخاب کنم.کلا توی قسمت bemfچی میگذره اگه براتون مقدوره با شکل موج راهنمایی کنید که در هر مرحله چه وضعیتی تو قسمت bemfبوجود میاد .خروجی اپ امپ ها به چه صورت باید باشه؟

                        دیدگاه


                          #13
                          پاسخ : ساخت درایور موتور براشلس

                          نوشته اصلی توسط alireza61sh2000 نمایش پست ها
                          البته من با کمی تغییرات مدارو ساختم که اونم عکسش رو میزارم .مشکل من تو قسمت bemfهست که متوجه نمیشم .مقدار مقاومت ها رو چطوری انتخاب کنم.کلا توی قسمت bemfچی میگذره اگه براتون مقدوره با شکل موج راهنمایی کنید که در هر مرحله چه وضعیتی تو قسمت bemfبوجود میاد .خروجی اپ امپ ها به چه صورت باید باشه؟
                          ببینین ما حداکثر ولتاژی که توی bemf میگیریم کمی کمتر از ولتاژ اعمالی روی موتور هست زمانی که هیچ گونه بار بر روی موتور قرار نداره! مثلا اگه 20 ولت به موتور بدیم و هیچ گونه بار بر روی موتور نداشته باشیم و موتور آزادانه بچرخه و جریان کمی مصرف کنه BEMF برابر خواهد بود با ولتاژ اعمالی منهای ولتاژی که توسط مقاومت سیم پیچ ها و تلفات مکانیکی افت پیدا میکنه که تقریبا برابر همون 20 ولت خواهد بود چون تلفات نزدیک به 0 هست.
                          BEMF چیه؟ BEMF در واقع ولتاژی هست که توسط تغییرات میدان مغناطیسی اطراف یک سیم پیچ رخ میده. زمانی که موتور در حال چرخش هست آهنربا های روتور از کنار سیم پیچ های استاتور عبور میکنن و یک ولتاژی رو در اون کویل القا میکنن(در مورد کویلی داریم حرف میزنیم که انرجایز نشده ) و این ولتاژ زمانی به صفر میرسه و جهتش تغییر میکنه که آهنربا دقیقا مقابل کویل قرار بگیره و اگه تا حالا داشت نزدیک میشد به کویل حالا از کویل دور بشه! یا بالعکس! ما به این میگیم زیرو کراسینگ( یعنی عبور از صفر و تغییر جهت ولتاژ) ما با توجه به زمان دو زیرو کراسینگ باید پالس بعدیمون رو اعمال کنیم.
                          تقسیم مقاومتی و آپ امپ باید چجوری باشه؟ با توجه به اینکه شما چه ولتاژی میخواین به موتور اعمال کنین و با توجه به اینکه میکروی استفاده شده در طرح شما قابلیت خواندن آنالوگ تا 5 ولت رو داره باید جوریمقاومت هارو تنظیم کنی که ولتاژ bemf بین 0 تا 5 ولت بشه و اینجاش رو دقیق نمیدونم آیا ولتاژ رو روی 2.5 تنظیم میکنن تا تغییر جهت ولتاژ رو اینطوری متوجه شن یا چی چون تجربه ی برنامه نویسی bemf رو ندارم هنوز. (ولتاژ بین گراند مجازی و سیم آزاد کویلی که یک سرش در اون لحظه آزاد هست) از آپ امپ هم برای تقویت پالس استفاده میشه که بازم با توجه به میکرویی که دارین استفاده میکنین نیازی به تقویت نیس به نظرم/ خروجی آپ امپ هم معمولا مربعی میشه(بر خلاف خروجی bemf که ذوزنقه ای هست) چون شما فقط میخوای ببینی که چه زمانی به صفر رسیده ولتاژ bemf
                          جدیدترین ویرایش توسط Amir Zia; ۱۳:۳۸ ۱۳۹۸/۰۱/۳۱.






                          امیرحسین ضیا

                          دیدگاه


                            #14
                            پاسخ : ساخت درایور موتور براشلس

                            روی برنامه و قسمت emf کار کنم باز هم مزاحمتون میشم.
                            انشاالله تو کنکور هم موفق بشید.بعد کنکور حتما استارت ساخت درایور رو هم بزنید .
                            فقط اگه ممکنه از دو ماسفت هم nو هم pاستفاده کنید.

                            دیدگاه


                              #15
                              پاسخ : ساخت درایور موتور براشلس

                              نوشته اصلی توسط alireza61sh2000 نمایش پست ها
                              روی برنامه و قسمت emf کار کنم باز هم مزاحمتون میشم.
                              انشاالله تو کنکور هم موفق بشید.بعد کنکور حتما استارت ساخت درایور رو هم بزنید .
                              فقط اگه ممکنه از دو ماسفت هم nو هم pاستفاده کنید.
                              سلامت باشی ریفیق/ من از ماسفت p برای بخش قدرت استفاده نمیکنم یه درایور خفن صنعتی و روتین دارم طراحی میکنم که توی های ساید هم بتونم از ان چنل استفاده کنم تموم ک شد میذارم تو همین تاپیک






                              امیرحسین ضیا

                              دیدگاه

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