找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2202|回复: 0
打印 上一主题 下一主题
收起左侧

stm32可旋转自行车停车源程序(CAN通讯、红外线)

[复制链接]
跳转到指定楼层
楼主
基于stm32-CAN控制伺服电机程序

单片机源程序如下:
  1. #include "main.h"
  2. int Show1[2]={1,1};
  3. int *ShowLed=Show1;
  4. int main(void)
  5. {     
  6.           u8 key;
  7.           LED_GPIO_Config();
  8.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  9.     TIM3_Int_Init();
  10.     CAN1_Configuration();                               //CAN1初始化
  11.     Remote_Init();                                                            //红外接收初始化
  12.     delay_ms(500);                                      //刚开始要有足够的延时,确保驱动器已经初始化完成
  13.     CAN_RoboModule_DRV_Reset(0,0);                      //对0组所有驱动器进行复位
  14.    
  15.     delay_ms(500);                                      //发送复位指令后的延时必须要有,等待驱动器再次初始化完成
  16.     CAN_RoboModule_DRV_Config(0,1,100,0);   
  17.     delay_ms(500);                                   //1号驱动器配置为100ms传回一次数据
  18.     CAN_RoboModule_DRV_Config(0,2,100,0);
  19.     delay_ms(500);
  20.     CAN_RoboModule_DRV_Mode_Choice(0,0,Position_Mode);  //0组的所有驱动器 都进入位置模式。
  21.     delay_ms(500);                                      //发送模式选择指令后,要等待驱动器进入模式就绪。所以延时也不可以去掉。
  22.     while(1)
  23.     {                                
  24.                          key=Remote_Scan();
  25.              if(key==16)//左,存车
  26.                          {
  27.                                  int *b;
  28.                                  b=FindPath();  //186562
  29.          ShowLed=b;                                 
  30.          gofloor(b);
  31.                                          while(1)
  32.                                  {
  33.                                          int ban=0;
  34.                                          ban=Remote_Scan();
  35. //           delay_ms(100);                 
  36.                  if(ban==90)   //右
  37.                                          {
  38.                                                  rest(b);
  39.                                                  break;
  40.                                          }
  41.                                  }
  42.                                  pop(b);
  43.                          }
  44.                          if(key==18)
  45.                          {
  46.                                  int *c;
  47. //                                 CAN_RoboModule_DRV_Position_Mode(0,1,2000,80000);
  48.          c=getkey();
  49. //                                 delay_ms(200);
  50.                                  ShowLed=c;
  51.                                  gofloor(c);
  52.                                  push(c);
  53.                                  while(1)
  54.                                  {
  55.                                          int ban1;
  56. //                                         CAN_RoboModule_DRV_Position_Mode(0,1,2000,0);
  57.                                          ban1=Remote_Scan();
  58.            delay_ms(200);                 
  59.                  if(ban1==90)
  60.                                          {
  61.                                                  rest(c);
  62.                                                  break;
  63.                                          }

  64.                                  }                         
  65.        }

  66.                 }
  67.                  
  68. }
  69.                           
  70.                                  

  71.                                 //if(data[0]==1&&data[2]==1)CAN_RoboModule_DRV_Position_Mode(0,1,1500,80000);

  72.                                                
  73.   //      delay_ms(1000);
  74.         //                  gofloor(b);
  75. //       CAN_RoboModule_DRV_Position_Mode(0,1,1500,80000);
  76. //       if(temp_pwm==11)
  77.         //                break;
  78. //    }
  79. //    while(1){};
  80.                        
  81.   
  82.    
  83. //}


  84. /*
  85. 1.电脑需要提前安装好keil MDK。推荐版本V4.74。
  86. 2.本程序适用芯片为STM32F405RGT6,使用8MHz晶振,主频168MHz。
  87. 3.如果需要测试CAN的通信,用户所用开发板或者主控板,必须含有CAN收发器,本例程使用的CAN引脚为PA11 PA12。
  88. 4.主控芯片如有不同,请自行在工程上修改,CAN引脚如有不同,请自行在can.c文件上修改。
  89. */
复制代码

  1. #include "main.h"


  2. unsigned int CAN_Time_Out = 0;

  3. static void CAN_Delay_Us(unsigned int t)
  4. {
  5.         int i;
  6.         for(i=0;i<t;i++)
  7.         {
  8.                 int a=40;
  9.                 while(a--);
  10.         }
  11. }


  12. /*----CAN1_TX-----PA12----*/
  13. /*----CAN1_RX-----PA11----*/

  14. /*************************************************************************
  15.                           CAN1_Configuration
  16. 描述:初始化CAN1配置为1M波特率
  17. *************************************************************************/
  18. void CAN1_Configuration(void)
  19. {
  20.     CAN_InitTypeDef        can;
  21.     CAN_FilterInitTypeDef  can_filter;
  22.     GPIO_InitTypeDef       gpio;
  23.     NVIC_InitTypeDef       nvic;

  24.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  25.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

  26.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_CAN1);
  27.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_CAN1);

  28.     gpio.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_11;
  29.     gpio.GPIO_Mode = GPIO_Mode_AF;
  30.     GPIO_Init(GPIOA, &gpio);
  31.    
  32.     nvic.NVIC_IRQChannel = CAN1_RX0_IRQn;
  33.     nvic.NVIC_IRQChannelPreemptionPriority = 2;
  34.     nvic.NVIC_IRQChannelSubPriority = 1;
  35.     nvic.NVIC_IRQChannelCmd = ENABLE;
  36.     NVIC_Init(&nvic);
  37.    
  38.     nvic.NVIC_IRQChannel = CAN1_TX_IRQn;
  39.     nvic.NVIC_IRQChannelPreemptionPriority = 1;
  40.     nvic.NVIC_IRQChannelSubPriority = 1;
  41.     nvic.NVIC_IRQChannelCmd = ENABLE;
  42.     NVIC_Init(&nvic);
  43.    
  44.     CAN_DeInit(CAN1);
  45.     CAN_StructInit(&can);
  46.    
  47.     can.CAN_TTCM = DISABLE;
  48.     can.CAN_ABOM = DISABLE;
  49.     can.CAN_AWUM = DISABLE;
  50.     can.CAN_NART = DISABLE;
  51.     can.CAN_RFLM = DISABLE;
  52.     can.CAN_TXFP = ENABLE;
  53.     can.CAN_Mode = CAN_Mode_Normal;
  54.     can.CAN_SJW  = CAN_SJW_1tq;
  55.     can.CAN_BS1 = CAN_BS1_9tq;
  56.     can.CAN_BS2 = CAN_BS2_4tq;
  57.     can.CAN_Prescaler = 3;   //CAN BaudRate 42/(1+9+4)/3=1Mbps
  58.     CAN_Init(CAN1, &can);

  59.         can_filter.CAN_FilterNumber = 0;
  60.         can_filter.CAN_FilterMode = CAN_FilterMode_IdMask;
  61.         can_filter.CAN_FilterScale = CAN_FilterScale_32bit;
  62.         can_filter.CAN_FilterIdHigh = 0x0000;
  63.         can_filter.CAN_FilterIdLow = 0x0000;
  64.         can_filter.CAN_FilterMaskIdHigh = 0x0000;
  65.         can_filter.CAN_FilterMaskIdLow = 0x0000;
  66.         can_filter.CAN_FilterFIFOAssignment = 0;
  67.         can_filter.CAN_FilterActivation=ENABLE;
  68.         CAN_FilterInit(&can_filter);
  69.    
  70.     CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);
  71.     CAN_ITConfig(CAN1,CAN_IT_TME,ENABLE);
  72. }

  73. unsigned char can_tx_success_flag = 0;
  74. /*************************************************************************
  75.                           CAN1_TX_IRQHandler
  76. 描述:CAN1的发送中断函数
  77. *************************************************************************/
  78. void CAN1_TX_IRQHandler(void)
  79. {
  80.     if (CAN_GetITStatus(CAN1,CAN_IT_TME)!= RESET)
  81.         {
  82.            CAN_ClearITPendingBit(CAN1,CAN_IT_TME);
  83.        can_tx_success_flag=1;
  84.     }
  85. }

  86. /****************************************************************************************
  87.                                        复位指令
  88. Group   取值范围 0-7
  89. Number  取值范围 0-15,其中Number==0时,为广播发送
  90. *****************************************************************************************/
  91. void CAN_RoboModule_DRV_Reset(unsigned char Group,unsigned char Number)
  92. {
  93.     unsigned short can_id = 0x000;
  94.     CanTxMsg tx_message;
  95.    
  96.     tx_message.IDE = CAN_ID_STD;    //标准帧
  97.     tx_message.RTR = CAN_RTR_DATA;  //数据帧
  98.     tx_message.DLC = 0x08;          //帧长度为8
  99.    
  100.     if((Group<=7)&&(Number<=15))
  101.     {
  102.         can_id |= Group<<8;
  103.         can_id |= Number<<4;
  104.     }
  105.     else
  106.     {
  107.         return;
  108.     }
  109.    
  110.     tx_message.StdId = can_id;      //帧ID为传入参数的CAN_ID
  111.    
  112.     tx_message.Data[0] = 0x55;
  113.     tx_message.Data[1] = 0x55;
  114.     tx_message.Data[2] = 0x55;
  115.     tx_message.Data[3] = 0x55;
  116.     tx_message.Data[4] = 0x55;
  117.     tx_message.Data[5] = 0x55;
  118.     tx_message.Data[6] = 0x55;
  119.     tx_message.Data[7] = 0x55;
  120.    
  121.     can_tx_success_flag = 0;
  122.     CAN_Transmit(CAN1,&tx_message);
  123.    
  124.     CAN_Time_Out = 0;
  125.     while(can_tx_success_flag == 0)
  126.     {
  127.         CAN_Delay_Us(1);
  128.         CAN_Time_Out++;
  129.         if(CAN_Time_Out>100)
  130.         {
  131.             break;
  132.         }
  133.     }
  134. }

  135. /****************************************************************************************
  136.                                      模式选择指令
  137. Group   取值范围 0-7
  138. Number  取值范围 0-15,其中Number==0时,为广播发送

  139. Mode    取值范围

  140. OpenLoop_Mode                       0x01
  141. Current_Mode                        0x02
  142. Velocity_Mode                       0x03
  143. Position_Mode                       0x04
  144. Velocity_Position_Mode              0x05
  145. Current_Velocity_Mode               0x06
  146. Current_Position_Mode               0x07
  147. Current_Velocity_Position_Mode      0x08
  148. *****************************************************************************************/
  149. void CAN_RoboModule_DRV_Mode_Choice(unsigned char Group,unsigned char Number,unsigned char Mode)
  150. {
  151.     unsigned short can_id = 0x001;
  152.     CanTxMsg tx_message;
  153.    
  154.     tx_message.IDE = CAN_ID_STD;    //标准帧
  155.     tx_message.RTR = CAN_RTR_DATA;  //数据帧
  156.     tx_message.DLC = 0x08;          //帧长度为8
  157.    
  158.     if((Group<=7)&&(Number<=15))
  159.     {
  160.         can_id |= Group<<8;
  161.         can_id |= Number<<4;
  162.     }
  163.     else
  164.     {
  165.         return;
  166.     }
  167.    
  168.     tx_message.StdId = can_id;      //帧ID为传入参数的CAN_ID
  169.    
  170.     tx_message.Data[0] = Mode;
  171.     tx_message.Data[1] = 0x55;
  172.     tx_message.Data[2] = 0x55;
  173.     tx_message.Data[3] = 0x55;
  174.     tx_message.Data[4] = 0x55;
  175.     tx_message.Data[5] = 0x55;
  176.     tx_message.Data[6] = 0x55;
  177.     tx_message.Data[7] = 0x55;
  178.    
  179.     can_tx_success_flag = 0;
  180.     CAN_Transmit(CAN1,&tx_message);
  181.    
  182.     CAN_Time_Out = 0;
  183.     while(can_tx_success_flag == 0)
  184.     {
  185.         CAN_Delay_Us(1);
  186.         CAN_Time_Out++;
  187.         if(CAN_Time_Out>100)
  188.         {
  189.             break;
  190.         }
  191.     }
  192. }

  193. /****************************************************************************************
  194.                                    开环模式下的数据指令
  195. Group   取值范围 0-7

  196. Number  取值范围 0-15,其中Number==0时,为广播发送

  197. temp_pwm的取值范围如下:
  198. 0 ~ +5000,满值5000,其中temp_pwm = ±5000时,最大输出电压为电源电压

  199. *****************************************************************************************/
  200. void CAN_RoboModule_DRV_OpenLoop_Mode(unsigned char Group,unsigned char Number,short Temp_PWM)
  201. {
  202.     unsigned short can_id = 0x002;
  203.     CanTxMsg tx_message;
  204.    
  205.     tx_message.IDE = CAN_ID_STD;    //标准帧
  206.     tx_message.RTR = CAN_RTR_DATA;  //数据帧
  207.     tx_message.DLC = 0x08;          //帧长度为8
  208.    
  209.     if((Group<=7)&&(Number<=15))
  210.     {
  211.         can_id |= Group<<8;
  212.         can_id |= Number<<4;
  213.     }
  214.     else
  215.     {
  216.         return;
  217.     }
  218.    
  219.     tx_message.StdId = can_id;      //帧ID为传入参数的CAN_ID

  220.     if(Temp_PWM > 5000)
  221.     {
  222.         Temp_PWM = 5000;
  223.     }
  224.     else if(Temp_PWM < -5000)
  225.     {
  226.         Temp_PWM = -5000;
  227.     }
  228.    
  229.     tx_message.Data[0] = (unsigned char)((Temp_PWM>>8)&0xff);
  230.     tx_message.Data[1] = (unsigned char)(Temp_PWM&0xff);
  231.     tx_message.Data[2] = 0x55;
  232.     tx_message.Data[3] = 0x55;
  233.     tx_message.Data[4] = 0x55;
  234.     tx_message.Data[5] = 0x55;
  235.     tx_message.Data[6] = 0x55;
  236.     tx_message.Data[7] = 0x55;
  237.    
  238.     can_tx_success_flag = 0;
  239.     CAN_Transmit(CAN1,&tx_message);
  240.    
  241.     CAN_Time_Out = 0;
  242.     while(can_tx_success_flag == 0)
  243.     {
  244.         CAN_Delay_Us(1);
  245.         CAN_Time_Out++;
  246.         if(CAN_Time_Out>100)
  247.         {
  248.             break;
  249.         }
  250.     }
  251. }

  252. /****************************************************************************************
  253.                                    电流模式下的数据指令
  254. Group   取值范围 0-7

  255. Number  取值范围 0-15,其中Number==0时,为广播发送

  256. temp_pwm的取值范围如下:
  257. 0 ~ +5000,满值5000,其中temp_pwm = 5000时,最大输出电压为电源电压

  258. temp_current的取值范围如下:
  259. -32768 ~ +32767,单位mA

  260. *****************************************************************************************/
  261. void CAN_RoboModule_DRV_Current_Mode(unsigned char Group,unsigned char Number,short Temp_PWM,short Temp_Current)
  262. {
  263.     unsigned short can_id = 0x003;
  264.     CanTxMsg tx_message;
  265.    
  266.     tx_message.IDE = CAN_ID_STD;    //标准帧
  267.     tx_message.RTR = CAN_RTR_DATA;  //数据帧
  268.     tx_message.DLC = 0x08;          //帧长度为8
  269.    
  270.     if((Group<=7)&&(Number<=15))
  271.     {
  272.         can_id |= Group<<8;
  273.         can_id |= Number<<4;
  274.     }
  275.     else
  276.     {
  277.         return;
  278.     }
  279.    
  280.     tx_message.StdId = can_id;      //帧ID为传入参数的CAN_ID

  281.     if(Temp_PWM > 5000)
  282.     {
  283.         Temp_PWM = 5000;
  284.     }
  285.     else if(Temp_PWM < -5000)
  286.     {
  287.         Temp_PWM = -5000;
  288.     }
  289.    
  290.     if(Temp_PWM < 0)
  291.     {
  292.         Temp_PWM = abs(Temp_PWM);
  293.     }
  294.    
  295.     tx_message.Data[0] = (unsigned char)((Temp_PWM>>8)&0xff);
  296.     tx_message.Data[1] = (unsigned char)(Temp_PWM&0xff);
  297.     tx_message.Data[2] = (unsigned char)((Temp_Current>>8)&0xff);
  298.     tx_message.Data[3] = (unsigned char)(Temp_Current&0xff);
  299.     tx_message.Data[4] = 0x55;
  300.     tx_message.Data[5] = 0x55;
  301.     tx_message.Data[6] = 0x55;
  302.     tx_message.Data[7] = 0x55;
  303.    
  304.     can_tx_success_flag = 0;
  305.     CAN_Transmit(CAN1,&tx_message);
  306.    
  307.     CAN_Time_Out = 0;
  308.     while(can_tx_success_flag == 0)
  309.     {
  310.         CAN_Delay_Us(1);
  311.         CAN_Time_Out++;
  312.         if(CAN_Time_Out>100)
  313.         {
  314.             break;
  315.         }
  316.     }
  317. }

  318. /****************************************************************************************
  319.                                    速度模式下的数据指令
  320. Group   取值范围 0-7

  321. Number  取值范围 0-15,其中Number==0时,为广播发送

  322. temp_pwm的取值范围如下:
  323. 0 ~ +5000,满值5000,其中temp_pwm = 5000时,最大输出电压为电源电压

  324. temp_velocity的取值范围如下:
  325. -32768 ~ +32767,单位RPM

  326. *****************************************************************************************/
  327. void CAN_RoboModule_DRV_Velocity_Mode(unsigned char Group,unsigned char Number,short Temp_PWM,short Temp_Velocity)
  328. {
  329.     unsigned short can_id = 0x004;
  330.     CanTxMsg tx_message;
  331.    
  332.     tx_message.IDE = CAN_ID_STD;    //标准帧
  333.     tx_message.RTR = CAN_RTR_DATA;  //数据帧
  334.     tx_message.DLC = 0x08;          //帧长度为8
  335.    
  336.     if((Group<=7)&&(Number<=15))
  337.     {
  338.         can_id |= Group<<8;
  339.         can_id |= Number<<4;
  340.     }
  341.     else
  342.     {
  343.         return;
  344.     }
  345.    
  346.     tx_message.StdId = can_id;      //帧ID为传入参数的CAN_ID

  347.     if(Temp_PWM > 5000)
  348.     {
  349.         Temp_PWM = 5000;
  350.     }
  351.     else if(Temp_PWM < -5000)
  352.     {
  353.         Temp_PWM = -5000;
  354.     }
  355.    
  356.     if(Temp_PWM < 0)
  357.     {
  358.         Temp_PWM = abs(Temp_PWM);
  359.     }
  360.    
  361.     tx_message.Data[0] = (unsigned char)((Temp_PWM>>8)&0xff);
  362.     tx_message.Data[1] = (unsigned char)(Temp_PWM&0xff);
  363.     tx_message.Data[2] = (unsigned char)((Temp_Velocity>>8)&0xff);
  364.     tx_message.Data[3] = (unsigned char)(Temp_Velocity&0xff);
  365.     tx_message.Data[4] = 0x55;
  366.     tx_message.Data[5] = 0x55;
  367.     tx_message.Data[6] = 0x55;
  368.     tx_message.Data[7] = 0x55;
  369.    
  370.     can_tx_success_flag = 0;
  371.     CAN_Transmit(CAN1,&tx_message);
  372.    
  373.     CAN_Time_Out = 0;
  374.     while(can_tx_success_flag == 0)
  375.     {
  376.         CAN_Delay_Us(1);
  377.         CAN_Time_Out++;
  378.         if(CAN_Time_Out>100)
  379.         {
  380.             break;
  381.         }
  382.     }
  383. }

  384. /****************************************************************************************
  385.                                    位置模式下的数据指令
  386. Group   取值范围 0-7

  387. Number  取值范围 0-15,其中Number==0时,为广播发送

  388. temp_pwm的取值范围如下:
  389. 0 ~ +5000,满值5000,其中temp_pwm = 5000时,最大输出电压为电源电压

  390. temp_position的取值范围如下:
  391. -2147483648~+2147483647,单位qc

  392. *****************************************************************************************/
  393. void CAN_RoboModule_DRV_Position_Mode(unsigned char Group,unsigned char Number,short Temp_PWM,long Temp_Position)
  394. {
  395.     unsigned short can_id = 0x005;
  396.     CanTxMsg tx_message;
  397.    
  398.     tx_message.IDE = CAN_ID_STD;    //标准帧
  399.     tx_message.RTR = CAN_RTR_DATA;  //数据帧
  400.     tx_message.DLC = 0x08;          //帧长度为8
  401.    
  402.     if((Group<=7)&&(Number<=15))
  403.     {
  404.         can_id |= Group<<8;
  405.         can_id |= Number<<4;
  406.     }
  407.     else
  408.     {
  409.         return;
  410.     }
  411.    
  412.     tx_message.StdId = can_id;      //帧ID为传入参数的CAN_ID

  413.     if(Temp_PWM > 5000)
  414.     {
  415.         Temp_PWM = 5000;
  416.     }
  417.     else if(Temp_PWM < -5000)
  418.     {
  419.         Temp_PWM = -5000;
  420.     }
  421.    
  422.     if(Temp_PWM < 0)
  423.     {
  424.         Temp_PWM = abs(Temp_PWM);
  425.     }
  426.    
  427.     tx_message.Data[0] = (unsigned char)((Temp_PWM>>8)&0xff);
  428.     tx_message.Data[1] = (unsigned char)(Temp_PWM&0xff);
  429.     tx_message.Data[2] = 0x55;
  430.     tx_message.Data[3] = 0x55;
  431.     tx_message.Data[4] = (unsigned char)((Temp_Position>>24)&0xff);
  432.     tx_message.Data[5] = (unsigned char)((Temp_Position>>16)&0xff);
  433.     tx_message.Data[6] = (unsigned char)((Temp_Position>>8)&0xff);
  434.     tx_message.Data[7] = (unsigned char)(Temp_Position&0xff);
  435.    
  436.     can_tx_success_flag = 0;
  437.     CAN_Transmit(CAN1,&tx_message);
  438.    
  439.     CAN_Time_Out = 0;
  440.     while(can_tx_success_flag == 0)
  441.     {
  442.         CAN_Delay_Us(1);
  443.         CAN_Time_Out++;
  444.         if(CAN_Time_Out>100)
  445.         {
  446.             break;
  447.         }
  448.     }
  449. }

  450. /****************************************************************************************
  451.                                   速度位置模式下的数据指令
  452. Group   取值范围 0-7

  453. Number  取值范围 0-15,其中Number==0时,为广播发送

  454. temp_pwm的取值范围如下:
  455. 0 ~ +5000,满值5000,其中temp_pwm = 5000时,最大输出电压为电源电压

  456. temp_velocity的取值范围如下:
  457. 0 ~ +32767,单位RPM

  458. temp_position的取值范围如下:
  459. -2147483648~+2147483647,单位qc
  460. *****************************************************************************************/
  461. void CAN_RoboModule_DRV_Velocity_Position_Mode(unsigned char Group,unsigned char Number,short Temp_PWM,short Temp_Velocity,long Temp_Position)
  462. {
  463.     unsigned short can_id = 0x006;
  464.     CanTxMsg tx_message;
  465.    
  466.     tx_message.IDE = CAN_ID_STD;    //标准帧
  467.     tx_message.RTR = CAN_RTR_DATA;  //数据帧
  468.     tx_message.DLC = 0x08;          //帧长度为8
  469.    
  470.     if((Group<=7)&&(Number<=15))
  471.     {
  472.         can_id |= Group<<8;
  473.         can_id |= Number<<4;
  474.     }
  475.     else
  476.     {
  477.         return;
  478.     }
  479.    
  480.     tx_message.StdId = can_id;      //帧ID为传入参数的CAN_ID

  481.     if(Temp_PWM > 5000)
  482.     {
  483.         Temp_PWM = 5000;
  484.     }
  485.     else if(Temp_PWM < -5000)
  486.     {
  487.         Temp_PWM = -5000;
  488.     }
  489.    
  490.     if(Temp_PWM < 0)
  491.     {
  492.         Temp_PWM = abs(Temp_PWM);
  493.     }
  494.    
  495.     if(Temp_Velocity < 0)
  496.     {
  497.         Temp_Velocity = abs(Temp_Velocity);
  498.     }
  499.    
  500.     tx_message.Data[0] = (unsigned char)((Temp_PWM>>8)&0xff);
  501.     tx_message.Data[1] = (unsigned char)(Temp_PWM&0xff);
  502.     tx_message.Data[2] = (unsigned char)((Temp_Velocity>>8)&0xff);
  503.     tx_message.Data[3] = (unsigned char)(Temp_Velocity&0xff);
  504.     tx_message.Data[4] = (unsigned char)((Temp_Position>>24)&0xff);
  505.     tx_message.Data[5] = (unsigned char)((Temp_Position>>16)&0xff);
  506.     tx_message.Data[6] = (unsigned char)((Temp_Position>>8)&0xff);
  507.     tx_message.Data[7] = (unsigned char)(Temp_Position&0xff);
  508.    
  509.     can_tx_success_flag = 0;
  510.     CAN_Transmit(CAN1,&tx_message);
  511.    
  512.     CAN_Time_Out = 0;
  513.     while(can_tx_success_flag == 0)
  514.     {
  515.         CAN_Delay_Us(1);
  516.         CAN_Time_Out++;
  517.         if(CAN_Time_Out>100)
  518.         {
  519.             break;
  520.         }
  521.     }
  522. }


  523. /****************************************************************************************
  524.                                   电流速度模式下的数据指令
  525. Group   取值范围 0-7

  526. Number  取值范围 0-15,其中Number==0时,为广播发送

  527. temp_current的取值范围如下:
  528. 0 ~ +32767,单位mA

  529. temp_velocity的取值范围如下:
  530. -32768 ~ +32767,单位RPM

  531. *****************************************************************************************/
  532. void CAN_RoboModule_DRV_Current_Velocity_Mode(unsigned char Group,unsigned char Number,short Temp_Current,short Temp_Velocity)
  533. {
  534.     unsigned short can_id = 0x007;
  535.     CanTxMsg tx_message;
  536.    
  537.     tx_message.IDE = CAN_ID_STD;    //标准帧
  538.     tx_message.RTR = CAN_RTR_DATA;  //数据帧
  539.     tx_message.DLC = 0x08;          //帧长度为8
  540.    
  541.     if((Group<=7)&&(Number<=15))
  542.     {
  543.         can_id |= Group<<8;
  544.         can_id |= Number<<4;
  545.     }
  546.     else
  547.     {
  548.         return;
  549.     }
  550.    
  551.     tx_message.StdId = can_id;      //帧ID为传入参数的CAN_ID
  552.    
  553.     if(Temp_Current < 0)
  554.     {
  555.         Temp_Current = abs(Temp_Current);
  556.     }
  557.    
  558.     tx_message.Data[0] = (unsigned char)((Temp_Current>>8)&0xff);
  559.     tx_message.Data[1] = (unsigned char)(Temp_Current&0xff);
  560.     tx_message.Data[2] = (unsigned char)((Temp_Velocity>>8)&0xff);
  561.     tx_message.Data[3] = (unsigned char)(Temp_Velocity&0xff);
  562.     tx_message.Data[4] = 0x55;
  563.     tx_message.Data[5] = 0x55;
  564.     tx_message.Data[6] = 0x55;
  565.     tx_message.Data[7] = 0x55;
  566.    
  567.     can_tx_success_flag = 0;
  568.     CAN_Transmit(CAN1,&tx_message);
  569.    
  570.     CAN_Time_Out = 0;
  571.     while(can_tx_success_flag == 0)
  572.     {
  573.         CAN_Delay_Us(1);
  574.         CAN_Time_Out++;
  575.         if(CAN_Time_Out>100)
  576.         {
  577.             break;
  578.         }
  579.     }
  580. }


  581. /****************************************************************************************
  582.                                   电流位置模式下的数据指令
  583. Group   取值范围 0-7

  584. Number  取值范围 0-15,其中Number==0时,为广播发送

  585. temp_current的取值范围如下:
  586. 0 ~ +32767,单位mA

  587. temp_position的取值范围如下:
  588. -2147483648~+2147483647,单位qc

  589. *****************************************************************************************/
  590. void CAN_RoboModule_DRV_Current_Position_Mode(unsigned char Group,unsigned char Number,short Temp_Current,long Temp_Position)
  591. {
  592.     unsigned short can_id = 0x008;
  593.     CanTxMsg tx_message;
  594.    
  595.     tx_message.IDE = CAN_ID_STD;    //标准帧
  596.     tx_message.RTR = CAN_RTR_DATA;  //数据帧
  597.     tx_message.DLC = 0x08;          //帧长度为8
  598.    
  599.     if((Group<=7)&&(Number<=15))
  600.     {
  601.         can_id |= Group<<8;
  602.         can_id |= Number<<4;
  603.     }
  604.     else
  605.     {
  606.         return;
  607.     }
  608.    
  609.     tx_message.StdId = can_id;      //帧ID为传入参数的CAN_ID

  610.    
  611.     if(Temp_Current < 0)
  612.     {
  613.         Temp_Current = abs(Temp_Current);
  614.     }
  615.    
  616.     tx_message.Data[0] = (unsigned char)((Temp_Current>>8)&0xff);
  617.     tx_message.Data[1] = (unsigned char)(Temp_Current&0xff);
  618.     tx_message.Data[2] = 0x55;
  619.     tx_message.Data[3] = 0x55;
  620.     tx_message.Data[4] = (unsigned char)((Temp_Position>>24)&0xff);
  621.     tx_message.Data[5] = (unsigned char)((Temp_Position>>16)&0xff);
  622.     tx_message.Data[6] = (unsigned char)((Temp_Position>>8)&0xff);
  623.     tx_message.Data[7] = (unsigned char)(Temp_Position&0xff);
  624.    
  625.     can_tx_success_flag = 0;
  626.     CAN_Transmit(CAN1,&tx_message);
  627.    
  628.     CAN_Time_Out = 0;
  629.     while(can_tx_success_flag == 0)
  630.     {
  631.         CAN_Delay_Us(1);
  632.         CAN_Time_Out++;
  633.         if(CAN_Time_Out>100)
  634.         {
  635.             break;
  636.         }
  637.     }
  638. }


  639. /****************************************************************************************
  640.                                   电流速度位置模式下的数据指令
  641. Group   取值范围 0-7

  642. Number  取值范围 0-15,其中Number==0时,为广播发送

  643. temp_current的取值范围如下:
  644. 0 ~ +32767,单位mA

  645. temp_velocity的取值范围如下:
  646. 0 ~ +32767,单位RPM

  647. temp_position的取值范围如下:
  648. -2147483648~+2147483647,单位qc

  649. *****************************************************************************************/
  650. void CAN_RoboModule_DRV_Current_Velocity_Position_Mode(unsigned char Group,unsigned char Number,short Temp_Current,short Temp_Velocity,long Temp_Position)
  651. {
  652.     unsigned short can_id = 0x009;
  653.     CanTxMsg tx_message;
  654.    
  655.     tx_message.IDE = CAN_ID_STD;    //标准帧
  656.     tx_message.RTR = CAN_RTR_DATA;  //数据帧
  657.     tx_message.DLC = 0x08;          //帧长度为8
  658.    
  659.     if((Group<=7)&&(Number<=15))
  660.     {
  661.         can_id |= Group<<8;
  662.         can_id |= Number<<4;
  663.     }
  664.     else
  665.     {
  666.         return;
  667.     }
  668.    
  669.     tx_message.StdId = can_id;      //帧ID为传入参数的CAN_ID
  670.    
  671.     if(Temp_Current < 0)
  672.     {
  673.         Temp_Current = abs(Temp_Current);
  674.     }
  675.    
  676.     if(Temp_Velocity < 0)
  677.     {
  678.         Temp_Velocity = abs(Temp_Velocity);
  679.     }
  680.    
  681.     tx_message.Data[0] = (unsigned char)((Temp_Current>>8)&0xff);
  682.     tx_message.Data[1] = (unsigned char)(Temp_Current&0xff);
  683.     tx_message.Data[2] = (unsigned char)((Temp_Velocity>>8)&0xff);
  684.     tx_message.Data[3] = (unsigned char)(Temp_Velocity&0xff);
  685.     tx_message.Data[4] = (unsigned char)((Temp_Position>>24)&0xff);
  686.     tx_message.Data[5] = (unsigned char)((Temp_Position>>16)&0xff);
  687.     tx_message.Data[6] = (unsigned char)((Temp_Position>>8)&0xff);
  688.     tx_message.Data[7] = (unsigned char)(Temp_Position&0xff);
  689.    
  690.     can_tx_success_flag = 0;
  691.     CAN_Transmit(CAN1,&tx_message);
  692.    
  693.     CAN_Time_Out = 0;
  694.     while(can_tx_success_flag == 0)
  695.     {
  696.         CAN_Delay_Us(1);
  697.         CAN_Time_Out++;
  698.         if(CAN_Time_Out>100)
  699.         {
  700.             break;
  701.         }
  702.     }
  703. }

  704. /****************************************************************************************
  705.                                       配置指令
  706. Temp_Time1的取值范围: 0 ~ 255,为0时候,为关闭电流速度位置反馈功能
  707. Temp_Time2的取值范围: 0 ~ 255,为0时候,为关闭限位信号反馈功能
  708. *****************************************************************************************/
  709. void CAN_RoboModule_DRV_Config(unsigned char Group,unsigned char Number,unsigned char Temp_Time1,unsigned char Temp_Time2)
  710. {
  711.     unsigned short can_id = 0x00A;
  712.     CanTxMsg tx_message;
  713.    
  714.     tx_message.IDE = CAN_ID_STD;    //标准帧
  715.     tx_message.RTR = CAN_RTR_DATA;  //数据帧
  716.     tx_message.DLC = 0x08;          //帧长度为8
  717.    
  718.     if((Group<=7)&&(Number<=15))
  719.     {
  720.         can_id |= Group<<8;
  721.         can_id |= Number<<4;
  722.     }
  723.     else
  724.     {
  725.         return;
  726.     }
  727.    
  728.     tx_message.StdId = can_id;
  729.    
  730.     tx_message.Data[0] = Temp_Time1;
  731.     tx_message.Data[1] = Temp_Time2;
  732.     tx_message.Data[2] = 0x55;
  733.     tx_message.Data[3] = 0x55;
  734.     tx_message.Data[4] = 0x55;
  735.     tx_message.Data[5] = 0x55;
  736.     tx_message.Data[6] = 0x55;
  737.     tx_message.Data[7] = 0x55;
  738.    
  739.     can_tx_success_flag = 0;
  740.     CAN_Transmit(CAN1,&tx_message);
  741.    
  742.     CAN_Time_Out = 0;
  743.     while(can_tx_success_flag == 0)
  744.     {
  745.         CAN_Delay_Us(1);
  746.         CAN_Time_Out++;
  747.         if(CAN_Time_Out>100)
  748.         {
  749.             break;
  750.         }
  751.     }
  752. }

  753. /****************************************************************************************
  754.                                       在线检测
  755. *****************************************************************************************/
  756. void CAN_RoboModule_DRV_Online_Check(unsigned char Group,unsigned char Number)
  757. {
  758.     unsigned short can_id = 0x00F;
  759.     CanTxMsg tx_message;
  760.    
  761.     tx_message.IDE = CAN_ID_STD;    //标准帧
  762.     tx_message.RTR = CAN_RTR_DATA;  //数据帧
  763.     tx_message.DLC = 0x08;          //帧长度为8
  764.    
  765.     if((Group<=7)&&(Number<=15))
  766.     {
  767.         can_id |= Group<<8;
  768.         can_id |= Number<<4;
  769.     }
  770.     else
  771.     {
  772.         return;
  773.     }
  774.    
  775.     tx_message.StdId = can_id;      //帧ID为传入参数的CAN_ID
  776.    
  777.     tx_message.Data[0] = 0x55;
  778.     tx_message.Data[1] = 0x55;
  779.     tx_message.Data[2] = 0x55;
  780.     tx_message.Data[3] = 0x55;
  781.     tx_message.Data[4] = 0x55;
  782.     tx_message.Data[5] = 0x55;
  783.     tx_message.Data[6] = 0x55;
  784.     tx_message.Data[7] = 0x55;
  785.    
  786.     can_tx_success_flag = 0;
  787.     CAN_Transmit(CAN1,&tx_message);
  788.    
  789.     CAN_Time_Out = 0;
  790.     while(can_tx_success_flag == 0)
  791. ……………………

  792. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


所有资料51hei提供下载:
可旋转自行车停车程序.rar (383.08 KB, 下载次数: 32)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表