基于stm32-CAN控制伺服电机程序
单片机源程序如下:
- #include "main.h"
- int Show1[2]={1,1};
- int *ShowLed=Show1;
- int main(void)
- {
- u8 key;
- LED_GPIO_Config();
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- TIM3_Int_Init();
- CAN1_Configuration(); //CAN1初始化
- Remote_Init(); //红外接收初始化
- delay_ms(500); //刚开始要有足够的延时,确保驱动器已经初始化完成
- CAN_RoboModule_DRV_Reset(0,0); //对0组所有驱动器进行复位
-
- delay_ms(500); //发送复位指令后的延时必须要有,等待驱动器再次初始化完成
- CAN_RoboModule_DRV_Config(0,1,100,0);
- delay_ms(500); //1号驱动器配置为100ms传回一次数据
- CAN_RoboModule_DRV_Config(0,2,100,0);
- delay_ms(500);
- CAN_RoboModule_DRV_Mode_Choice(0,0,Position_Mode); //0组的所有驱动器 都进入位置模式。
- delay_ms(500); //发送模式选择指令后,要等待驱动器进入模式就绪。所以延时也不可以去掉。
- while(1)
- {
- key=Remote_Scan();
- if(key==16)//左,存车
- {
- int *b;
- b=FindPath(); //186562
- ShowLed=b;
- gofloor(b);
- while(1)
- {
- int ban=0;
- ban=Remote_Scan();
- // delay_ms(100);
- if(ban==90) //右
- {
- rest(b);
- break;
- }
- }
- pop(b);
- }
- if(key==18)
- {
- int *c;
- // CAN_RoboModule_DRV_Position_Mode(0,1,2000,80000);
- c=getkey();
- // delay_ms(200);
- ShowLed=c;
- gofloor(c);
- push(c);
- while(1)
- {
- int ban1;
- // CAN_RoboModule_DRV_Position_Mode(0,1,2000,0);
- ban1=Remote_Scan();
- delay_ms(200);
- if(ban1==90)
- {
- rest(c);
- break;
- }
- }
- }
- }
-
- }
-
-
- //if(data[0]==1&&data[2]==1)CAN_RoboModule_DRV_Position_Mode(0,1,1500,80000);
-
- // delay_ms(1000);
- // gofloor(b);
- // CAN_RoboModule_DRV_Position_Mode(0,1,1500,80000);
- // if(temp_pwm==11)
- // break;
- // }
- // while(1){};
-
-
-
- //}
- /*
- 1.电脑需要提前安装好keil MDK。推荐版本V4.74。
- 2.本程序适用芯片为STM32F405RGT6,使用8MHz晶振,主频168MHz。
- 3.如果需要测试CAN的通信,用户所用开发板或者主控板,必须含有CAN收发器,本例程使用的CAN引脚为PA11 PA12。
- 4.主控芯片如有不同,请自行在工程上修改,CAN引脚如有不同,请自行在can.c文件上修改。
- */
复制代码
- #include "main.h"
- unsigned int CAN_Time_Out = 0;
- static void CAN_Delay_Us(unsigned int t)
- {
- int i;
- for(i=0;i<t;i++)
- {
- int a=40;
- while(a--);
- }
- }
- /*----CAN1_TX-----PA12----*/
- /*----CAN1_RX-----PA11----*/
- /*************************************************************************
- CAN1_Configuration
- 描述:初始化CAN1配置为1M波特率
- *************************************************************************/
- void CAN1_Configuration(void)
- {
- CAN_InitTypeDef can;
- CAN_FilterInitTypeDef can_filter;
- GPIO_InitTypeDef gpio;
- NVIC_InitTypeDef nvic;
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_CAN1);
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_CAN1);
- gpio.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_11;
- gpio.GPIO_Mode = GPIO_Mode_AF;
- GPIO_Init(GPIOA, &gpio);
-
- nvic.NVIC_IRQChannel = CAN1_RX0_IRQn;
- nvic.NVIC_IRQChannelPreemptionPriority = 2;
- nvic.NVIC_IRQChannelSubPriority = 1;
- nvic.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&nvic);
-
- nvic.NVIC_IRQChannel = CAN1_TX_IRQn;
- nvic.NVIC_IRQChannelPreemptionPriority = 1;
- nvic.NVIC_IRQChannelSubPriority = 1;
- nvic.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&nvic);
-
- CAN_DeInit(CAN1);
- CAN_StructInit(&can);
-
- can.CAN_TTCM = DISABLE;
- can.CAN_ABOM = DISABLE;
- can.CAN_AWUM = DISABLE;
- can.CAN_NART = DISABLE;
- can.CAN_RFLM = DISABLE;
- can.CAN_TXFP = ENABLE;
- can.CAN_Mode = CAN_Mode_Normal;
- can.CAN_SJW = CAN_SJW_1tq;
- can.CAN_BS1 = CAN_BS1_9tq;
- can.CAN_BS2 = CAN_BS2_4tq;
- can.CAN_Prescaler = 3; //CAN BaudRate 42/(1+9+4)/3=1Mbps
- CAN_Init(CAN1, &can);
- can_filter.CAN_FilterNumber = 0;
- can_filter.CAN_FilterMode = CAN_FilterMode_IdMask;
- can_filter.CAN_FilterScale = CAN_FilterScale_32bit;
- can_filter.CAN_FilterIdHigh = 0x0000;
- can_filter.CAN_FilterIdLow = 0x0000;
- can_filter.CAN_FilterMaskIdHigh = 0x0000;
- can_filter.CAN_FilterMaskIdLow = 0x0000;
- can_filter.CAN_FilterFIFOAssignment = 0;
- can_filter.CAN_FilterActivation=ENABLE;
- CAN_FilterInit(&can_filter);
-
- CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);
- CAN_ITConfig(CAN1,CAN_IT_TME,ENABLE);
- }
- unsigned char can_tx_success_flag = 0;
- /*************************************************************************
- CAN1_TX_IRQHandler
- 描述:CAN1的发送中断函数
- *************************************************************************/
- void CAN1_TX_IRQHandler(void)
- {
- if (CAN_GetITStatus(CAN1,CAN_IT_TME)!= RESET)
- {
- CAN_ClearITPendingBit(CAN1,CAN_IT_TME);
- can_tx_success_flag=1;
- }
- }
- /****************************************************************************************
- 复位指令
- Group 取值范围 0-7
- Number 取值范围 0-15,其中Number==0时,为广播发送
- *****************************************************************************************/
- void CAN_RoboModule_DRV_Reset(unsigned char Group,unsigned char Number)
- {
- unsigned short can_id = 0x000;
- CanTxMsg tx_message;
-
- tx_message.IDE = CAN_ID_STD; //标准帧
- tx_message.RTR = CAN_RTR_DATA; //数据帧
- tx_message.DLC = 0x08; //帧长度为8
-
- if((Group<=7)&&(Number<=15))
- {
- can_id |= Group<<8;
- can_id |= Number<<4;
- }
- else
- {
- return;
- }
-
- tx_message.StdId = can_id; //帧ID为传入参数的CAN_ID
-
- tx_message.Data[0] = 0x55;
- tx_message.Data[1] = 0x55;
- tx_message.Data[2] = 0x55;
- tx_message.Data[3] = 0x55;
- tx_message.Data[4] = 0x55;
- tx_message.Data[5] = 0x55;
- tx_message.Data[6] = 0x55;
- tx_message.Data[7] = 0x55;
-
- can_tx_success_flag = 0;
- CAN_Transmit(CAN1,&tx_message);
-
- CAN_Time_Out = 0;
- while(can_tx_success_flag == 0)
- {
- CAN_Delay_Us(1);
- CAN_Time_Out++;
- if(CAN_Time_Out>100)
- {
- break;
- }
- }
- }
- /****************************************************************************************
- 模式选择指令
- Group 取值范围 0-7
- Number 取值范围 0-15,其中Number==0时,为广播发送
- Mode 取值范围
- OpenLoop_Mode 0x01
- Current_Mode 0x02
- Velocity_Mode 0x03
- Position_Mode 0x04
- Velocity_Position_Mode 0x05
- Current_Velocity_Mode 0x06
- Current_Position_Mode 0x07
- Current_Velocity_Position_Mode 0x08
- *****************************************************************************************/
- void CAN_RoboModule_DRV_Mode_Choice(unsigned char Group,unsigned char Number,unsigned char Mode)
- {
- unsigned short can_id = 0x001;
- CanTxMsg tx_message;
-
- tx_message.IDE = CAN_ID_STD; //标准帧
- tx_message.RTR = CAN_RTR_DATA; //数据帧
- tx_message.DLC = 0x08; //帧长度为8
-
- if((Group<=7)&&(Number<=15))
- {
- can_id |= Group<<8;
- can_id |= Number<<4;
- }
- else
- {
- return;
- }
-
- tx_message.StdId = can_id; //帧ID为传入参数的CAN_ID
-
- tx_message.Data[0] = Mode;
- tx_message.Data[1] = 0x55;
- tx_message.Data[2] = 0x55;
- tx_message.Data[3] = 0x55;
- tx_message.Data[4] = 0x55;
- tx_message.Data[5] = 0x55;
- tx_message.Data[6] = 0x55;
- tx_message.Data[7] = 0x55;
-
- can_tx_success_flag = 0;
- CAN_Transmit(CAN1,&tx_message);
-
- CAN_Time_Out = 0;
- while(can_tx_success_flag == 0)
- {
- CAN_Delay_Us(1);
- CAN_Time_Out++;
- if(CAN_Time_Out>100)
- {
- break;
- }
- }
- }
- /****************************************************************************************
- 开环模式下的数据指令
- Group 取值范围 0-7
- Number 取值范围 0-15,其中Number==0时,为广播发送
- temp_pwm的取值范围如下:
- 0 ~ +5000,满值5000,其中temp_pwm = ±5000时,最大输出电压为电源电压
- *****************************************************************************************/
- void CAN_RoboModule_DRV_OpenLoop_Mode(unsigned char Group,unsigned char Number,short Temp_PWM)
- {
- unsigned short can_id = 0x002;
- CanTxMsg tx_message;
-
- tx_message.IDE = CAN_ID_STD; //标准帧
- tx_message.RTR = CAN_RTR_DATA; //数据帧
- tx_message.DLC = 0x08; //帧长度为8
-
- if((Group<=7)&&(Number<=15))
- {
- can_id |= Group<<8;
- can_id |= Number<<4;
- }
- else
- {
- return;
- }
-
- tx_message.StdId = can_id; //帧ID为传入参数的CAN_ID
- if(Temp_PWM > 5000)
- {
- Temp_PWM = 5000;
- }
- else if(Temp_PWM < -5000)
- {
- Temp_PWM = -5000;
- }
-
- tx_message.Data[0] = (unsigned char)((Temp_PWM>>8)&0xff);
- tx_message.Data[1] = (unsigned char)(Temp_PWM&0xff);
- tx_message.Data[2] = 0x55;
- tx_message.Data[3] = 0x55;
- tx_message.Data[4] = 0x55;
- tx_message.Data[5] = 0x55;
- tx_message.Data[6] = 0x55;
- tx_message.Data[7] = 0x55;
-
- can_tx_success_flag = 0;
- CAN_Transmit(CAN1,&tx_message);
-
- CAN_Time_Out = 0;
- while(can_tx_success_flag == 0)
- {
- CAN_Delay_Us(1);
- CAN_Time_Out++;
- if(CAN_Time_Out>100)
- {
- break;
- }
- }
- }
- /****************************************************************************************
- 电流模式下的数据指令
- Group 取值范围 0-7
- Number 取值范围 0-15,其中Number==0时,为广播发送
- temp_pwm的取值范围如下:
- 0 ~ +5000,满值5000,其中temp_pwm = 5000时,最大输出电压为电源电压
- temp_current的取值范围如下:
- -32768 ~ +32767,单位mA
- *****************************************************************************************/
- void CAN_RoboModule_DRV_Current_Mode(unsigned char Group,unsigned char Number,short Temp_PWM,short Temp_Current)
- {
- unsigned short can_id = 0x003;
- CanTxMsg tx_message;
-
- tx_message.IDE = CAN_ID_STD; //标准帧
- tx_message.RTR = CAN_RTR_DATA; //数据帧
- tx_message.DLC = 0x08; //帧长度为8
-
- if((Group<=7)&&(Number<=15))
- {
- can_id |= Group<<8;
- can_id |= Number<<4;
- }
- else
- {
- return;
- }
-
- tx_message.StdId = can_id; //帧ID为传入参数的CAN_ID
- if(Temp_PWM > 5000)
- {
- Temp_PWM = 5000;
- }
- else if(Temp_PWM < -5000)
- {
- Temp_PWM = -5000;
- }
-
- if(Temp_PWM < 0)
- {
- Temp_PWM = abs(Temp_PWM);
- }
-
- tx_message.Data[0] = (unsigned char)((Temp_PWM>>8)&0xff);
- tx_message.Data[1] = (unsigned char)(Temp_PWM&0xff);
- tx_message.Data[2] = (unsigned char)((Temp_Current>>8)&0xff);
- tx_message.Data[3] = (unsigned char)(Temp_Current&0xff);
- tx_message.Data[4] = 0x55;
- tx_message.Data[5] = 0x55;
- tx_message.Data[6] = 0x55;
- tx_message.Data[7] = 0x55;
-
- can_tx_success_flag = 0;
- CAN_Transmit(CAN1,&tx_message);
-
- CAN_Time_Out = 0;
- while(can_tx_success_flag == 0)
- {
- CAN_Delay_Us(1);
- CAN_Time_Out++;
- if(CAN_Time_Out>100)
- {
- break;
- }
- }
- }
- /****************************************************************************************
- 速度模式下的数据指令
- Group 取值范围 0-7
- Number 取值范围 0-15,其中Number==0时,为广播发送
- temp_pwm的取值范围如下:
- 0 ~ +5000,满值5000,其中temp_pwm = 5000时,最大输出电压为电源电压
- temp_velocity的取值范围如下:
- -32768 ~ +32767,单位RPM
- *****************************************************************************************/
- void CAN_RoboModule_DRV_Velocity_Mode(unsigned char Group,unsigned char Number,short Temp_PWM,short Temp_Velocity)
- {
- unsigned short can_id = 0x004;
- CanTxMsg tx_message;
-
- tx_message.IDE = CAN_ID_STD; //标准帧
- tx_message.RTR = CAN_RTR_DATA; //数据帧
- tx_message.DLC = 0x08; //帧长度为8
-
- if((Group<=7)&&(Number<=15))
- {
- can_id |= Group<<8;
- can_id |= Number<<4;
- }
- else
- {
- return;
- }
-
- tx_message.StdId = can_id; //帧ID为传入参数的CAN_ID
- if(Temp_PWM > 5000)
- {
- Temp_PWM = 5000;
- }
- else if(Temp_PWM < -5000)
- {
- Temp_PWM = -5000;
- }
-
- if(Temp_PWM < 0)
- {
- Temp_PWM = abs(Temp_PWM);
- }
-
- tx_message.Data[0] = (unsigned char)((Temp_PWM>>8)&0xff);
- tx_message.Data[1] = (unsigned char)(Temp_PWM&0xff);
- tx_message.Data[2] = (unsigned char)((Temp_Velocity>>8)&0xff);
- tx_message.Data[3] = (unsigned char)(Temp_Velocity&0xff);
- tx_message.Data[4] = 0x55;
- tx_message.Data[5] = 0x55;
- tx_message.Data[6] = 0x55;
- tx_message.Data[7] = 0x55;
-
- can_tx_success_flag = 0;
- CAN_Transmit(CAN1,&tx_message);
-
- CAN_Time_Out = 0;
- while(can_tx_success_flag == 0)
- {
- CAN_Delay_Us(1);
- CAN_Time_Out++;
- if(CAN_Time_Out>100)
- {
- break;
- }
- }
- }
- /****************************************************************************************
- 位置模式下的数据指令
- Group 取值范围 0-7
- Number 取值范围 0-15,其中Number==0时,为广播发送
- temp_pwm的取值范围如下:
- 0 ~ +5000,满值5000,其中temp_pwm = 5000时,最大输出电压为电源电压
- temp_position的取值范围如下:
- -2147483648~+2147483647,单位qc
- *****************************************************************************************/
- void CAN_RoboModule_DRV_Position_Mode(unsigned char Group,unsigned char Number,short Temp_PWM,long Temp_Position)
- {
- unsigned short can_id = 0x005;
- CanTxMsg tx_message;
-
- tx_message.IDE = CAN_ID_STD; //标准帧
- tx_message.RTR = CAN_RTR_DATA; //数据帧
- tx_message.DLC = 0x08; //帧长度为8
-
- if((Group<=7)&&(Number<=15))
- {
- can_id |= Group<<8;
- can_id |= Number<<4;
- }
- else
- {
- return;
- }
-
- tx_message.StdId = can_id; //帧ID为传入参数的CAN_ID
- if(Temp_PWM > 5000)
- {
- Temp_PWM = 5000;
- }
- else if(Temp_PWM < -5000)
- {
- Temp_PWM = -5000;
- }
-
- if(Temp_PWM < 0)
- {
- Temp_PWM = abs(Temp_PWM);
- }
-
- tx_message.Data[0] = (unsigned char)((Temp_PWM>>8)&0xff);
- tx_message.Data[1] = (unsigned char)(Temp_PWM&0xff);
- tx_message.Data[2] = 0x55;
- tx_message.Data[3] = 0x55;
- tx_message.Data[4] = (unsigned char)((Temp_Position>>24)&0xff);
- tx_message.Data[5] = (unsigned char)((Temp_Position>>16)&0xff);
- tx_message.Data[6] = (unsigned char)((Temp_Position>>8)&0xff);
- tx_message.Data[7] = (unsigned char)(Temp_Position&0xff);
-
- can_tx_success_flag = 0;
- CAN_Transmit(CAN1,&tx_message);
-
- CAN_Time_Out = 0;
- while(can_tx_success_flag == 0)
- {
- CAN_Delay_Us(1);
- CAN_Time_Out++;
- if(CAN_Time_Out>100)
- {
- break;
- }
- }
- }
- /****************************************************************************************
- 速度位置模式下的数据指令
- Group 取值范围 0-7
- Number 取值范围 0-15,其中Number==0时,为广播发送
- temp_pwm的取值范围如下:
- 0 ~ +5000,满值5000,其中temp_pwm = 5000时,最大输出电压为电源电压
- temp_velocity的取值范围如下:
- 0 ~ +32767,单位RPM
- temp_position的取值范围如下:
- -2147483648~+2147483647,单位qc
- *****************************************************************************************/
- void CAN_RoboModule_DRV_Velocity_Position_Mode(unsigned char Group,unsigned char Number,short Temp_PWM,short Temp_Velocity,long Temp_Position)
- {
- unsigned short can_id = 0x006;
- CanTxMsg tx_message;
-
- tx_message.IDE = CAN_ID_STD; //标准帧
- tx_message.RTR = CAN_RTR_DATA; //数据帧
- tx_message.DLC = 0x08; //帧长度为8
-
- if((Group<=7)&&(Number<=15))
- {
- can_id |= Group<<8;
- can_id |= Number<<4;
- }
- else
- {
- return;
- }
-
- tx_message.StdId = can_id; //帧ID为传入参数的CAN_ID
- if(Temp_PWM > 5000)
- {
- Temp_PWM = 5000;
- }
- else if(Temp_PWM < -5000)
- {
- Temp_PWM = -5000;
- }
-
- if(Temp_PWM < 0)
- {
- Temp_PWM = abs(Temp_PWM);
- }
-
- if(Temp_Velocity < 0)
- {
- Temp_Velocity = abs(Temp_Velocity);
- }
-
- tx_message.Data[0] = (unsigned char)((Temp_PWM>>8)&0xff);
- tx_message.Data[1] = (unsigned char)(Temp_PWM&0xff);
- tx_message.Data[2] = (unsigned char)((Temp_Velocity>>8)&0xff);
- tx_message.Data[3] = (unsigned char)(Temp_Velocity&0xff);
- tx_message.Data[4] = (unsigned char)((Temp_Position>>24)&0xff);
- tx_message.Data[5] = (unsigned char)((Temp_Position>>16)&0xff);
- tx_message.Data[6] = (unsigned char)((Temp_Position>>8)&0xff);
- tx_message.Data[7] = (unsigned char)(Temp_Position&0xff);
-
- can_tx_success_flag = 0;
- CAN_Transmit(CAN1,&tx_message);
-
- CAN_Time_Out = 0;
- while(can_tx_success_flag == 0)
- {
- CAN_Delay_Us(1);
- CAN_Time_Out++;
- if(CAN_Time_Out>100)
- {
- break;
- }
- }
- }
- /****************************************************************************************
- 电流速度模式下的数据指令
- Group 取值范围 0-7
- Number 取值范围 0-15,其中Number==0时,为广播发送
- temp_current的取值范围如下:
- 0 ~ +32767,单位mA
- temp_velocity的取值范围如下:
- -32768 ~ +32767,单位RPM
- *****************************************************************************************/
- void CAN_RoboModule_DRV_Current_Velocity_Mode(unsigned char Group,unsigned char Number,short Temp_Current,short Temp_Velocity)
- {
- unsigned short can_id = 0x007;
- CanTxMsg tx_message;
-
- tx_message.IDE = CAN_ID_STD; //标准帧
- tx_message.RTR = CAN_RTR_DATA; //数据帧
- tx_message.DLC = 0x08; //帧长度为8
-
- if((Group<=7)&&(Number<=15))
- {
- can_id |= Group<<8;
- can_id |= Number<<4;
- }
- else
- {
- return;
- }
-
- tx_message.StdId = can_id; //帧ID为传入参数的CAN_ID
-
- if(Temp_Current < 0)
- {
- Temp_Current = abs(Temp_Current);
- }
-
- tx_message.Data[0] = (unsigned char)((Temp_Current>>8)&0xff);
- tx_message.Data[1] = (unsigned char)(Temp_Current&0xff);
- tx_message.Data[2] = (unsigned char)((Temp_Velocity>>8)&0xff);
- tx_message.Data[3] = (unsigned char)(Temp_Velocity&0xff);
- tx_message.Data[4] = 0x55;
- tx_message.Data[5] = 0x55;
- tx_message.Data[6] = 0x55;
- tx_message.Data[7] = 0x55;
-
- can_tx_success_flag = 0;
- CAN_Transmit(CAN1,&tx_message);
-
- CAN_Time_Out = 0;
- while(can_tx_success_flag == 0)
- {
- CAN_Delay_Us(1);
- CAN_Time_Out++;
- if(CAN_Time_Out>100)
- {
- break;
- }
- }
- }
- /****************************************************************************************
- 电流位置模式下的数据指令
- Group 取值范围 0-7
- Number 取值范围 0-15,其中Number==0时,为广播发送
- temp_current的取值范围如下:
- 0 ~ +32767,单位mA
- temp_position的取值范围如下:
- -2147483648~+2147483647,单位qc
- *****************************************************************************************/
- void CAN_RoboModule_DRV_Current_Position_Mode(unsigned char Group,unsigned char Number,short Temp_Current,long Temp_Position)
- {
- unsigned short can_id = 0x008;
- CanTxMsg tx_message;
-
- tx_message.IDE = CAN_ID_STD; //标准帧
- tx_message.RTR = CAN_RTR_DATA; //数据帧
- tx_message.DLC = 0x08; //帧长度为8
-
- if((Group<=7)&&(Number<=15))
- {
- can_id |= Group<<8;
- can_id |= Number<<4;
- }
- else
- {
- return;
- }
-
- tx_message.StdId = can_id; //帧ID为传入参数的CAN_ID
-
- if(Temp_Current < 0)
- {
- Temp_Current = abs(Temp_Current);
- }
-
- tx_message.Data[0] = (unsigned char)((Temp_Current>>8)&0xff);
- tx_message.Data[1] = (unsigned char)(Temp_Current&0xff);
- tx_message.Data[2] = 0x55;
- tx_message.Data[3] = 0x55;
- tx_message.Data[4] = (unsigned char)((Temp_Position>>24)&0xff);
- tx_message.Data[5] = (unsigned char)((Temp_Position>>16)&0xff);
- tx_message.Data[6] = (unsigned char)((Temp_Position>>8)&0xff);
- tx_message.Data[7] = (unsigned char)(Temp_Position&0xff);
-
- can_tx_success_flag = 0;
- CAN_Transmit(CAN1,&tx_message);
-
- CAN_Time_Out = 0;
- while(can_tx_success_flag == 0)
- {
- CAN_Delay_Us(1);
- CAN_Time_Out++;
- if(CAN_Time_Out>100)
- {
- break;
- }
- }
- }
- /****************************************************************************************
- 电流速度位置模式下的数据指令
- Group 取值范围 0-7
- Number 取值范围 0-15,其中Number==0时,为广播发送
- temp_current的取值范围如下:
- 0 ~ +32767,单位mA
- temp_velocity的取值范围如下:
- 0 ~ +32767,单位RPM
- temp_position的取值范围如下:
- -2147483648~+2147483647,单位qc
- *****************************************************************************************/
- void CAN_RoboModule_DRV_Current_Velocity_Position_Mode(unsigned char Group,unsigned char Number,short Temp_Current,short Temp_Velocity,long Temp_Position)
- {
- unsigned short can_id = 0x009;
- CanTxMsg tx_message;
-
- tx_message.IDE = CAN_ID_STD; //标准帧
- tx_message.RTR = CAN_RTR_DATA; //数据帧
- tx_message.DLC = 0x08; //帧长度为8
-
- if((Group<=7)&&(Number<=15))
- {
- can_id |= Group<<8;
- can_id |= Number<<4;
- }
- else
- {
- return;
- }
-
- tx_message.StdId = can_id; //帧ID为传入参数的CAN_ID
-
- if(Temp_Current < 0)
- {
- Temp_Current = abs(Temp_Current);
- }
-
- if(Temp_Velocity < 0)
- {
- Temp_Velocity = abs(Temp_Velocity);
- }
-
- tx_message.Data[0] = (unsigned char)((Temp_Current>>8)&0xff);
- tx_message.Data[1] = (unsigned char)(Temp_Current&0xff);
- tx_message.Data[2] = (unsigned char)((Temp_Velocity>>8)&0xff);
- tx_message.Data[3] = (unsigned char)(Temp_Velocity&0xff);
- tx_message.Data[4] = (unsigned char)((Temp_Position>>24)&0xff);
- tx_message.Data[5] = (unsigned char)((Temp_Position>>16)&0xff);
- tx_message.Data[6] = (unsigned char)((Temp_Position>>8)&0xff);
- tx_message.Data[7] = (unsigned char)(Temp_Position&0xff);
-
- can_tx_success_flag = 0;
- CAN_Transmit(CAN1,&tx_message);
-
- CAN_Time_Out = 0;
- while(can_tx_success_flag == 0)
- {
- CAN_Delay_Us(1);
- CAN_Time_Out++;
- if(CAN_Time_Out>100)
- {
- break;
- }
- }
- }
- /****************************************************************************************
- 配置指令
- Temp_Time1的取值范围: 0 ~ 255,为0时候,为关闭电流速度位置反馈功能
- Temp_Time2的取值范围: 0 ~ 255,为0时候,为关闭限位信号反馈功能
- *****************************************************************************************/
- void CAN_RoboModule_DRV_Config(unsigned char Group,unsigned char Number,unsigned char Temp_Time1,unsigned char Temp_Time2)
- {
- unsigned short can_id = 0x00A;
- CanTxMsg tx_message;
-
- tx_message.IDE = CAN_ID_STD; //标准帧
- tx_message.RTR = CAN_RTR_DATA; //数据帧
- tx_message.DLC = 0x08; //帧长度为8
-
- if((Group<=7)&&(Number<=15))
- {
- can_id |= Group<<8;
- can_id |= Number<<4;
- }
- else
- {
- return;
- }
-
- tx_message.StdId = can_id;
-
- tx_message.Data[0] = Temp_Time1;
- tx_message.Data[1] = Temp_Time2;
- tx_message.Data[2] = 0x55;
- tx_message.Data[3] = 0x55;
- tx_message.Data[4] = 0x55;
- tx_message.Data[5] = 0x55;
- tx_message.Data[6] = 0x55;
- tx_message.Data[7] = 0x55;
-
- can_tx_success_flag = 0;
- CAN_Transmit(CAN1,&tx_message);
-
- CAN_Time_Out = 0;
- while(can_tx_success_flag == 0)
- {
- CAN_Delay_Us(1);
- CAN_Time_Out++;
- if(CAN_Time_Out>100)
- {
- break;
- }
- }
- }
- /****************************************************************************************
- 在线检测
- *****************************************************************************************/
- void CAN_RoboModule_DRV_Online_Check(unsigned char Group,unsigned char Number)
- {
- unsigned short can_id = 0x00F;
- CanTxMsg tx_message;
-
- tx_message.IDE = CAN_ID_STD; //标准帧
- tx_message.RTR = CAN_RTR_DATA; //数据帧
- tx_message.DLC = 0x08; //帧长度为8
-
- if((Group<=7)&&(Number<=15))
- {
- can_id |= Group<<8;
- can_id |= Number<<4;
- }
- else
- {
- return;
- }
-
- tx_message.StdId = can_id; //帧ID为传入参数的CAN_ID
-
- tx_message.Data[0] = 0x55;
- tx_message.Data[1] = 0x55;
- tx_message.Data[2] = 0x55;
- tx_message.Data[3] = 0x55;
- tx_message.Data[4] = 0x55;
- tx_message.Data[5] = 0x55;
- tx_message.Data[6] = 0x55;
- tx_message.Data[7] = 0x55;
-
- can_tx_success_flag = 0;
- CAN_Transmit(CAN1,&tx_message);
-
- CAN_Time_Out = 0;
- while(can_tx_success_flag == 0)
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
可旋转自行车停车程序.rar
(383.08 KB, 下载次数: 33)
|