基于stm32f103的HAL库CAN通信控制3508电机开环转动,以及Cube软件如何配置。

前言:本项目是用HAL库开发的,所以需要stm32CubeMX软件来进行配置

目录

首先打开CubeMX软件进行HAL库配置

代码编写及调试

首先打开CubeMX软件进行HAL库配置

 1.点击箭头所指按钮

2.搜索并选择STM32F103C8T6芯片,然后开始项目

3.在SYS选项中Debug改为Serial Wire 

 4.在RCC中两个选项改成和上述一致的选项

5.配置CAN

6.补一张时钟树图

 7.选择项目路径和编译软件,并生成。

代码编写及调试

CAN初始化

1.bsp_can.c

#include "bsp_can.h"

static CAN_TxHeaderTypeDef can_tx_message;
static CAN_TxHeaderTypeDef can_rx_message;

static uint8_t can_send_data[8];//发送的数据帧
static uint8_t can_receive_data[8];//接受的数据帧

extern CAN_HandleTypeDef hcan;

void can_filter_init(void)//屏蔽器
{

    CAN_FilterTypeDef can_filter_st;
    can_filter_st.FilterActivation = ENABLE;
    can_filter_st.FilterMode = CAN_FILTERMODE_IDMASK;
    can_filter_st.FilterScale = CAN_FILTERSCALE_32BIT;
    can_filter_st.FilterIdHigh = 0x0000;
    can_filter_st.FilterIdLow = 0x0000;
    can_filter_st.FilterMaskIdHigh = 0x0000;
    can_filter_st.FilterMaskIdLow = 0x0000;
    can_filter_st.FilterBank = 0;
    can_filter_st.FilterFIFOAssignment = CAN_RX_FIFO0;
    HAL_CAN_ConfigFilter(&hcan, &can_filter_st);
    HAL_CAN_Start(&hcan);
    HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING);

}

void can_cmd_send(int motor1,int motor2,int motor3,int motor4)//发送函数
{
	uint32_t send_mail_box;
	can_tx_message.StdId = 0x200;//ID
	can_tx_message.IDE = CAN_ID_STD;
	can_tx_message.RTR = CAN_RTR_DATA;
	can_tx_message.DLC = 0x08;

	can_send_data[0] = motor1 >> 8;
	can_send_data[1] = motor1;
	can_send_data[2] = motor2 >> 8;
	can_send_data[3] = motor2;
	can_send_data[4] = motor3 >> 8;
	can_send_data[5] = motor3;
	can_send_data[6] = motor4 >> 8;
	can_send_data[7] = motor4;

	HAL_CAN_AddTxMessage(&hcan,&can_tx_message,can_send_data,&send_mail_box);
}

void can_cmd_receive()//接收函数
{
	uint32_t receive_mail_box;
	can_rx_message.StdId = 0x200;//ID
	can_rx_message.IDE = CAN_ID_STD;
	can_rx_message.RTR = CAN_RTR_DATA;
	can_rx_message.DLC = 0x08;

}

2.bsp_can.h

#ifndef __BSP_CAN_H__
#define __BSP_CAN_H__

#ifdef __cplusplus

typedef struct { 
	uint16_t ecd; 
	int16_t speed_rpm; 
	int16_t given_current; 
	uint8_t temperate; 
	int16_t last_ecd; 
} motor_measure_t;

extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */



/* USER CODE BEGIN Private defines */

/* USER CODE END Private defines */
void can_filter_init(void);
void can_cmd_send(int motor1,int motor2,int motor3,int motor4);
/* USER CODE BEGIN Prototypes */

/* USER CODE END Prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __CAN_H__ */

 3.main.c主函数部分

int main(void)
{
  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_CAN_Init();
  can_filter_init();//配置接收过滤器,要求在while之前用

 int16_t torque = 1500;//定义电机扭矩-电流

  while (1)
  { 
	  can_cmd_send(torque,torque,torque,torque);
	}
}

以上是开环部分,电机速度会逐渐累加。

4.下面是用反复初始化写出的伪闭环

int main(void)
{
  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_CAN_Init();
  can_filter_init();//配置接收过滤器,要求在while之前用

 int16_t torque = 1500;//定义电机扭矩-电流

  while (1)
  {   HAL_CAN_Start(&hcan);
		HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING);
	  can_cmd_send(torque,torque,torque,torque);
	}
}

在while(1)中加入这两个语句,便可以让电机恒速转动,但不属于闭环,因为没有用PID算法。

给个免费的赞吧 Orz

  • 23
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
STM32F103系列是意法半导体公司推出的32位单片机系列,具有强大的功能和性能。HAL库是基于STM32Cube软件包的一种软件开发工具,提供了一系列的库函数,方便用户开发基于STM32F103系列的应用程序。 CAN(Controller Area Network)是一种通信协议,特别适用于多节点的实时通信系统。STM32F103系列的HAL库提供了丰富的CAN相关的函数和接口,方便用户在开发CAN通信应用时的使用。 使用HAL库的CAN功能,我们可以通过以下几个步骤来实现CAN通信: 1. 初始化CAN总线:通过调用CAN_Init函数,配置CAN总线的参数,如波特率、传输模式等。 2. 配置CAN过滤器:通过调用CAN_FilterConfig函数,设置CAN过滤器,用于过滤接收到的CAN帧。 3. 发送CAN帧:通过调用CAN_Transmit函数,可以将数据发送到CAN总线上。 4. 接收CAN帧:通过调用CAN_Receive函数,可以接收CAN总线上的数据。 5. 处理接收到的CAN帧:在CAN的接收中断中,可以调用相应的处理函数,对接收到的CAN帧进行处理。 通过这些函数和接口,我们可以很方便地在STM32F103系列的单片机上实现CAN通信功能。同时,HAL库还提供了其他一些函数,如CAN中断的使能和禁止、CAN通信中断的处理等,提高了开发效率和灵活性。 总之,STM32F103系列的HAL库提供了丰富的CAN库函数和接口,方便用户在开发CAN通信应用时的使用。通过使用这些函数和接口,我们可以轻松地在STM32F103单片机上实现CAN通信功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值