CANopen´ÓվЭÒéÔÚstm32·ÖÎöºÍ˵Ã÷

ÄÚÈÝ·¢²¼¸üÐÂʱ¼ä : 2025/11/7 20:51:15ÐÇÆÚÒ» ÏÂÃæÊÇÎÄÕµÄÈ«²¿ÄÚÈÝÇëÈÏÕæÔĶÁ¡£

if (sizeData != *pSize) { MSG_WAR1(0x2052, \of data different than (size in mapping / 8) : \sizeData);

} memcpy(&process_var.data[offset], pMappedAppObject, sizeData);//·â×°pdo±¨ÎÄ

ͼ6 ´ÓÕ¾·¢ËÍ´íÎóʼþ

ͼ6ÊÇÒ»¸ö´ÓÕ¾·¢ËÍ´íÎóʼþµÄ±¨ÎÄ£¬µ±´ÓÕ¾ÄÚ²¿³ÌÐò³öÏÖÒ쳣ʱ£¨Æ©ÈçÈ¡²»µ½Ë÷ÒýÊý¾ÝµÈ£©£¬´ÓÕ¾»á½øÐб¨´í£¬ÕâÀï´íÎóÂëºÍÄÚÈÝ¿ÉÒÔ×Ô¼ºÅäÖá£01 83ÊÇÓÉÖ÷Õ¾ÉèÖõķ¢ËÍ´íÎóʼþ±êʶID£¬55 1F 00 00´ú±í´íÎóÂ룬CD AB 00 00´ú±í´íÎóµÄÊý¾Ý¡£

·¢ËÍ´íÎóʼþÉæ¼°µÄº¯Êý´úÂëΪ£º MSG_ERR(num, str, val) £¬´Ëº¯Êý¹¦ÄÜÊǽ«´íÎóÂëºÍ´íÎóÊýÖµ´æÈëÓÉÖ÷Õ¾ÉèÖõÄÌØ¶¨Ë÷Òý²¢·â×°³ÉPDO±¨ÎÄ·¢ËÍ£¨·â×°ÓÉsendPDOeventº¯ÊýÍê³É£©£¬´úÂëÆ¬¶ÎΪ:

MSG_ERR(0x1F55, \¿É·¢ËÍͼ6µÄ´íÎó±¨ÎÄ

MSG_ERR(num, str, val)//º¯ÊýÔ­ÐÍ { if(nodeState == Operational ){

canopenErrNB=num; canopenErrVAL=val;

sendPDOevent(0,&canopenEr

rNB); //·¢ËÍpdo±¨ÎÄ } }

ͼ7 ´ÓÕ¾Òì²½´«ÊäÊý¾Ý

ͼ7ÊÇÒ»¸öÒì²½´«ÊäÊý¾Ý±¨ÎÄ£¬µ±ÄÚ²¿´ïµ½Ò»¶¨Ìõ¼þÊÇ£¬»á×Ô¶¯·¢ËÍPDO±¨ÎÄ£¬±ÊÕß½«Ìõ¼þÉ趨ΪÈç¹ûʱ¼äÔÚÿСʱ56·ÖʱÔò·¢ËÍPDO±¨ÎÄ£¬01 82ÊÇÖ÷Õ¾ÉèÖøø´ÓÕ¾·¢ËÍÒì²½Êý¾ÝµÄ±êʶID£¬Êý¾ÝΪµ±Ç°Ê±¼ä´Á£¬£¨0x86ת»»³ÉÊ®½øÖÆÊÇ56¡££©

Òì²½´«ÊäÊý¾ÝËùÉæ¼°º¯ÊýÒ²ÊÇsendPDOeventº¯Êý£¬´Ëº¯Êý¹¦ÄÜÊǽ«Êý¾Ý if(minutes==56) {

sendPDOevent( 0, &minutes ); }

7 CANOPEN´ÓվЭÒéÔÚSTM32F103ZET6µ¥Æ¬»úÉϵÄʵÏÖ

7£®1 Ó²¼þÉèÖÃ

Ê×ÏÈÐèÒª¶Ô¹Ü½Å½øÐÐÉèÖã¬ÓÉÔ­Àíͼ£¨¼ûͼ8£©¿ÉÒÔ¿´³öCANÊý¾Ý´«Êä¶ËCANTX½ÓPB9¹Ü½Å£¬CANÊý¾Ý½ÓÊÕ¶ËCANRX½ÓPB8¹Ü½Å¡£ÐèÒª±àдgpio_config()º¯Êý½øÐÐÅäÖ㬴úÂëÆ¬¶Î£º

/* Configure CAN pin: RX */

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//ÊäÈëģʽ

GPIO_Init(GPIOB, &GPIO_InitStructure); /* Configure CAN pin: TX */

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//Êä³öģʽ

GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_PinRemapConfig(GPIO_Remap1_CAN1 , ENABLE);//ÖØÓ³Éä

ͼ8 STM32F103ZET6 CANÔ­Àíͼ

Ó²¼þ·½ÃæÉèÖÃÍê±Ïºó£¬¶Ô³ÌÐò½øÐÐÉè¼Æ£¬³ÌÐòÖ÷Òª·ÖΪÁ½´ó²¿·Ö¡£ 7£®2Ö÷³ÌÐò½éÉܼ°Éè¼Æ

µÚÒ»²¿·ÖΪmainº¯Êý²¿·Ö£º³ÌÐòÔËÐÐʱ£¬½øÐгõʼ»¯²Ù×÷£¨ÉèÖýڵãID¡¢ÖжϷþÎñ¡¢¹Ü½Å¡¢·¢ËÍÓÊÏä¡¢½ÓÊÕÓÊÏäºÍ²¨ÌØÂʵȣ©£¬Íê³Éºó½øÈë¶Ô½Úµã¶Ô״̬½øÐмì²âºÍ´¦ÀíµÄÎÞÏÞÑ­»·³ÌÐò£º´ÓÕ¾Æô¶¯ÔËÐкó»áÓÐËĸö״̬£¬·Ö±ðÊdzõʼ»¯¡¢Ô¤ÔËÐС¢ÔËÐС¢Í£Ö¹¡£´úÂëÖзֱðÓÃinitialization¡¢pre_operational¡¢operational¡¢stopped

ËÄ

ÖÖ

×´

̬

À´

±í

ʾ

£¬

ËÄ

¸ö

×´

̬

¹¦

ÄÜ

º¯

Êý

·Ö

±ð

ÊÇ

initialization(),preoperational(),operational(),stopped()£¬ÕâЩ¹¦Äܺ¯ÊýµÄÖ÷Òª×÷ÓÃÊÇ·¢Ë͵±Ç°×´Ì¬µÄÐÄÌø±¨ÎÄ¡£ÓÃswitchÓï¾äʵÏÖ²»Í¬×´Ì¬Ö®¼äµÄÇл»¼°º¯Êý´¦Àí¡£

ÒÔÏÂÊÇÖ÷³ÌÐòÁ÷³Ìͼ£º

ͼ9 Ö÷³ÌÐòÁ÷³Ìͼ

´úÂë¿ò¼Ü´óÖÂΪ£º While(1) {

switch(nodestatus){ case initialization:

initialization(); break;

case pre_operational:

pre_operat ional(); break;

case operational:

operational(); break; case stopped:

stopped(); break; } }

7£®3 ÖжϷþÎñ³ÌÐò½éÉܼ°Éè¼Æ µÚ¶þ²¿·ÖΪÖжϷþÎñ³ÌÐò£º´Ó½ÚµãÉϵçÆô¶¯ºó£¬ÖжϵȴýÀ´×ÔÖ÷½ÚµãµÄ¹ÜÀí±¨ÎÄ£¬µ±±¨Îĵ½À´µÄʱºò£¬»ùÓÚÖжϵĽÓÊÕ±¨ÎÄ»úÖÆ²úÉúÖжϣ¬ÖжÏÓÉstm32µÄÓ²¼þ½øÈëvoid usb_lp_can_rx0_irqhandler(void)´¦Àí½ÓÊÕ±¨ÎÄ¡£can½ÓÊÕÖжϴ¥·¢ÁËCAN±¨ÎĽÓÊÕº¯Êýcanreceive(&m)¡£È»ºóͨ¹ý²»Í¬¹¦ÄÜÂëÀ´ÊµÏÖ±¨ÎĵĽâÎöºÍ´¦Àí¡£¹¦Äܺ¯Êý°üÀ¨£ºproceednmtstatechange()º¯Êý£¬´¦ÀíÖ÷Õ¾NMT±¨ÎÄ£¬¸Ä±ä´Ó½Úµã״̬£»proceedsync()º¯Êý£¬ÓÃÓÚ½ÓÊÕͬ²½±¨ÎÄ£»proceedpdo()º¯Êý£¬´¦Àí pdo±¨ÎÄ£»proceedsdo()º¯Êý£¬´¦Àísdo±¨ÎÄ¡£Í¨¹ý¹¦Äܺ¯ÊýµÄ½âÎöºóÀ´Ö´ÐÐÏàÓ¦µÄ´¦Àí¡£´Ó¶øÀ´ÊµÏÖ¶Ô½ÚµãµÄ¿ØÖÆ¡£

ÒÔÏÂÊÇÖжϷþÎñ³ÌÐòÁ÷³Ìͼ£º

ͼ10 ÖжϷþÎñ³ÌÐòÁ÷³Ìͼ

ÁªÏµ¿Í·þ£º779662525#qq.com(#Ìæ»»Îª@) ËÕICP±¸20003344ºÅ-4 ceshi