feat: 初始化项目,添加电机控制、CAN通信、QT界面等模块
This commit is contained in:
105
motor_control/can_test.py
Normal file
105
motor_control/can_test.py
Normal file
@ -0,0 +1,105 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
'''
|
||||
# @Time : 2025/7/15 17:52
|
||||
# @Author : hx
|
||||
# @File : motor.py
|
||||
'''
|
||||
|
||||
import time
|
||||
|
||||
start_speed = 8
|
||||
stop_speed = 0
|
||||
|
||||
# 细分值映射表
|
||||
MICROSTEP_MAP = {
|
||||
2: 0x01,
|
||||
4: 0x02,
|
||||
8: 0x04,
|
||||
16: 0x10,
|
||||
32: 0x20
|
||||
}
|
||||
|
||||
def generate_speed_command(direction=1, microstep=32, speed=10):
|
||||
"""
|
||||
生成速度控制模式的 CAN 数据帧(7字节)
|
||||
:param direction: 0=逆时针,1=顺时针
|
||||
:param microstep: 细分值(2, 4, 8, 16, 32)
|
||||
:param speed: 速度值(Rad/s)
|
||||
:return: 7字节 CAN 数据帧
|
||||
"""
|
||||
control_mode = 0x01 # 速度控制模式
|
||||
direction_byte = 0x01 if direction == 1 else 0x00
|
||||
microstep_byte = MICROSTEP_MAP.get(microstep, 0x20)
|
||||
|
||||
raw_speed = int(speed * 10)
|
||||
speed_high = (raw_speed >> 8) & 0xFF
|
||||
speed_low = raw_speed & 0xFF
|
||||
|
||||
return [control_mode, direction_byte, microstep_byte, 0x00, 0x00, speed_high, speed_low]
|
||||
|
||||
|
||||
def generate_position_command(angle, speed=10, direction=1, microstep=32):
|
||||
"""
|
||||
生成位置控制模式的 CAN 数据帧(7字节)
|
||||
:param angle: 目标角度(度)
|
||||
:param speed: 速度值(Rad/s)
|
||||
:param direction: 0=逆时针,1=顺时针
|
||||
:param microstep: 细分值(2, 4, 8, 16, 32)
|
||||
:return: 7字节 CAN 数据帧
|
||||
"""
|
||||
control_mode = 0x02 # 位置控制模式
|
||||
direction_byte = 0x01 if direction == 1 else 0x00
|
||||
microstep_byte = MICROSTEP_MAP.get(microstep, 0x20)
|
||||
|
||||
raw_angle = int(angle * 10)
|
||||
pos_high = (raw_angle >> 8) & 0xFF
|
||||
pos_low = raw_angle & 0xFF
|
||||
|
||||
raw_speed = int(speed * 10)
|
||||
speed_high = (raw_speed >> 8) & 0xFF
|
||||
speed_low = raw_speed & 0xFF
|
||||
|
||||
return [control_mode, direction_byte, microstep_byte, pos_high, pos_low, speed_high, speed_low]
|
||||
|
||||
|
||||
def send_can_frame(data, can_id=0x01):
|
||||
"""
|
||||
模拟发送CAN帧(只打印,不实际发送)
|
||||
"""
|
||||
print(f"[发送CAN帧] ID={can_id:02X} 数据=[{', '.join(f'0x{x:02X}' for x in data)}]")
|
||||
|
||||
|
||||
def listen_and_respond():
|
||||
"""
|
||||
模拟监听并响应信号的逻辑
|
||||
"""
|
||||
try:
|
||||
print("[监听中] 等待信号...")
|
||||
|
||||
# 模拟收到信号后执行动作
|
||||
time.sleep(2)
|
||||
|
||||
# 示例:位置控制模式 - 顺时针转动 1000 度,速度 10Rad/s,32细分
|
||||
pos_data = generate_position_command(angle=1000, speed=10, direction=1, microstep=32)
|
||||
send_can_frame(pos_data, can_id=0x01)
|
||||
|
||||
time.sleep(2)
|
||||
|
||||
# 示例:速度控制模式 - 顺时针,速度 8Rad/s,32细分
|
||||
speed_data = generate_speed_command(direction=1, microstep=32, speed=8)
|
||||
send_can_frame(speed_data, can_id=0x01)
|
||||
|
||||
print("[已完成一次响应]")
|
||||
|
||||
except Exception as e:
|
||||
print(f"监听时发生错误: {e}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
# 示例:执行一次电机控制流程
|
||||
listen_and_respond()
|
||||
|
||||
except Exception as e:
|
||||
print(f"运行错误: {e}")
|
||||
Reference in New Issue
Block a user