一、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,电机停止转动。
好文推荐
发表评论