اطلاعیه

Collapse
No announcement yet.

کار با پروتکل CAN

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

    کار با پروتکل CAN

    با سلام به همه دوستان عزیز
    چند وقت پیش داشتم رزومه یه شرکت خارجی رو بررسی می کردم (خدا زیادشون کنه) دیدم اکثرا توی پروژههای صنعتی از CAN برای ارتباط استفاده کرده. (CAN یا Controller Area Network یه پروتکل خیلی عالی برای کار در محیطهای نویزی با سرعت بالا است)
    با خودم گفتم که چه خوبه من هم از این پروتکل در پروژه ها مخصوصا اون جاهایی که نویز زیاده استفاده کنم.
    برای همین یه سرچی داخل سایتهای فارسی زدم طبق معمول چیزی جز ساعت سامورایی و ... گیرم نیومد.
    تا اینکه به ECA رسیدم گفتم بهتره یه تاپیک بزنم تا هر کس چیزی بلده یا حتی چیزی از کسی شنیده بگه تا بتونیم به لطف خدا این پروتکل رو هم مثل پروتکل Serial بومی سازی اش کنیم.
    اگه کسی از دوستان مثالی برای میکروی SAM7X256 داره با یکم توضیحات بذاره تا تحلیلش کنیم و همه یاد بگیرن

    #2
    پاسخ : کار با پروتکل CAN

    با سلام
    ممنون از اینکه این تاپیک رو ایجاد کردید.
    سیستم عامل RTXیه کتابخونه برای کار با پروتکل CAN داره. آقای حسینی زحمت کشیدن و پروژهآ‌ای رو که در این زمینه انجام داده بودن با آموزش و توضیحات کامل توی این تاپیک گذاشتن.
    http://www.eca.ir/forum2/index.php?topic=49501.30
    حالا که یه تاپیک جدا برای این مطلب باز شده، من با اجازهآ‌ی ایشون مطالبشون رو اینجا میآ‌ذارم.

    پیاده سازی شبکه CAN با میکروکنترلر AT91SAM7X256 و سیستم عامل بلادرنگ RTX

    CAN (مخفف Controller Area Network) یک باس استاندارد است که برای برقراری ارتباط بین واحدهای کنترل الکترونیکی (ECU) درون یک خودرو طراحی شده و پراستفاده ترین پروتکل در طراحی و ساخت قسمت های ارتباطی وسایل نقلیه است. امروزه CAN بخاطر قابلیت هایی که دارد، در انواع پروژه ها و محیط های صنعتی نیز استفاده می شود.
    CAN یک پروتکل مبتنی بر پیام (message based) و multi-master broadcast سریال است. شبکه CAN می تواند شامل تعداد زیادی Node باشد که هر Node قابلیت ارسال و دریافت اطلاعات را دارد. هر پیام شامل یک ID و حداکثر 8 بایت داده است. وسایل (device) های متصل شده به CAN، عموما حسگرها (sensor)، محرک ها (actuator) و دیگر تجهیزات کنترلی هستند.
    ویژگی ها :
    - پرسرعت (تا 1Mbps)
    - قابلیت اولویت بندی پیام ها، مناسب برای طراحی سیستم بلادرنگ (پیام با شماره ID پایین تر دارای اولویت بالاتر است)
    - باس 2 سیمه تفاضلی (2-wire differential bus)
    - ایمنی بسیار زیاد در برابر نویز
    - قابلیت خطایابی، کنترل و رفع خطا (در مواقع تداخل و ...)
    - استاندارد ISO 11898 در لایه Data link و قسمت هایی از لایه فیزیکی

    برای پیاده سازی، هر Node به موارد زیر نیاز دارد :
    - Host processor
    o پردازنده تصمیم می گیرد که هر پیام دریافتی چه معنایی دارد و با توجه به پیام چه عملی باید صورت گیرد. همینطور وظیفه تصمیم گیری در مورد پیام هایی که باید ارسال شوند به عهده این قسمت است. کاربر با برنامه نویسی پردازنده، سیستم مورد نظر را کنترل میکند. sensorها و actuatorها به پردازنده متصل می شوند.
    - CAN controller
    o وظیفه دریافت : CAN controller بیت ها را بصورت سریال از باس دریافت می کند تا یک پیام کامل فراهم شود. سپس پیام به Host processor منتقل می شود.
    o وظیفه ارسال : Host processor بیت های ارسالی را در CAN controller ذخیره می کند تا پیام را بشکل سریال ارسال کند.
    - Transceiver
    o وظیفه تبدیل سطوح سیگنال بین باس و CAN controller را به عهده دارد. باس ایجاد شده توسط Transceiver یک باس دو سیمه تفاضلی است. سیگنال های این باس CAN_H و CAN_L نام دارند.


    میکرو کنترلر AT91SAM7X256 (مبتنی بر پردازنده ARM7-TDMI) دارای یک CAN controller می باشد. این کنترلر دارای هشت Mailbox (یا Channel) است. هر Mailbox می تواند هربار تا حداکثر 8 بایت داده را ارسال یا دریافت کند. دو Frame مهم CAN عبارتند از Data frame و Remote frame. Data frame برای ارسال داده و Remote frame برای درخواست داده استفاده می شود. با ارسال Remote frame، کنترلر مقصد (بدون درگیر کردن پردازنده) بطور خودکار داده درخواستی که توسط کاربر مشخص شده را ارسال می کند. فریم ها دارای یک identifier می باشند. این ID برای Standard frame ها 11 بیت وبرای Extended frame ها 29 بیت می باشد.
    از آی سی MCP2551 می توان به عنوان Transceiver استفاده کرد. دو سر باس CAN باید توسط مقاومت های 120 اهمی به هم متصل شوند تا جریان نسبتا بالایی در باس ایجاد شده و مقاومت باس در برابر نویز زیاد شود.


    برای آشنایی با پیاده سازی این شبکه، مداری مانند شکل زیر با 4 node بسته شد. هرکدام از میکروکنترلرها، توسط تراشه MCP2551 ، به عنوان یک Node به باس CAN متصل هستند. میکرو کنترلرهای 1 ، 2 و 3، هر 300 میلی ثانیه، یک ورودی ADC را خوانده و با یک پیام دو بایتی برای میکروکنترلر4 ارسال می کنند. میکروکنترلر4 که منتظر دریافت اطلاعات است، بعد از دریافت هر پیام، اطلاعات دریافتی از هر node را روی LCD همراه با شماره node نمایش می دهد. همزمان node شماره 4 نیز می توان برای node های دیگر اطلاعات ارسال کرده و فرمان مناسب را صادر کند. عملیات ارسال و دریافت به شکل تسک های جدا توسط سیستم عامل RTX نوشته شده است.


    RL-RTX یک هسته سیستم عامل بلادرنگ تحت محیط توسعه KEIL MDK برای پردازنده های ARM7TDMI ، ARM9 و CORTEX-M3 است. توسط این سیستم عامل می توان بسادگی یک سیستم بلادرنگ شامل تسک های اولویت بندی شده طراحی کرد. پشتیبانی از پروتکل بلادرنگ CAN (library RL-CAN) از جمله ویژگی های مهم این سیستم عامل است.
    CAN

    فایل های کتابخانه RL-CAN :
    RTX_CAN.h : این فایل شامل تعریف توابع و ثابت ها است.
    RTX_CAN.c : توابع عمومی کنترلر CAN. این فایل با فایل CAN_chip.c که پیاده سازی قسمت سخت افزار کنترلر است ارتباط بر قرار می کند.
    CAN_chip.c : با توجه به میکروکنترلر مورد استفاده باید یکی از فایل های مربوط استفاده شود. (CAN_SAM7X.c در این پروژه)
    CAN_CFG.h : فایل پیکربندی کنترلر CAN


    برای ارسال و دریافت فریم ها از نوع داده CAN_msg که به شکل زیر تعریف شده است استفاده می شود.
    کد:
    typedef struct {
     U32 id;         /* 29 bit identifier                */
     U8 data[8];      /* Data field                   */
     U8 len;        /* Length of data field in bytes          */
     U8 ch;         /* Object channel                 */
     U8 format;       /* 0 - STANDARD,  1 - EXTENDED IDENTIFIER     */
     U8 type;        /* 0 - DATA FRAME, 1 - REMOTE FRAME        */
    } CAN_msg;
    توابع CAN_init و CAN_start برای راه اندازی کنترلر CAN فراخوانی می شوند.
    CAN_ERROR CAN_init (
      U32 ctrl,     /* CAN Controller */
      U32 baudrate);  /* Baudrate */
    
    CAN_ERROR CAN_start (
      U32 ctrl);  /* CAN Controller to Enable */
    CAN_rx_object برای پیکربندی یک Mailbox(channel) در حالت دریافت استفاده می شود.
    CAN_ERROR CAN_rx_object (
      U32 ctrl,       /* CAN Controller */
      U32 channel,      /* CAN Channel Number */
      U32 id,        /* Message ID */
      U32 object_para);   /* Object Parameters */
    CAN_receive فریم ارسال شده به Mailbox را دریافت می کند. پارامتر سوم تابع، زمانی را برای انتظار دریافت فریم مشخص می کند. در صورتی که 0xFFFF انتخاب شود، این زمان نامحدود می شود. لازم به ذکر است که این زمان تلف نمی شود. با وجود سیستم عامل، زمان پردازش در اختیار تسک های دیگر قرار می گیرد.
    CAN_ERROR CAN_receive (
      U32 ctrl,    /* CAN Controller */
      CAN_msg *msg,  /* CAN Message */
      U16 timeout);  /* Time to Wait */
    CAN_send : ارسال داده
    CAN_ERROR CAN_send (
      U32 ctrl,    /* CAN Controller */
      CAN_msg *msg,  /* CAN Message */
      U16 timeout);  /* Time to Wait */
    CAN_request : ارسال Remote frame
    CAN_ERROR CAN_request (
      U32 ctrl,    /* CAN Controller */
      CAN_msg *msg,  /* CAN Message to Request */
      U16 timeout);  /* Time to Wait */
    CAN_set : پیکربندی یک Mailbox برای پاسخ خودکار به Remote frame
    CAN_ERROR CAN_set (
      U32 ctrl,    /* CAN Controller */
      CAN_msg *msg,  /* CAN Message */
      U16 timeout);  /* Time to Wait */
     
    نمونه برنامه :
    __task  void tsk_send(void)
    {
      int i = 0;
      CAN_msg msg_buf2 = {
       33,              // ID
       { 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00 },  // Data
       2,              // Length
       2,              // Channel
       STANDARD_FORMAT,       // Format
       DATA_FRAME          // Type
      };
    
      AT91S_ADC *pADC = AT91C_BASE_ADC;
      pADC->ADC_CR = AT91C_ADC_SWRST;   //reset
      pADC->ADC_MR |= AT91C_ADC_LOWRES_8_BIT | (0x3<<24);
      pADC->ADC_CHER = AT91C_ADC_CH4;
    
      os_itv_set(30);
      while(1){
         pADC->ADC_CR = AT91C_ADC_START;
         while (pADC->ADC_SR & AT91C_ADC_EOC4 == 0);  //End of Conversion
         adc_data = (unsigned int) pADC->ADC_CDR4 & AT91C_ADC_DATA;
    
         msg_buf2.data[0] = 'A';
         msg_buf2.data[1] = adc_data;
         CAN_send(1, &msg_buf2, 0xffff);
         os_itv_wait();
      }
    }
    این تسک هر 300 میلی ثانیه اطلاعات ADC را خوانده و ارسال می کند. شماره ID 33 و Mailbox 1 با طول 2 بایت.
    CAN_rx_object(1, 2, 33, DATA_TYPE | STANDARD_TYPE);
    __task  void tsk_receive(void)
    {
      CAN_msg  msg_buf;
    
      while(1){
       CAN_receive (1, &msg_buf, 0xffff);
       if (msg_buf.data[0] == 'A'){
         lcd_gotoxy(1,3);
         lcd_putsf("  ");
         lcd_gotoxy(1,3);
         lcd_puts(msg_buf.data[1]);
       }
       else if (msg_buf.data[0] == 'B'){
         lcd_gotoxy(1,11);
         lcd_putsf("  ");
         lcd_gotoxy(1,11);
         lcd_puts(msg_buf.data[1]);
       }
       else if (msg_buf.data[0] == 'C'){
         lcd_gotoxy(2,3);
         lcd_putsf("  ");
         lcd_gotoxy(2,3);
         lcd_puts(msg_buf.data[1]);
       }
      }
    }
    تسک دریافت برای فریم داده استاندارد. Mailbox 2 با ID 33 .

    دیدگاه


      #3
      پاسخ : کار با پروتکل CAN

      چند تا سوال:
      1- یعنی شما می فرمایید که اتصال دو میکرو به صورت مستقیم ممکن نیست و علاوه بر خود میکرو که CAN را ساپورت میکنه باید از MCP2551 هم استفاده کرد؟
      2- منظور از Mail box چیست؟

      با اجازه آقای حسینی من PDF آموزش CAN را اینجا قرار میدهم تا این تاپیک کامل بشه.

      http://spiderman.persiangig.com/micro/can.pdf

      دیدگاه


        #4
        پاسخ : کار با پروتکل CAN

        سلام
        mcp2551 یا pca82c251 هر دو به عنوان driver برای پروتکل Can هستند و کنترلر اصلی داخل خود میکرو هست .
        در پروتکل can به طور معمول در هر ارسال حداکثر 8 بایت را می توان انتقال داد . در اصل این 8 بایت همراه با یک سری رجیسترهای کنترلی داخل یک فضایی از حافظه رم قرار می گیرند که به نام mailboxN است . در میکرو at91sam7x256 دارای 8 mailbox می باشد که هر کدام میتوانند هر گونه حالتی را داشته باشند و با یکی از رجسترها که برای اولویت بندی است بین اجرا و انتفال اطلاعات تمایز ایجاد می شود .

        دیدگاه


          #5
          پاسخ : کار با پروتکل CAN

          ساعت سامورائی را خوب اومدی
          تا وقتی که داخله این مملکت حواسه همه به ساعت سامورائی یا مهره ماره اوضاعه علمی کشور بهتر از این نمیشه...
          داخله فیسبوک هر چی مطلبه علمی مینویسم هیچ کس لایکش نمیکنه ولی مطالبه عشق و عاشقی را هر نفر صد بار لایکش میکنه.
          الکترونیک فقط ترانزیستور نیست...موفقیت فقط الکترونیک نیست...زندگی فقط موفقیت نیست.

          دیدگاه


            #6
            پاسخ : کار با پروتکل CAN

            دوستان سلام
            از همه دوستانی که کار با کن رو کامل بلد شده اند ، تقاضا میکنم مراجعی رو در این زمنیه معرفی کنند به من باید پروتکل کن رو کامل شناسایی کنم و یک گزارش کامل و جامع راجع بهش بنویسم ...

            دیدگاه


              #7
              پاسخ : کار با پروتکل CAN

              سلام
              دوستان من با basco1m و atmega 32 می خوام با پروتکل can ارتباط برقرار کنم ممنون میشم اگه راهنماییم کنید
              موفق باشید

              دیدگاه


                #8
                پاسخ : کار با پروتکل CAN

                بیسیک و سی که فرقی نداره ولی پیشنهاد می کنم که تا دیر نشده بری سراغ سی .
                در مورد مگا 32 که خوب مشخصه که رابط can رو نداره ولی در خانواده avr می تونی بری سراغ at90can که این رو داره . اما اگه فقط می خواهی با همین مگا 32 کار کنی باید یه کنترلر can در کنار میکرو بزاری مثل sja1000 .

                دیدگاه


                  #9
                  پاسخ : کار با پروتکل CAN

                  در فایل word زیر به صورت کامل شبکه کنترل کننده CAN معرفی شده
                  http://pnukaraj.persiangig.com/docum...20%20%2031.DOC

                  دیدگاه


                    #10
                    پاسخ : کار با پروتکل CAN

                    نوشته اصلی توسط D-jital
                    چند تا سوال:
                    1- یعنی شما می فرمایید که اتصال دو میکرو به صورت مستقیم ممکن نیست و علاوه بر خود میکرو که CAN را ساپورت میکنه باید از MCP2551 هم استفاده کرد؟
                    2- منظور از Mail box چیست؟

                    با اجازه آقای حسینی من PDF آموزش CAN را اینجا قرار میدهم تا این تاپیک کامل بشه.

                    http://spiderman.persiangig.com/micro/can.pdf
                    با سلام
                    ابتدا ممنون از همه بابت این تاپیک ها
                    بعد اینکه این فایل pdfیک سری تصاویر داره که با دانلود نمایش داده نمیشه
                    ممنون میشم اگر که مشکل را بفرمایین؟؟؟؟

                    moshkel hal shod
                    mamnon ke inghadr rahnamaiii kardiinn

                    دیدگاه


                      #11
                      پاسخ : کار با پروتکل CAN

                      سلام به همه دوستان - آقا من این پرتکل رو برای lpc1768 ران کردم ولی مشکلی که دارم اینه که نمیدونم چرا هر ID رو نمیشه تعریف کرد ، مثلا وقتی ID رو میذارم 0x200 دیتا دریافت میشه بدون مشکل ولی چرا وقتی که ID رو می ذارم 0x25A پکت دریافت نمیشه ، آیا کلاس خاصی برای تعیین ID وجود داره ؟
                      چطور میشه در ضمن ID رو من به صورت 11 بیتی تعریف کردم که فضایی بین 0 تا 7FF رو شامل میشه

                      دیدگاه


                        #12
                        پاسخ : کار با پروتکل CAN

                        سلام کسی تا به حال موفق شده باس CAN رو روی میکروی SAM7x256 پیاده سازی کنه؟
                        بنده دو تا میکرو دارم که باید با ارتباط CAN به یکدیگر وصل بشن و مستر به اسلیو داده برفسته.
                        بگذارعشق خاصیت تو باشد نه رابطه خاص تو باکسی
                        موفقيت پيش رفتن است نه به نقطه ي پايان رسيدن
                        نلسون ماندلا

                        دیدگاه


                          #13
                          پاسخ : کار با پروتکل CAN

                          اینم یه معرفیآ‌ مختصرو مفید از can bus که به نظرم مفید برای کسانیآ‌ که شروع میآ‌کنن
                          http://www.youtube.com/watch?v=fTWp6bFIt0s

                          دیدگاه


                            #14
                            پاسخ : کار با پروتکل CAN

                            سلام من این پروتکل با sam7x بدون استفاده از RTX راه اندازی کردم

                            دیدگاه


                              #15
                              پاسخ : پاسخ : کار با پروتکل CAN

                              نوشته اصلی توسط ahad65
                              سلام من این پروتکل با sam7x بدون استفاده از RTX راه اندازی کردم
                              آفرین
                              برنامه ، شماتیک؟

                              دیدگاه

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