前言:本项目是用HAL库开发的,所以需要stm32CubeMX软件来进行配置
目录
首先打开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