标题:
stm32可旋转自行车停车源程序(CAN通讯、红外线)
[打印本页]
作者:
志在必得2018
时间:
2018-9-29 21:20
标题:
stm32可旋转自行车停车源程序(CAN通讯、红外线)
基于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
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1