现在有单片机STM32f407IGT6,现在硬件设计上 设计了8路脉冲控制步进电机每路包括一个脉冲、一个使能、一个方向。
软件上使用HAL库,ucosiii操作系统,现在需要设计步进电机的控制功能和通信功能
功能一:可通过CAN通信进行电机控制,命令包括启动指定电机运行、停止指定电机运行,设置指定电机转速(实际是控制脉冲周期)、设置指定电机运行位置(实际是指定脉冲数)、指定电机持续运行,电机位置复位功能,启动电机按某个方向持续运行,启动电机按梯形运行、启动电机按s曲线启动运行。
位置复位功能说明:
有9个限位传感器,3个传感器一组可分配给一路电机用于位置判断,这三个传感器一个是最大位置传感器、一个最小位置传感器、零点位置传感器,零点位置在中间,位置复位,就是先让电机负向运行到最小位置,再正向运行到零点位置,完成复位。
AI润色后的功能需求说明
项目需求详细描述
1. 系统核心概述
- 主控芯片:STM32F407IGT6
- 软件框架:基于HAL库与µC/OS-III实时操作系统
- 控制对象 :8路步进电机驱动器,每路包含 脉冲(PUL)、方向(DIR)、使能(EN) 三个控制信号。
- 核心交互 :系统通过CAN总线接收上位机或主控节点的指令,解析并执行相应的电机控制任务。
2. 电机基本控制功能
系统需为每一路电机提供以下独立的底层控制能力:
- 启停控制:根据指令使能或禁用指定电机的驱动器。
- 方向控制:动态设置电机的旋转方向(正向/反向)。
- 脉冲生成:以可配置的频率(决定转速)和数量(决定位置)输出精准的脉冲序列。
3. 上层运动模式(通过CAN指令触发)
系统需支持以下高级运动模式,每种模式均可针对指定的一路或多路电机执行:
| 模式 | 指令与参数 | 功能描述 |
|---|---|---|
| 1. 定位运行 | 电机ID, 目标位置(脉冲数), 运行速度 | 电机以指定速度直接运行到绝对目标位置后停止。 |
| 2. 连续运行 | 电机ID, 运行方向, 运行速度 | 电机以指定速度和方向持续运行,直到收到停止指令或触发限位。 |
| 3. 梯形曲线运行 | 电机ID, 目标位置, 最大速度, 加速度, 减速度 | 电机运动包含加速、匀速、减速过程,实现平滑启停,运行至目标位置。 |
| 4. S形曲线运行 | 电机ID, 目标位置, 最大速度, 加加速度(冲击度) | 电机的加速度也是平滑变化的(通常为正弦或多项式曲线),实现更柔和的启停,运行至目标位置。 |
| 5. 紧急停止 | 电机ID | 立即停止指定电机的脉冲输出(急停减速或立即停止需明确)。 |
| 6. 速度控制 | 电机ID, 运行速度 | 动态修改指定电机在当前运行模式下的速度(脉冲频率)。 |
4. 位置复位与限位管理功能
- 硬件配置 :系统共有9个限位传感器,可灵活配置 为3组,每组包含:
- 负限位传感器:定义机械最小位置。
- 零点传感器:定义机械原点位置(位于负限位和正限位之间)。
- 正限位传感器:定义机械最大位置。
- 复位流程(归零) :当收到针对某路电机的"位置复位"指令时,执行以下自动序列 :
- 阶段一:寻找负限位
- 控制电机向负方向(朝向负限位)运动。
- 持续检测对应的负限位传感器信号。
- 一旦触发,立即停止电机。此时电机位于"机械最小位置"。
- 阶段二:寻找零点
- 控制电机向正方向(朝向零点)运动。
- 持续检测对应的零点传感器信号。
- 一旦触发,立即停止电机。
- 系统内部将该电机的位置计数器清零,完成复位。
- 阶段一:寻找负限位
- 限位保护 :在任何运动模式下,一旦触发负限位 或正限位 传感器,系统必须立即安全地停止该电机,并上报状态,以防止机械损坏。
5. CAN通信协议需求
- 指令集 :需定义一套完整的CAN报文格式(如使用CANopen DS402子协议或自定义协议),至少包含:
- 命令字:区分不同的功能(启动、停止、设置位置、设置速度、复位等)。
- 电机ID:指定目标电机(0-7)。
- 参数区:承载速度、位置、加速度等数据。
- 应答:系统应能向上位机发送执行状态、错误码(如限位触发、指令错误)、当前位置等反馈信息。
- 实时性:在µC/OS-III中,CAN中断接收到的指令应能快速唤醒相应的处理任务。
6. 软件设计关键点总结
- 任务划分 :建议创建独立的任务,如
CAN通信任务、电机管理任务、安全监控任务等。 - 资源抽象 :为每个电机设计一个控制结构体,包含其当前状态(使能、方向、速度、目标位置、当前位置、限位传感器分配、运动模式等)。
- 定时器资源 :STM32F407的高级定时器(TIM1, TIM8) 和通用定时器(TIM2-TIM5) 非常适合用于生成多路精密的PWM脉冲。需要合理分配8路脉冲对应的定时器通道。
- 中断与任务同步 :使用µC/OS-III的信号量、消息队列或事件标志组,在CAN中断、定时器中断(脉冲计数完成、限位触发)与任务之间进行高效同步。
- 运动曲线计算:梯形和S形曲线的速度规划(即根据时间计算当前速度脉冲频率)需要在每个控制周期内实时计算,这对CPU有一定要求,需优化算法。
7.通信协议说明
每次通信传输一帧CAN数据(8字节),每一帧上报给主机的数据构成为:第一个字节是上报码。接收主机命令的数据帧第一个字节为命令码。
(1)上报命令 上报电机状态 上报码 0x02
每帧数据8个字节 安排如下 通道数值为
|-------|--------|-------|-------|-------|-------|-------|-------|
| Byte0 | Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 |
| 上报码 | 电机是否运行 | 电机状态 | 电机编号 | 电机位置 ||||
| 0x02 | | | | 高字节 | | | 低字节 |
Byte0:上报码0x02
Byte1:一个bit代表一个电机,1运行中,0未运行。
Byte2:一个bit代表一个电机,1收到命令待运行,0没有运行命令。
Byte3:电机编号
Byte4-Byte7:电机当前位置int32类型
(2)主机命令电机复位命令 命令吗0x08
Byte0:命令码0x08
Byte1:电机编号
(3)电机运动命令 DLC3 命令吗0x09
此条暂时不用
(4)紧急停止全部电机 命令码0x0a
(5)运动到指定位置 命令码0x0B
Byte0:命令码0x0B
Byte1:电机编号
Byte2-Byte5:4字节构成一个int32,指定位置(脉冲数)
Byte6:
Byte7:
(6)设置上报数据延时 DLC3 命令码0x0E
(7)设置电机脉冲周期 DLC4 命令码0x28
Byte0:命令码0x28;
Byte1:电机编号;
Byte2、Byte3:组成uint16_t数据,表示脉冲周期us。
(8)连续运行
Byte0:命令码0x29;
Byte1:电机编号;
Byte2: 运行方向。
(9)梯形曲线运行
Byte0:命令码0x2A;
Byte1:电机编号;
Byte2-Byte5:4字节构成一个int32,指定位置(脉冲数)
(10)S形曲线运行
Byte0:命令码0x2B;
Byte1:电机编号;
Byte2-Byte5:4字节构成一个int32,指定位置(脉冲数)
(11)停止指定电机
Byte0:命令码0x2C;
Byte1:电机编号;
(12)上报电机状态 命令码0XFF
Byte0:命令码0XFF;
Byte1:时间间隔ms,当前设计为50ms;
Byte2-Byte5:4字节构成uint32 ,命令次数
收到立刻上报数据的命令后,经过延时时间再上报数据
主机固定周期发送一次刷新数据。命令中包含当前命令的次数,便于下位机计算上传时间间隔。对于一些不重要的数据可增加上传间隔。