標(biāo)題:
stm32可旋轉(zhuǎn)自行車停車源程序(CAN通訊、紅外線)
[打印本頁]
作者:
志在必得2018
時(shí)間:
2018-9-29 21:20
標(biāo)題:
stm32可旋轉(zhuǎn)自行車停車源程序(CAN通訊、紅外線)
基于stm32-CAN控制伺服電機(jī)程序
0.png
(11.83 KB, 下載次數(shù): 35)
下載附件
2018-9-29 23:13 上傳
單片機(jī)源程序如下:
#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); //剛開始要有足夠的延時(shí),確保驅(qū)動器已經(jīng)初始化完成
CAN_RoboModule_DRV_Reset(0,0); //對0組所有驅(qū)動器進(jìn)行復(fù)位
delay_ms(500); //發(fā)送復(fù)位指令后的延時(shí)必須要有,等待驅(qū)動器再次初始化完成
CAN_RoboModule_DRV_Config(0,1,100,0);
delay_ms(500); //1號驅(qū)動器配置為100ms傳回一次數(shù)據(jù)
CAN_RoboModule_DRV_Config(0,2,100,0);
delay_ms(500);
CAN_RoboModule_DRV_Mode_Choice(0,0,Position_Mode); //0組的所有驅(qū)動器 都進(jìn)入位置模式。
delay_ms(500); //發(fā)送模式選擇指令后,要等待驅(qū)動器進(jìn)入模式就緒。所以延時(shí)也不可以去掉。
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的通信,用戶所用開發(fā)板或者主控板,必須含有CAN收發(fā)器,本例程使用的CAN引腳為PA11 PA12。
4.主控芯片如有不同,請自行在工程上修改,CAN引腳如有不同,請自行在can.c文件上修改。
*/
復(fù)制代碼
#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的發(fā)送中斷函數(shù)
*************************************************************************/
void CAN1_TX_IRQHandler(void)
{
if (CAN_GetITStatus(CAN1,CAN_IT_TME)!= RESET)
{
CAN_ClearITPendingBit(CAN1,CAN_IT_TME);
can_tx_success_flag=1;
}
}
/****************************************************************************************
復(fù)位指令
Group 取值范圍 0-7
Number 取值范圍 0-15,其中Number==0時(shí),為廣播發(fā)送
*****************************************************************************************/
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; //標(biāo)準(zhǔn)幀
tx_message.RTR = CAN_RTR_DATA; //數(shù)據(jù)幀
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為傳入?yún)?shù)的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時(shí),為廣播發(fā)送
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; //標(biāo)準(zhǔn)幀
tx_message.RTR = CAN_RTR_DATA; //數(shù)據(jù)幀
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為傳入?yún)?shù)的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;
}
}
}
/****************************************************************************************
開環(huán)模式下的數(shù)據(jù)指令
Group 取值范圍 0-7
Number 取值范圍 0-15,其中Number==0時(shí),為廣播發(fā)送
temp_pwm的取值范圍如下:
0 ~ +5000,滿值5000,其中temp_pwm = ±5000時(shí),最大輸出電壓為電源電壓
*****************************************************************************************/
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; //標(biāo)準(zhǔn)幀
tx_message.RTR = CAN_RTR_DATA; //數(shù)據(jù)幀
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為傳入?yún)?shù)的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;
}
}
}
/****************************************************************************************
電流模式下的數(shù)據(jù)指令
Group 取值范圍 0-7
Number 取值范圍 0-15,其中Number==0時(shí),為廣播發(fā)送
temp_pwm的取值范圍如下:
0 ~ +5000,滿值5000,其中temp_pwm = 5000時(shí),最大輸出電壓為電源電壓
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; //標(biāo)準(zhǔn)幀
tx_message.RTR = CAN_RTR_DATA; //數(shù)據(jù)幀
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為傳入?yún)?shù)的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;
}
}
}
/****************************************************************************************
速度模式下的數(shù)據(jù)指令
Group 取值范圍 0-7
Number 取值范圍 0-15,其中Number==0時(shí),為廣播發(fā)送
temp_pwm的取值范圍如下:
0 ~ +5000,滿值5000,其中temp_pwm = 5000時(shí),最大輸出電壓為電源電壓
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; //標(biāo)準(zhǔn)幀
tx_message.RTR = CAN_RTR_DATA; //數(shù)據(jù)幀
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為傳入?yún)?shù)的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;
}
}
}
/****************************************************************************************
位置模式下的數(shù)據(jù)指令
Group 取值范圍 0-7
Number 取值范圍 0-15,其中Number==0時(shí),為廣播發(fā)送
temp_pwm的取值范圍如下:
0 ~ +5000,滿值5000,其中temp_pwm = 5000時(shí),最大輸出電壓為電源電壓
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; //標(biāo)準(zhǔn)幀
tx_message.RTR = CAN_RTR_DATA; //數(shù)據(jù)幀
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為傳入?yún)?shù)的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;
}
}
}
/****************************************************************************************
速度位置模式下的數(shù)據(jù)指令
Group 取值范圍 0-7
Number 取值范圍 0-15,其中Number==0時(shí),為廣播發(fā)送
temp_pwm的取值范圍如下:
0 ~ +5000,滿值5000,其中temp_pwm = 5000時(shí),最大輸出電壓為電源電壓
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; //標(biāo)準(zhǔn)幀
tx_message.RTR = CAN_RTR_DATA; //數(shù)據(jù)幀
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為傳入?yún)?shù)的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;
}
}
}
/****************************************************************************************
電流速度模式下的數(shù)據(jù)指令
Group 取值范圍 0-7
Number 取值范圍 0-15,其中Number==0時(shí),為廣播發(fā)送
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; //標(biāo)準(zhǔn)幀
tx_message.RTR = CAN_RTR_DATA; //數(shù)據(jù)幀
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為傳入?yún)?shù)的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;
}
}
}
/****************************************************************************************
電流位置模式下的數(shù)據(jù)指令
Group 取值范圍 0-7
Number 取值范圍 0-15,其中Number==0時(shí),為廣播發(fā)送
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; //標(biāo)準(zhǔn)幀
tx_message.RTR = CAN_RTR_DATA; //數(shù)據(jù)幀
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為傳入?yún)?shù)的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;
}
}
}
/****************************************************************************************
電流速度位置模式下的數(shù)據(jù)指令
Group 取值范圍 0-7
Number 取值范圍 0-15,其中Number==0時(shí),為廣播發(fā)送
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; //標(biāo)準(zhǔn)幀
tx_message.RTR = CAN_RTR_DATA; //數(shù)據(jù)幀
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為傳入?yún)?shù)的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時(shí)候,為關(guān)閉電流速度位置反饋功能
Temp_Time2的取值范圍: 0 ~ 255,為0時(shí)候,為關(guān)閉限位信號反饋功能
*****************************************************************************************/
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; //標(biāo)準(zhǔn)幀
tx_message.RTR = CAN_RTR_DATA; //數(shù)據(jù)幀
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; //標(biāo)準(zhǔn)幀
tx_message.RTR = CAN_RTR_DATA; //數(shù)據(jù)幀
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為傳入?yún)?shù)的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黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
可旋轉(zhuǎn)自行車停車程序.rar
(383.08 KB, 下載次數(shù): 33)
2018-9-29 23:13 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1