欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
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.raoushi.com/bbs/)
Powered by Discuz! X3.1