STM32F103ZET6通过CAN通信红外遥控伺服/谐波电机简介

 

一、STM32F103ZET6单片机简介

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

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

  1. 核心: 基于ARM Cortex-M3内核,工作频率最高可达到72MHz,具有较强的运算能力和低功耗设计。

  2. 存储器: STM32F103ZET6具有128KB Flash程序存储器和64KB SRAM数据存储器,可以满足大多数应用的存储需求。

  3. 外设接口: 该单片机提供了多种外设接口,包括多个串行通信接口(USART、SPI、I2C等),通用定时器/计数器,模拟数字转换器(ADC),PWM输出等,方便与其他设备进行通信和连接。

  4. 电源管理: 单片机提供了多种低功耗模式,可根据需求调整功耗,延长电池寿命或节能。

  5. 安全性: 针对数据安全和系统安全,该单片机提供了硬件加密引擎和支持代码执行保护的存储器,以保护关键数据和系统免受未授权访问。

  6. 开发工具支持: 意法半导体提供了丰富的开发工具和软件支持,包括STM32Cube软件包、集成开发环境(IDE)以及例程、驱动程序等,加速产品开发和调试过程。

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

二、CAN通信简介

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

CAN通信具有以下特点:

  1. 总线拓扑结构:CAN采用总线拓扑结构,所有节点通过同一根总线连接。这种结构简化了系统布线,降低了成本。

  2. 高可靠性:CAN具备高度的抗干扰能力和容错性。它使用差分信号传输方式,能有效抵抗噪声和干扰。

  3. 实时性:CAN通信速率可以达到1Mbps,在实时性要求较高的应用中表现出色。它使用非冲突的优先级识别机制,确保关键消息的及时传输。

  4. 多主机通信:CAN支持多主机系统,多个节点可以同时发送数据。这种结构下,每个节点根据优先级进行数据传输,避免了冲突。

  5. 灵活性: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,电机停止转动。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玖天星辰变

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值