基于stm32-CAN控制伺服電機程序
0.png (11.83 KB, 下載次數: 35)
下載附件
2018-9-29 23:13 上傳
單片機源程序如下:
- #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)
2018-9-29 23:13 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|