一、STM32F103ZET6单片机简介

STM32F103ZET6是意法半导体(STMicroelectronics)推出的一款基于ARM Cortex-M3内核的高性能32位单片机。它具有较强的计算能力和丰富的外设接口,适用于广泛的应用领域。

以下是该单片机的一些主要特性:

核心: 基于ARM Cortex-M3内核,工作频率最高可达到72MHz,具有较强的运算能力和低功耗设计。 存储器: STM32F103ZET6具有128KB Flash程序存储器和64KB SRAM数据存储器,可以满足大多数应用的存储需求。 外设接口: 该单片机提供了多种外设接口,包括多个串行通信接口(USART、SPI、I2C等),通用定时器/计数器,模拟数字转换器(ADC),PWM输出等,方便与其他设备进行通信和连接。 电源管理: 单片机提供了多种低功耗模式,可根据需求调整功耗,延长电池寿命或节能。 安全性: 针对数据安全和系统安全,该单片机提供了硬件加密引擎和支持代码执行保护的存储器,以保护关键数据和系统免受未授权访问。 开发工具支持: 意法半导体提供了丰富的开发工具和软件支持,包括STM32Cube软件包、集成开发环境(IDE)以及例程、驱动程序等,加速产品开发和调试过程。

STM32F103ZET6是一款功能强大的高性能单片机,适用于各种应用领域,如工业自动化、消费电子、通信设备等。它具有丰富的外设接口和灵活的低功耗模式,为开发者提供了更好的设计灵活性和资源管理能力。

二、CAN通信简介

CAN(Controller Area Network)是一种广泛应用于汽车和工业控制领域的串行通信协议。它由德国公司Bosch于1986年提出,并在1991年成为国际标准ISO 11898。

CAN通信具有以下特点:

总线拓扑结构:CAN采用总线拓扑结构,所有节点通过同一根总线连接。这种结构简化了系统布线,降低了成本。 高可靠性:CAN具备高度的抗干扰能力和容错性。它使用差分信号传输方式,能有效抵抗噪声和干扰。 实时性:CAN通信速率可以达到1Mbps,在实时性要求较高的应用中表现出色。它使用非冲突的优先级识别机制,确保关键消息的及时传输。 多主机通信:CAN支持多主机系统,多个节点可以同时发送数据。这种结构下,每个节点根据优先级进行数据传输,避免了冲突。 灵活性:CAN协议支持多种数据传输方式,如广播、单播和组播。它还提供了灵活的错误检测和纠正机制,从而增强了数据的可靠性。

在汽车领域,CAN通信广泛应用于车载网络,用于连接各种传感器、执行器和控制单元。通过CAN总线,这些设备可以相互通信,实现车辆的功能和性能控制。CAN通信是一种可靠、实时且灵活的串行通信协议,适用于需要高度可靠性和实时性的应用场景,特别是在汽车和工业控制领域得到广泛应用。

三、通过CAN通信控制电机代码架构

3.1首先选择有个已有工程,主要控制代码有can.c、main.c、romote.c,通过代码移植的方法工作量较小,例如选择正点原子的红外遥控试验工程的代码,在该工程中可以移植CAN通信试验中的代码到HRRDWARE文件夹中

 在can.c中can基础配置已完成,只需要根据电机的CAN通信指令说明进行控制指令选择,例如我使用的电机可采用速度闭环控制命令(0xA2)

 

在can.c中根据电机对应的速度控制指令,设置发送数据域定义,包括速度命令和停止命令。

u8 CAN1_ctl_speed(uint32_t id, int32_t val) //

{

CanTxMsg TxMessage;

u8 mbox;

u16 i=0;

//val=val*100;//8/1屏蔽

TxMessage.StdId=id; // 标准标识符

TxMessage.ExtId=id; // 设置扩展标示符

TxMessage.IDE=CAN_Id_Standard; // 标准帧

TxMessage.RTR=CAN_RTR_Data; // 数据帧

TxMessage.DLC=8; // 要发送的数据长度

can1_send_data[0] = 0xA2;//此处采用速度闭环控制命令(0xA2)

can1_send_data[1] = 0x00;

can1_send_data[2] = 0x00;

can1_send_data[3] = 0x00;

can1_send_data[4] = (uint8_t)(val);

can1_send_data[5] = (uint8_t)(val>>8);

can1_send_data[6] = (uint8_t)(val>>16);

can1_send_data[7] = (uint8_t)(val>>24);

for(i=0;i<8;i++)

TxMessage.Data[i]=can1_send_data[i];

mbox= CAN_Transmit(CAN1, &TxMessage);

while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++; //等待发送结束

if(i>=0XFFF)return 1;

return 0;

}

u8 CAN1_ctl_stop(uint32_t id, int32_t val) //

{

CanTxMsg TxMessage;

u8 mbox;

u16 i=0;

TxMessage.StdId=id; // 标准标识符

TxMessage.ExtId=id; // 设置扩展标示符

TxMessage.IDE=CAN_Id_Standard; // 标准帧

TxMessage.RTR=CAN_RTR_Data; // 数据帧

TxMessage.DLC=8; // 要发送的数据长度

can1_send_data[0] = 0x81;//电机停止命令

can1_send_data[1] = 0x00;

can1_send_data[2] = 0x00;

can1_send_data[3] = 0x00;

can1_send_data[4] = (uint8_t)(val);

can1_send_data[5] = (uint8_t)(val>>8);

can1_send_data[6] = (uint8_t)(val>>16);

can1_send_data[7] = (uint8_t)(val>>24);

for(i=0;i<8;i++)

TxMessage.Data[i]=can1_send_data[i];

mbox= CAN_Transmit(CAN1, &TxMessage);

while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++; //等待发送结束

if(i>=0XFFF)return 1;

return 0;

}

 主函数中,调用can.h文件,在红外遥控按键指令中,加入电机速度控制命令、停止命令,并设置转速参数。

key=Remote_Scan();

if(key)

{

LCD_ShowNum(86,130,key,3,16); //显示键值

LCD_ShowNum(86,150,RmtCnt,3,16); //显示按键次数

//根据按键值选择对应的符号并显示

switch(key)

{

case 0:str="ERROR";break;

case 162:str="POWER";break;

case 98:str="UP";break;

case 2:str="PLAY";break;

case 226:str="ALIENTEK";break;

case 194:str="RIGHT";break;

case 34:str="LEFT";break;

case 224:str="VOL-";break;

case 168:str="DOWN";break;

case 144:str="VOL+";break;

case 104:str="1";CAN1_ctl_speed(0x141,-3000);delay_ms(1000);break;

case 152:str="2";CAN1_ctl_speed(0x141,-4000);delay_ms(1000);break;

case 176:str="3";CAN1_ctl_speed(0x141,-5000);delay_ms(1000);break;

case 48:str="4";CAN1_ctl_speed(0x141,-6000);delay_ms(1000);break;

case 24:str="5";CAN1_ctl_speed(0x141,-70000);delay_ms(1000);break;

case 122:str="6";CAN1_ctl_speed(0x141,-8000);delay_ms(1000);break;

case 16:str="7";CAN1_ctl_speed(0x141,4000);delay_ms(1000);break;

case 56:str="8";CAN1_ctl_speed(0x141,5000);delay_ms(1000);break;

case 90:str="9";CAN1_ctl_speed(0x141,6000);delay_ms(1000);break;//

case 66:str="0";CAN1_ctl_stop(0x141,0);delay_ms(1000);break;//

case 82:str="DELETE";break;

}

//清除之前的符号显示,显示当前的符号

LCD_Fill(86,170,116+8*8,170+16,WHITE); //清楚之前的显示

LCD_ShowString(86,170,200,16,16,str); //显示SYMBOL

}else delay_ms(10);

t++;

if(t==20)

{

t=0;

//LED0=!LED0;

}

四、实验效果

编译代码运行正常后,烧录程序:

1.按红外遥控器按键1,LCD屏显示接收到信号1,并且电机转速-3000(+-号为电机转向,实际速度需要看电机减速比),其他按键同理。

2.按红外遥控器按键0,LCD屏显示接收到信号0,电机停止转动。

好文推荐

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: