برای برقراری ارتباط پروتکلهای زیادی وجود دارند؛ پروتکلهایی که برای ارتباط نزدیک طراحی و پایهریزی شدهاند، پروتکلهایی که برای ارتباط راه دور (پروتکل CAN) مورداستفاده قرار میگیرند و حتی پروتکلهایی که مخصوص روی برد هستند.
یکی از مهمترین نیازهای هر ارتباطی، اطمینان از صحت دادههای دریافتی است. قبلاً در خصوص خطایابی و ترمیم داده با استفاده از همینگ کد توضیح دادهایم. چالش بعدی سرعت انتقال داده است. با توجه به نرمافزاری بودن سیستم خطایابی در بیشتر پروتکلهای ارتباطی، سرعت، رابطهای مستقیم با فرکانس پردازنده خواهد داشت. حال فرض کنید پروتکلی موجود باشد که خطایابی را بهصورت سختافزاری انجام دهد و نیازی به درگیری پردازنده نباشد. با این تکنیک میتوان به سرعتهای بالاتری دست پیدا کرد. پروتکلهایی مثل شبکه و یا CAN دارای چنین قابلیتهایی هستند.
چیزی که استفاده از این پروتکلها را محدود کرده است، در وهلهی اول، پیچیدگیهای سختافزاری و نیاز به قطعات جانبی موردنیاز و بعدازآن پیچیدگی ظاهری پروتکل است.
در این مقاله قصد داریم به بررسی پروتکل ارتباطی CAN بپردازیم و مختصری از نحوهی کانفیگ اولیه آن را به زبان ساده بیان کنیم. با سیسوگ همراه باشید.
پروتکل CAN چیست و از کجا آمده است؟
شاید باور اینکه، این پروتکل ابتدا برای خودرو پایهریزی شد، مقداری سخت باشد. خب البته باید دید که چه خودروهایی از این پروتکل استفاده میکردهاند؛ قطعاً ماشینهایی با استانداردهای الکترونیکی بالا! نه خودروهایی مثل تولیدات داخلی!
در سال 1980 شرکت Bosch با هدف کاهش سیمکشیهای انبوه موجود در خودروها، دست به ابداع پروتکل محبوب CAN زد.
محبوبیت و مقبولیت پروتکل ابداعی تا جایی پیش رفت که علاوه بر استفاده موفق از آن در صنعت خودرو، در دیگر صنایع نیز مورداستفاده قرار گرفت. پروتکل CAN علاوه بر تأمین ایمنی در سطح شبکه، نیاز به سختافزار پیچیدهای برای برقراری ارتباط ندارد و از روش آشنای دو رشته سیم به هم تابیده و خطوط دیفرانسیلی استفاده میکند.
امنیت در پروتکل CAN تا اندازهای است که علاوه بر استفاده در خودرو، در هواپیماها نیز مورداستفاده قرار میگیرد و سنسورهای سیستم ناوبری هواپیما برای برقراری ارتباط با کامپیوتر مرکزی از این پروتکل استفاده میکنند.
چرا باید از CAN استفاده کنیم؟
دلایل زیادی وجود دارد که استفاده از پروتکل CAN رو توجیه میکند، ولی مهمترین دلایلی که در پروژههایی با سطح صنعتی، باید از CAN استفاده کنیم به شرح زیر هستند:
- اگر در شبکه CAN یکی از Node ها کرش یا هنگ کند، بهصورت اتوماتیک توسط لایهی فیزیکی از شبکه خارج میشود و شبکه به کار خود ادامه میدهد.
- عدم نیاز به عناصر خارجی زیاد و سادگی مدار راهانداز: تنها به یک واسط لایهی فیزیکی نیاز دارد که معمولاً یک آی سی 8 پایه است.
- پروتکل CAN با توجه به لایهی فیزیکی مورداستفاده (خطوط داده دیفرانسیلی) قادر است در محیطهایی با نویز زیاد مثل محیطهای صنعتی کار کنند.
- پروتکل CAN از لایهبندی مدل استاندارد OSI استفاده میکند.
- تأمین امنیت دادههای ارسالی با استفاده از CRC در لایهی سختافزاری
- اولویتبندی پیامهای ارسالی بهنحوی که دادههایی با اولویت بالاتر زودتر ارسال میشوند.
- شبکهی CAN یک شبکه Real Time است؛ یعنی ارسال و دریافت دادهها را در بازههای زمانی مشخص، گارانتی میکند.
و البته موارد دیگر که شمردن آنها در این مقاله ممکن نیست. برای روشن شدن اهمیت استفاده از پروتکل CAN، دو مورد از قابلیتهای ذاتی این پروتکل را بیشتر توضیح میدهیم:
مورد مهم اول، خارج شدن Node های مشکلدار از شبکه بهصورت خودکار است.، فرض کنید ماشینی که از مدل شبکه CAN استفاده میکند، در اتوبان با سرعت بالایی در حال حرکت است. ماشین دیگری از مسیر خود خارج شده و با آن تصادف میکند. بر اثر ضربهی وارده، سیستم قفل مرکزی آسیب میبیند. آسیب وارده باعث نمیشود که سیستم کیسهی هوا نیز با اختلال مواجه شود و کار نکند؛ با فرض اینکه هر دو سیستم از باس مشترک CAN استفاده میکنند.
مورد دوم، اولویتبندی پیام و Real Time بودن شبکه است. همان تصادف را فرض کنید؛ سیستم موتور قصد دارد پیامی را به سیستم سوخترسانی ارسال کند تا باعث قطع سوخترسانی و جلوگیری از آتشسوزی شود. از طرفی سنسور ضربه قصد دارد به سیستم کیسه هوا وقوع تصادف را گزارش دهد. Real Time بودن شبکه CAN کمک میکند که پیامهای موردنظر در زمانهای تعیینشده به مقصد برسند و از وقوع فاجعه جلوگیری کنند.
در ضمن پیام وقوع تصادف، مهمتر از دستور خاموش شدن موتور است. پروتکل CAN این قابلیت را دارد که پیام وقوع تصادف را زودتر منتشر کند تا سیستمهای مربوطه اقدامات لازم را انجام دهند.
همین مثال و قابلیتها را میتوان بهراحتی برای کنترل یک کارخانه یا خط تولید گسترش داد. وجود چنین قابلیتهایی باعث میشود که پروتکل CAN امروزه بخش جداییناپذیر صنعت باشد. شاید تنها مشکل این پروتکل حجم محدود اطلاعات باشد.
فریمهای ارسالی در پروتکل CAN به چه صورت هستند؟
برای اینکه شبکه CAN قادر باشد که بهصورت Real Time عمل کند و دادهها در زمان مناسبی ارسال شوند، محدودیتهایی جهت ارسال بستههای (فریمهای) دادهای وجود دارد؛ به این صورت که هر بسته دادهای نمیتواند بیشتر از 8 بایت اطلاعات را حمل کند.
قبل از اینکه به تشریح فریمهای دادهای بپردازیم, لازم به ذکر است که دو ورژن مختلف از استاندارد CAN امروزه رایج هستند:
- استاندارد CAN 2.0A
- استاندارد CAN 2.0B
تفاوت این دو استاندارد در تعداد بیتهای آدرسدهی (identifier) است؛ بهصورتی که در استاندارد CAN 2.0A تعداد بیتهای مجاز برای آدرس 11 بیت هستند و در استاندارد CAN 2.0B تعداد بیت مجاز به 29 بیت گسترش یافتهاند. خوشبختانه تغییرات این دو استاندارد به نحوی بوده که هر دو استاندارد قادرند به تبادل دیتا بر روی یک خط داده مشغول باشند، بدون اینکه اختلالی به وجود آید.
همانطور که در تصویر فوق مشاهده میکنید، هر بستهی دادهای دارای یک آدرس منحصربهفرد است که بسته به نوع استاندارد CAN مورداستفاده، میتواند 11 یا 29 بیت طول داشته باشد. تعداد دادههای موجود در هر فریم توسط DLC مشخص میشود که در بیشترین حالت میتواند 8 بایت داده باشد. بخش بعد CRC است که توسط سختافزار تولید و بررسی میشود. در صورت صحت آدرس و CRC، گیرنده با ارسال ACK فرستنده را از دریافت اطلاعات آگاه میکند.
چطور اولویت یک پیام مشخص میشود؟
اما چطور میشود که پیامها را اولویتبندی کرد؟ چطور میشود که اولویت یک پیام از دیگری بالاتر باشد؟ این اتفاق در لایهی فیزیکی رقم میخورد. به این صورت که فریمهای دادهای با آدرس (identifier) کوچکتر، دارای اولویت بالاتری برای ارسال هستند. بالاترین اولویت برای ارسال، مربوط به identifier با ارزش 0 است و پایینترین اولویت هم مربوط به identifier با 2047 در استاندارد Can 2.0A است.
برای روشن شدن مسئله، به عکس فوق دقت کنید. فرض کنید سه Node قصد دارند بهصورت همزمان داده ارسال کنند. لایهی فیزیکی اگر بیت موردنظر را بر روی خط مشاهده نکند، باس را آزاد میکند؛ به این شکل که مثلاً وقتی Node 2 قصد ارسال بیت 5 ام را دارد، مشاهده میکند که برخلاف مقدار بیت 5 ام که باید مقدار باس 1 باشد، صفر شده است و این بدان معناست که فرستندهای با اولویت بالاتر، در حال ارسال داده است. پس دسترسی را واگذار میکند. فرستنده Node 1 همین وضعیت را در ارسال بیت دوم مشاهده میکند و اینگونه میشود که Node 3 باس را در اختیار میگیرد و به ارسال داده میپردازد.
سیمکشی شبکهی CAN به چه صورت است؟
همانطور که قبلا توضیح دادیم، پروتکل CAN از باس دیفرانسیلی استفاده میکند؛ مثل باس RS-485. به همین دلیل نمیتوان و نباید از مدل ستارهای برای این شبکه استفاده کرد (معمولاً افراد به این مسئلهی مهم توجه نمیکنند و همین امر باعث میشود که عملکرد سیستم با اختلال همراه باشد.)، مگر در حالت خاص و با در نظر گرفتن شرایط و محاسبهی امپدانس موردنیاز به شکلی که امپدانس خط بر روی 60 اهم باشد.
در حالت خطی که در تصویر فوق مشاهده میکنید، باید یک مقاومت به ابتدا و یکی هم به انتها اضافه شود. مقدار توصیهشده برای این مقاومتها مقدار 120 اهم است.
همانطور که در تصویر بالا میبینید، باس دیفرانسیلی مورداستفاده در CAN طبق استاندارد ISO 11898-2، باید با رفرنس 2.5 ولت باشد. مقدار رفرنس در آی سی لایهی فیزیکی قابلتعیین است که بهصورت پیشفرض مقدار 2.5 برای آن در نظر گرفته شده است.
تعیین سرعت مورداستفاده یکی از پارامترهای مهم در شبکه CAN است. با توجه به طول باس، باید از سرعت مناسب استفاده کرد. در بیشترین حالت، طبق استاندارد میتوان تا 500 متر باس CAN طول داشته باشد و بیشترین سرعت قابل پشتیبانی در ISO 11898-2، یک مگابیت بر ثانیه است. اما محدودیتهایی وجود دارد که باید آنها را رعایت کرد؛ مثلاً نمیتوان انتظار داشت در خطوط دیتا با طول 200 متر بتوان دادهها را با سرعت 1 مگابیت بر ثانیه منتقل کرد.
برای سهولت ما چهار مقدار از تناسب طول خطوط داده و بیت ریت را آماده کردهایم که به شرح زیر هستند:
- سرعت 1 مگابیت بر ثانیه برای خطوط داده با حداکثر طول 40 متر
- سرعت 500 کیلوبیت بر ثانیه برای خطوط داده با حداکثر طول 100 متر
- سرعت 250 کیلوبیت بر ثانیه برای خطوط داده با حداکثر طول 200 متر
- سرعت 125 کیلوبیت بر ثانیه برای خطوط داده با حداکثر طول 500 متر
سختافزار لایهی فیزیکی
معمولاً به دلیل آسیبپذیری لایهی فیزیکی با توجه به نوع عملکرد آن، این قسمت را در چیپ میکروکنترلر قرار نمیدهند تا در صورت بروز حادثه در باس، که موجب سوختن این آی سی واسط میشود، به میکروکترلر یا کنترلر CAN صدمه وارد نشود.
آی سی های مختلفی توسط شرکتهای مختلف برای واسط شبکهی CAN ساخته شدهاند ولی در دسترسترین و مناسبترین آنها، آی سی MCP2551 ساخت شرکت میکروچیپ است.
در نگاه اول، افرادی که قصد راهاندازی باس CAN توسط میکروکنترلرهای ARM را دارند، به دلیل وجود تغذیهی 5 ولت این آی سی، از آن استفاده نمیکنند. معادل این آی سی با تغذیهی 3.3 ولت، هم کمیاب است و هم قیمتی تا 4 برابر این این آی سی دارد. درصورتیکه بهراحتی و بدون هیچ مدار اضافهای میتوان این آی سی را به میکروکنترلر ARM متصل کرد (درصورتیکه میکروکنترلر از 3.3 استفاده کند). فقط دقت داشته باشید که پایهی 8 را حتماً به زمین متصل کنید. اگر بتوانید یک خازن 100 نانو فاراد هم بر روی پایه 5 و زمین قرار دهید که بهتر خواهد بود. پایهی 5 در واقع همان ولتاژ رفرنس 2.5 ولت است که برای تشخیص سطح منطقی باس به کار میرود.
نرمافزار و راهاندازی اولیه با استفاده از IC MCP2515
معمولاً اکثر میکروکنترلرهای آرم بهصورت سختافزاری از CAN پشتیبانی میکنند. اگر هم قصد دارید از CAN استفاده کنید و سختافزار آن در میکروکنترلر موردنظر شما وجود ندارد، بهراحتی میتوانید از آی سی MCP2515 استفاده کنید. این آی سی یک مبدل SPI به CAN است. ما در این مقاله از میکروکنترلر STM32F103 استفاده میکنیم که واسط CAN را بهصورت سختافزاری درون خود میکروکنترلر دارد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | static void CAN_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; /* CAN GPIOs configuration **************************************************/ /* Enable GPIO clock */ RCC_AHBPeriphClockCmd(CAN_GPIO_CLK, ENABLE); /* Connect CAN pins to AF7 */ GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_RX_SOURCE, CAN_AF_PORT); GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_TX_SOURCE, CAN_AF_PORT); /* Configure CAN RX and TX pins */ GPIO_InitStructure.GPIO_Pin = CAN_RX_PIN | CAN_TX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(CAN_GPIO_PORT, &GPIO_InitStructure); /* NVIC configuration *******************************************************/ NVIC_InitStructure.NVIC_IRQChannel = CEC_CAN_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 0x0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* CAN configuration ********************************************************/ /* Enable CAN clock */ RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE); /* CAN register init */ CAN_DeInit(CANx); CAN_StructInit(&CAN_InitStructure); /* CAN cell init */ CAN_InitStructure.CAN_TTCM = DISABLE; CAN_InitStructure.CAN_ABOM = DISABLE; CAN_InitStructure.CAN_AWUM = DISABLE; CAN_InitStructure.CAN_NART = DISABLE; CAN_InitStructure.CAN_RFLM = DISABLE; CAN_InitStructure.CAN_TXFP = DISABLE; CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; /* CAN Baudrate = 1MBps (CAN clocked at 36 MHz) */ CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq; CAN_InitStructure.CAN_Prescaler = 2; CAN_Init(CANx, &CAN_InitStructure); /* CAN filter init */ CAN_FilterInitStructure.CAN_FilterNumber = 0; CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); /* Enable FIFO 0 message pending Interrupt */ CAN_ITConfig(CANx, CAN_IT_FMP0, ENABLE); } |
همانطور که مثال فوق مشاهده میکنید، میتوان تنظیمات اولیه مربوط به CANx (بسته به نوع نیاز میتواند CAN1 یا CAN2 باشد) را بهراحتی انجام داد. بعد از انجام تنظیمات اولیه، بهسادگی و با نوشتن خطوط زیر میتوان دادههای موردنظر را از بستر CAN منتقل کرد.
1 2 3 4 5 6 7 8 | CanTxMsg TxMessage = {0}; /* Transmit Structure preparation */ TxMessage.StdId = 0x321; TxMessage.RTR = CAN_RTR_DATA; TxMessage.IDE = CAN_ID_STD; TxMessage.DLC = 1; TxMessage.Data[0] = TestData; CAN_Transmit(CANx, &TxMessage); |
همانطور که مشاهده میکنید، ما یک فریم داده که شامل 1 بایت داده است را با مشخصهی 0x321 و با فرمت استاندارد (11 بیت) در شبکه CAN منتشر میکنیم. اگر گیرنده وجود نداشته باشد یا مستر ACK را دریافت نکند، بهصورت سختافزاری ارسال تا تعداد دفعات مشخصی تکرار میشود.
در آینده
تا اینجا با کلیت پروتکل CAN آشنا شدیم و چند خط از نحوهی کانفیگ نرمافزاری آن را برای میکروکنترلرهای STM32F103 قرار دادیم. برای یافتن مثالهای بیشتر میتوانید به مثالهای منتشرشده از سوی شرکت ST مراجعه کنید. اما چیزی که متأسفانه بهدرستی به آن پرداخته نشده، نحوهی کانفیگ نرخ ارسال داده است.
1 2 3 4 5 | /* CAN Baudrate = 1MBps (CAN clocked at 36 MHz) */ CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq; CAN_InitStructure.CAN_Prescaler = 2; |
در این مثال و دیگر مثالها و برنامهها، نرخ ارسال اطلاعات بهصورت ثابت در برنامه قرار گرفته است و در مورد چگونگی محاسبهی آن هیچ توضیحی ارائه نشده است. در مقالهی آینده به توضیح این مهم خواهیم پرداخت و خواهیم گفت که چطور میشود با استفاده از پارامترهای موردنظر، مقادیر مناسبی برای ایجاد نرخ ارسال اطلاعات انتخاب کنید.
سلام، ی سوال دارم
بعضی میکروهای arm میتونن ارتیاط اترنت برقرار کنن، بعضی هم از arm ها میتونن ارتباط can داشته باشن، شما میدونین ارتباط can با اترنت rj45 چیه؟ من فکر میکنم پروتکل can از طریق اترنت منتقل میشه، درسته؟ ممنون میشم تفاوت can و اترنت رو توضیح بدید
سلام دوست عزیز
این دو پروتکل به لحاظ لایه های نرم افزاری و سخت افزاری کاملا متفاوت هستن برخی میکروها هم هستن که هر دو پروتکل رو پشتیبانی میکنند
این دو پروتگل کاملا متفاوت هستند درسته که ممکنه جاهایی مشترکاتی داشته باشند ولی خوب تفاوت ها خیلی زیاده
باسلام.
لنت ترمز زانتیا C5 را عوض کردم. الان رون نمیشه و پیغام خطای CAN میده.
ممنون میشم راهنمایی بفرمایید.
سلام وقت بخیر. ممنون از مطالب مفیدتون. یه سوال داشتم.چطور میشه سرعت ارسال و دریافت اطلاعات رو تغییر داد؟مثلا یک id هر 1 ثانیه ارسال بشه و یکی دیگه هر 5 ثانیه.ممنون میشم
اگر فرستنده رو شما طراحی کرده باشید میشه چنین کاری کرد
در غیر این صورت ممکن نیست
باسلام.
اگر پروژه شما را بخوام داشته باشم البته بر روی میکروکنترلر LPC هر کدوم فرق نداره ولی ترجیحا LPC1765
چطور میتونم اقدام کنم. لطفا اعلام هزینه کنید. بنده سورس برنامه را لازم دارم و توضیحاتی راجب به اون.
اگر زحمت انجامش را با آی دی ای کیل بکشید که عالی میشه. جوری که باد ریت هم قابل کنترل باشه.
لطفا هزینه انجام این پروژه را بفرمایید و اینکه بعدها میتونه به کار خودتون هم زیاد بیاد.
از زحمات شما متشکرم.
سلام دوست عزیز
متاسفانه ما پروژه انجام نمیدیم ولی خب میتونه این اطلاعات پیش زمینه شما جهت انجام این پروژه باشه
سلام دلاور. چندوقته در مورد كن ميخونم اين آموزش يكي از بهترينها بود. قسمت دوم رو كه گفتيد تو سايت پيدا نكردم! شروع نكردي شيطون؟!
آقا من يه رادار رسيده دستم كه با پروتكل كن كار ميكنه. ميخوام با ميكرو كنترلر و ماژول MCP2515 پكتههاشو بخونم. واقعا ممنون ميشم اگر كمكم كني
ممنون و خداقوت
سلام دوست عزیز
یه مطلب داریم با نام FMS که ما داخلش سعی کردیم یه پروژه اسنیفر پکت CAN بسازیم میتونید از اونجا دانلود کنید
https://sisoog.com/2017/06/12/%d9%be%d8%b1%d9%88%da%98%d9%87-fms-reader-%d8%a8%d9%87-%d9%87%d9%85%d8%b1%d8%a7%d9%87-%d8%b4%d9%85%d8%a7%d8%aa%db%8c%da%a9-%d8%8c-pcb-%d9%88-%d9%81%d8%a7%db%8c%d9%84-%d8%a8%d8%b1%d9%86%d8%a7%d9%85/
سلام جناب زیوس، ممنو از مطلب جالبتون فقط بنده یه سوال دارم.
در شبکه CAN باید تمام نود ها MCU داشته باشین؟
مثلا ما 20 تا سنسور دما داریم می تونیم فقط با یک میکروکنترلر از طریق CAN اطلاعات رو انتقال بدیم؟!
سلام و درود بر شما
ممکنه سنسور دمایی مبتنی بر can وجود داشته باشه ، که اگر داشته باشه خیلی راحته کار
اما اگر نداشته باشه، دو تا راهکار خواهید داشت، یکی این که دیتای همه سنسور ها رو یه میکروکنترلر با یه پروتکل جمع کنه و بعد از طریق can منتقل کنه
و راه دوم هم میتونید برای هر سنسور یک میکروکنترلر مبتنی بر can بذارید
چرا پایهی 8 از mcp2551 رو باید مستقیما به زمین متصل کنیم؟ در اکثر مدارهایی که دیدم این پایه با یک مقاومت به زمین متصل شده. یک سوال دیگه، این طور که من دیدم میکروهای stm32 تا ولتاژ 5 رو هم در i/o میتونند تحمل کنن، به همین دلیله که شما گفتید استفاده از این ic با این میکروکنترلر مشکلی نداره؟
بله درسته دوست عزیز
در واقع با زمین کردم slop رو غیرفعالش کردن شما میتونی با توجه به باوود ریت مورد نیاز مقدار دلخواه رو بذاری و من معمولا دیدم که مقدارش رو ۴٫۷ کیلو میذارن
در مورد سطح ولتاژ هم بله درست حدس زدید
سلام، مطالبتون بسیار خوب و کامل بود. فقط ای کاش ادامه پیدا میکرد.
سلام اینجا ما یک پروژه هم باهاش انجام دادیم
https://sisoog.com/2019/12/16/vscode-%d8%a8%d8%b1%d8%a7%db%8c-avr/
ممنون از اینکه دانشتون رو در اختیار بقیه میذارید
خواهش میکنم دوست عزیز
مطلبتون خیلی عالی و کامل بود
خسته نباشید
متشکریم
سلام اقای مهندس زـــوس خیلی ممنون بابت توضیحات ارزشمندتون.بعد از رسیدن به انتهای مطلب خیلی ناراحت شدم که بعد از3سال هنوز این مطلب رو ادامه ندادید.لطفا اگه فرصت دارید ما رو اموزش های خودتون محروم نکنید!
سلام و درود بر شما دوست عزیز
اولین نفری هستد که بعد از سه سال از منشر شدن این مطلب، براش قسمت بعدی مهم بوده!
متشکرم که یاد آوری کردید توی لیست کارها میذارم
سلام روز بخیر
آیا میشه پایه ی 5 (Vref) آی سی can به جایی اتصال نداشته باشه؟
بله کاملا منطقیه و میتونید به جایی اتصال ندید
ما توی تولیداتمون به همین شکل عمل کنیم
با سلام
وقتی can h و can l هر دو 2/5 هستند و پایه rx,tx هر دو پنج ولت هستند که میدونم اشتباس نباید صفر و پنجباشن به نظرتون اشکال از کجاست بقیه پایه های ای سی درست هستند ای سی هم سالمه
ممنون
سلام
خوب از اونجایی که این پروتکل جریان بیس هست – اندازه گیری ولتاژ زیاد منطقی نیست
از چند تا چیز مطمئن بشید – اول این که مقاومت 120 باشه روی اول و آخر خط
دوم این که پایه vref آیسی مبدل ولتاژٰش با ولتاژ دیتاشیت منطبق باشه و خارج از اون نباشه
اگر این دو مورد اوکی باشن – احتمالا بقیه بحث ها نرم افزاری میشه
سلام
وقت بخیر
برای میکروکنترلرهایی که can1 و can2 دارند(مثل stm32f429)، در تنظیمات فیلتر چه نکاتی رو باید در نظر گرفت؟ آیا در صورت استفاده از can2 می توان تنظیمات فیلترها رو به صورت مجزا از can1 انجام داد یا باید بخشی از تنظیمات در can1 انجام شود؟
من برای استفاده از can bus در میکروکنترلرهایی که فقط یک can داره مشکلی ندارم ولی نتونستم can2 میکرو stm32f429 رو راه اندازی کنم.
لطفا راهنمایی بفرمایید.
تشکر
سلام دوست عزیز
تا حالا نیاز نشده که فیلتر رو برای هر دو can فعال کنم ولی فکر نمیکنم مشکل خاصی در این زمینه موجود باشه
شما دقیقا با راه اندازی can دوم مشکل دارید یا این که فعال کردن فیلتر ؟
سلام. مشکل بنده حل شد. متشکرم
بسیار عالی 🙂
اگر امکانش هست لطفا در این مورد راهنمایی کنید.
چجوری تونستید مشکل رو برطرف کنید
منم دقیقا تو همین مورد به مشکل خوردم.
سلام
مشکل من در سخت افزار can bus و تغذیه آی سی ISO1050 بود. با رفع مشکل سخت افزاری ارتباط به راحتی برقرار شد.
با سلام.چگونه میشه کن باس یک برد خودرو رو شبیه سازی کرد تا همون قطعه روی میز کار شبیه به هنگامی که روی خودرو وصل هست کار کنه…مرسی
خوب برای این کار لازمه که پکت های لازم رو خودتون توی میکروکنترلر بسازید و ارسال کنید.
مدل های تجاری هست که این کار رو انجام میدن – من نمونه های رایگانی هم دیدم ولی خودم تست نکردم که ببینم کار هم میکنند یا خیر
سلام ممنون از مطالبتون
بقيه مطلب رو ادامه نمي ديد؟
ای کاش روز ها ۴۸ ساعت بود تا وقت بیشتری برای پرداختن به خیلی مباحثی که دوست داریم به آنها بپردازیم داشتیم.
درود بر شما دوست گرامی.بابت تمام تلاش و کوشش فراوان برای توسعه علم الکترونیک در ایران فراموش شده سپاسگذاری میکنم. ابراهام لینکن میگه:وقتی نیکی میکنم احساس شادمانی دارم ،هنگامی که بدی میکنم حس شرمساری ،و این تمام دین من است.
متشکرم از شما برای کامنت انگیزه بخشتون :))
با سلام و خسته نباشید . و تشکر از مطالب بسیار مفید واموزنده شما .
سوالی داشتم : اگر بخواهیم چند دیوایس یا ماژول را که از یک پروتکل خاصی استفاده می کنند . مثلا سریال یا I2C را به یک میکرو که یک درگاه سریال یا یک درگاه I2C دارد وصل کنیم چطوری امکان پذیر هست که مشکل تداخل نداشته باشیم و همه دیوایس ها به درستی کار کنند .
باتشکر .
سلام دوست نازنین. مثلا در پروتکل i2c پس از Start bit آدرس یکی از دیوایسها در یک فریم 7 یا 10 بیتی از سمت مستر روی خط دیتا قرار خواهد گرفت، حال اسلیوی که دارای این آدرس هست به مستر پاسخ میدهد و بقیه اسلیوها دیگر با این اسلیو هیچ تداخلی نخواهد داشت و انتقال دیتا به درستی صورت میپذیرد.
در صورتی که از پپپپپARM استفاده می کنید یا از پردازنده های espressif استفاده میکنید پیشنهاد من SN65HVD230 هست که به راهتی ماژولش گیر میاد و از مدل معرفی شده در مطلب میتونه مفید تر باشه
حتی تو گیت هاب دیدم ازش به عنوان واسط بین obd-ii و esp32 استفاده کرده بود
https://github.com/limiter121/esp32-obd2-emulator
همم خوب در واقع باید بگم فرقی نداره 🙂 ؛ دلیل این که MCP رو معرفی کردیم فراوانی اون توی بازار بوده و هست و متاسفانه آیسی SN65HVD230 یا گیر نمیآد یا این که خیلی گرونه !
حالا به لحاظ فنی تفاوت چندانی با سری MCP نداره و شما با خیال راحت میتونید ازش استفاده کنید. البته باید بگیم که MCP2551 به 5 ولت برای کار کردن نیاز داره البته این هیچ مشکلی برای میکروی 3.3 ولتی ایجاد نمیکنه ؛ تا حالا باالای 3000 تا دستگاه با این آیسی بستیم و مشکلی نداشته ! تنها جایی که ممکنه شما رو دچار چالش کنه وقتیه که دستگاه شما بخواد با ولتاژ باتری کار کنه دیگه نمیشه از این آیسی استفاده کرد و باید حتما از SN65HVD230 استفاده کنید ؛ چون ولتاژ باتری های پلیمتری و لیتیومی 4 ولت هست نهایتا.
+ پروژه خوبی رو معرفی کردید 🙂
سلام خسته نباشید
خیلی خوب و کاربردی بود
خدا خیرتون بده.
متشکرم دوست عزیز 🙂
سلام
اگر به جای میکروی STM از یه AVR معمولی استفاده کنیم و با واحد ارتباط یوزارتش به این ای سی های MCP2551 دیتا بدیم و بگیریم مثلا با بادریت 9600 ایا شدنیه؟؟
من یه جایی حوندم که شدنیه وحتی بهتر از MAX485 هست و دو طرفه هم هست.ای سی مکس نمونه تقلبیش زیاده و من میخوام برای ارتباط فواصل دور از این ای سی استفاده کنم.نظر شما چیه؟
در واقع پروتکل CAN یه پروتکل پیچیده است که مثل شبکه نیاز به لایه سخت افزاری داره ؛ پروتکل CAN خیلی متفاوت تر از پروتکل Serial هست و سخت افزار سریال قابل استفاده نیست
اگر میخواید از CAN روی پردازنده AVR استفاده کنید بهتره به سراغ خانواده ای هایی برید که این لایه سخت افزاری رو داشته باشند مثل سری AT90CAN128 یا از آیسی واسط mcp2517fd استفاده کنید.
در مورد کاربردی که شما مد نظرتون هست ، حقیقت اینه که دلیلی برای رد یا تاییدش ندارم و تا تست نکنید نمیشه قطعی گفت ؛ اگر تست کردید جوابش رو هم با ما در اشتراک بگذارید.
متاسفانه این ای سی واسط تو ایران نایابه
برای ارتباط در فواصل دور به صورت شبکه دچار مشکل شدم چون از طرفی هم ای سی های موجود تقلبی هستن هم دیود tvs sm712 گیر نمیاد که بزارم رو لاین a , b ای سی مثلا max485 و… که ای سی زود نسوزه.شما tvs مشابه برای اینکار سراغ دارین؟
باشه خبرش رو میدم به شما ای سی کن رو سفارش دادم بیاد.
ببینید حتما نیازی نیست TVS باشه ؛ میتونید از دیود زنر یا حتی دیود عادی به عنوان برش دهنده ولتاژ استفاده کنید
بله متاسفانه قطعات نامرغوب به شدت زیاد شده
از مدار پیشنهادی خودش توی دیتاشیت استفاده کنید ، تا حدود زیادی مشکلات رو حل میکنه
مطالب سایتتون مواقعا آموزنده است.
متشکر از شما
سلام
من با دو تا میکرو stm32f103c8t6 و ماژول مبدل tja1050، که لینک هر دو در ادامه هست، میخوام ارسال و دریافت اطلاعات داشته باشم اما به مشکل خوردم.
https://shop.aftabrayaneh.com/Tja1050_CAN_BUS_TTL__AFTAB.html?search=tja
https://shop.aftabrayaneh.com/Stm32f103c8t6_ARM_Board__AFTAB.html?search=stm32f103c8
نحوه اتصال خیلی ساده هست…tx و rx ماژول های tja به tx و rx میکروها و can h و can L ماژول ها به هم دیگه… ماژول ها رو هم با 5 ولت تغذیه کردم
برنامه رو با cube و کتابخونه HAL نوشتم که به شکل زیر هست.
برنامه ی ارسال کننده به این شکل هست.
uint32_t TX_ID = 0x4840040;
hcan.pTxMsg->Data[0] = ‘a’;
hcan.pTxMsg->Data[1] = ‘b’;
hcan.pTxMsg->Data[2] = ‘c’;
hcan.pTxMsg->IDE = CAN_ID_EXT;
hcan.pTxMsg->ExtId = TX_ID;
hcan.pTxMsg->DLC = 3;
HAL_CAN_Transmit(&hcan, 1000);
if(HAL_CAN_Transmit(&hcan, 1000) == HAL_OK)
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
و برنامه دریافت کننده به این شکل:
CAN_FilterConfTypeDef a;
a.FilterActivation = DISABLE;
HAL_CAN_ConfigFilter(&hcan, &a);
if(HAL_CAN_Receive(&hcan,CAN_FIFO0, 1000) == HAL_OK)
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
با این برنامه ها در اصل باید با هر دریافت و ارسال یک بار led رویبرد تغییر وضعیت بده. اما همیچن اتفاقی نمیوفته. در ضمن مطمئن هستم که خروجی توابع ارسال و دریافت HAL_TIMEOUT هست نه چیز دیگه ای(چون تست کردم). الان چطوری میتونم این مشکل رو حل کنم؟ مشکل از برنامه هست یا سخت افزار؟
سلام دوست عزیز،
اول باید از صحت آیسی های مبدل اطمینان پیدا کنید ، برای این کار ولتاژ روی پایه 5 رو اندازه گیری کنید ، باید حدود 2.5 ولت باشه ، برای هر دو آیسی این کار رو انجام بدید ، اگر اینطور بود که یعنی مشکلی نداره !
بعد از اون سراغ اتصالات برید ، اتصال باید به صورت یک به یک باشه ، یعنی RX آیسی مبدل به RX میکرو وصل میشه و TX آیسی مبدل به TX میکروکنترلر وصل میشه
نکته خیلی مهم که باید بهش توجه داشته باشید به دلیل استفاده از RAM مشترک برای CAN , USB در آیسی های STM32F103 دقت داشته باشید که پریفال USB حتما خاموش شده باشه و روشن نباشه ، خوب نکته مهم بعدی اینه که چون برد بلوپیل قسمت USB رو وصل کرده یعنی مقاومت گذاشته رو خط ها ، سعی کنید از پایه های دیفالت CAN که مشترک با USB هم هست استفاده نکنید. (یعنی پایه های PA11 و PA12) و به جای اون از پایه های ری مپ شده استفاده کنید که آزاد باشند یعنی پایه های PB8 و PB9.
نکته دیگه ای که باید بهش توجه داشته باشید ، اینه که وقتی فقط یک دستگاه رو باس کن وجود داره ، ارسال به صورت سخت افزاری انجام نمیشه و خطا میده ، پس باید هر دو دستگاه روشن باشن ، برای سهولت کار ، و اطمینان از برنامه ، راهی وجود داره
و اون این که CAN رو در حالت LoopBack تنظیم کنید (از توی نرم افزار Cubemx امکانش هست گزینه Operating Mode رو ببینید) در این حالت هرچی ارسال کنید به صورت داخلی دایرکت میشه و خودتون دریافتش میکنید و کاری به رابط سخت افزاری نداره اینطوری میتونید از صحت برنامه مطمئن بشید.
اگر سوالی بود در خدمت هستیم
ممنون
با این توضیحات و استفاده از مد loopback تونستم حداقل ارسال رو درست کنم. با این شرایط مونده دریافت. فکر میکنم مشکل من بیشتر روی فیلتر هست…حالا باز هم نتیجه گرفتم سعی میکنم اینجا توضیح بدم روش حل مشکل رو.
بسیار عالی ، با استفاده از همون loopback میتونید فرایند دریافت رو هم اوکی کنید .
منتظر توضیحاتتون هستیم 🙂
سلام وقت بخیر
امکانش هست برنامتون را کامل قرار بدید تا بفیه هم بتونند استفاده کنند.
من هم میخواستم تست کنم
مشکل ارسال و دریافت حل شد؟
تشکر
سلام دوست عزیز
والا قرار بود در آموزش بعدی این کار رو انجام بدیم ؛ و البته مقداری دیگر پارامتر ها رو توضیح بدیم که متاسفانه هنوز فرصت نشده بنویسم پستش رو
انشالله سعی میکنم در اولین فرصت پست مروبطه رو بنویسم.
سلام
بله مشکل من حل شده
این روزا یه مقدار درگیر بودم متاسفانه. چشم در اولین فرصت سعی میکنم منتشر کنم.
درباره دریافت اطلاعات توضیحی ندادید. چطوری میشه اطلاعات مربوط به آی دی های مختلف رو دریافت کرد؟؟ یا این که تفاوت مستر و اسلیو در شبکه کن چی هست؟
سعی میکنیم در مقاله ای دیگر به جزییات بیشتر پیردازیم
تا اونجا که اطلاع دارم ، مستر و اسلیو توی شبکه Can وجود نداره ، هر دستگاهی میتونه هم زمان هم مستر و هم اسلیو باشه
آخه فعال کردنش توی کیوب حالت مستر و اسلیو داره…
امیدوارم زودتر حاظر بشه و استفاده کنیم از آموزشتون
من الان توی نرم افزار کیوب چک کردم هم برای برای میکروی سری 103 و هم سری 407 ، حالت Slave برای can نداره !
کیوب من ورژنش 4.15.1 است.
انشالله
بسیار عالی بود.
متشکرم دوست عزیز
مطالبتون به زیبایی نوشته شده. تبریک میگم
خواهش میکنم دوست عزیز
سلامم خیلی خیلی عالی بود واقعا ممنون . اگر بخش دومش رو هم قرار بدین خیلی خوب میشه .
خواهش میکنم دوست عزیز
در دست بررسی است.
سلام
اگر در مورد پروتکل dmx512 و ارسال و دریافت دیتا با stm32 مثال بگذارید خیلی ممنون میشم.
بررسی میکنیم دوست گرامی
باسلام وتشکر. آموزشتون عالی بود ممنونم.اگه ممکنه درمورد ارتباط یو اس بی کامپیوتر با شبکه کن هم توضیح بدین
سلام دوست عزیز
در برنامه کاری هست ، انشالله به این موارد نیز خواهیم پرداخت.
سلام
تشکر و خسته نباشید.
خواهش میکنم دوست عزیز.
سایتتون عالیه..دو ساعته دارم فقط مطالبش رو میخونم…خسته نباشین
خیلی ممنون دوست عزیز. خوشحالیم مطالب براتون مفید بوده.
سلام میشه لطفا پروژه های بیشتری با stm32cube و برنامه نویسی ان با keil5 بزارید
واقعیتش من تازه دارم کارمیکنم بااین نرم افزار و میخوام یه سون سکمنت با hal اجرا کنم ولی متاسفانه جواب نگرفتم میخواستم ببینم میتونین راهنماییم کنین
باتشکر از سایتتون
سلام دوست عزیز
خواهش میکنم ، انشالله توی دستور کار هست که این کارو انجام بدیدم !
برای راهنمایی می تونید از طریق ایمیل یا تلگرام سیسوگ در ارتباط باشید.
سلام
ممنون از آموزشتون .فوق العاده بود .
لطفا ادامه بدید.
خواهش میکنم دوست عزیز
با سلام .ممنون از مطلب مفیدتون .
لطفا در مورد طریقه راه اندازی پروتکل اترنت و ویژگی ها نیز مطلب بگذارید
سلام و درود خدمت شما دوست عزیز ، خوشحالیم که مطالب سایت مورد توجه دوستان قرار گرفته است
در مورد شبکه ، انشالله مطالب آموزیشی منتشر خواهیم کرد.