# 4008_FOC_HID **Repository Path**: chen_zac/4008_FOC_HID ## Basic Information - **Project Name**: 4008_FOC_HID - **Description**: 一款STM32G431小电流一体式的FOC_HID学习套件 - **Primary Language**: C/C++ - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 21 - **Created**: 2023-05-04 - **Last Updated**: 2023-05-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README **求个START** ## 一. 硬件设计 **主控** : STM32G431CBT6 **稳压芯片**: AMS1117-3.3 **升压芯片**: MT3608(5V升压12V,最大电流支持2A) **电流采样芯片**: INV199A1DCKR(两相) **电机驱动芯片**: DRV8313 采用type-c接口供电以及进行usb通讯,2.54弯针接口进行ST-Link下载程序,另外提供了一个PH2.0-3接口(本人用来驱动ws2812),采用两层板设计。 pcb描述图-反面 pcb描述图-正面 整体图 ## 二. 软件设计 ##### (1).STM32平台软件设计 ###### 1. AS5600参数校准 通过IIC接口读取0x0F和0x0E两个寄存器,可以得到电机的机械角度,此时电机的零角度与AS5600读出的零角度可能不对应,需要进行校准。 将电机旋转到你预想0°的位置,设置foc角度为0°,可以将Ud设置大一点,然后上电,可以看到电机有个微小的偏移,此时读出AS5600的角度值X1,作为**机械角度零偏值**。然后将foc角度设置为90°,上电,再次读出AS5600的角度值X2,那么就可以确定电机的**极对数** = (360 / ((X2 -X1)*4))。电角度和机械角度的转换关系就可以确定下来了。 ###### 2. USB协议设计 与PC平台通讯将采用HID复合设备的显示,共两个接口。 第一个为自定义的HID,每个数据包为8bytes,用来进行数据交互。 第二个为HID键盘,配合电机可以发送一些对应的按键,例如: 暂停、切歌、调节音量等等。 ##### (2). QT平台软件设计 ###### 1. USB协议 采用开源库hidapi进行设计,通过PID和VID锁定设备,然后对接口0进行读写,接口1不管。 ###### 2. 串口协议 同样支持通过串口进行交互 ###### 2. OpenGL 电机模型 采用OpenGL库读取电机3D模式obj文件,然后将其显示在界面中,与电机旋转位置保持一致。 ##### (3). 通讯协议 一个数据包为8字节,首字节恒为0xef,尾字节恒为0xab,中间六个字节为有效数据部分。 ###### 1. 公共参数 上位机发送 | 功能码 | 参数码 | 数值4 | 数值3 | 数值2 | 数值1 | | :----: | :------------: | :-------: | :---------: | :---------: | :-------: | | 0x12 | 0x20(运行模式) | 0 | 0 | 0 | 模式 | | 0x12 | 0x2a(Uq) | float高位 | float低三位 | float低二位 | float低位 | | 0x12 | 0x2b(Ud) | float高位 | float低三位 | float低二位 | float低位 | | 0x12 | 0x2c(速度) | float高位 | float低三位 | float低二位 | float低位 | 上位机接收 | 功能码 | 参数码 | 数值4 | 数值3 | 数值2 | 数值1 | | :----: | :----------: | :-------: | :---------: | :---------: | :-------: | | 0x14 | 0x2a(Uq) | float高位 | float低三位 | float低二位 | float低位 | | 0x14 | 0x2b(Ud) | float高位 | float低三位 | float低二位 | float低位 | | 0x14 | 0x2c(速度) | float高位 | float低三位 | float低二位 | float低位 | | 0x14 | 0x2d(角度) | float高位 | float低三位 | float低二位 | float低位 | | 0x14 | 0x2e(Iq电流) | float高位 | float低三位 | float低二位 | float低位 | | 0x14 | 0x2f(Id电流) | float高位 | float低三位 | float低二位 | float低位 | ##### 2. 位置控制 上位机发送 | 功能码 | 参数码 | 数值4 | 数值3 | 数值2 | 数值1 | | :----: | :------------: | :-------: | :---------: | :---------: | :-------: | | 0x22 | 0x1a(设置角度) | 0 | 0 | 角度高8位 | 角度低8位 | | 0x22 | 0x1b(设置P) | float高位 | float低三位 | float低二位 | float低位 | | 0x22 | 0x1c(设置I) | float高位 | float低三位 | float低二位 | float低位 | | 0x22 | 0x1d(设置D) | float高位 | float低三位 | float低二位 | float低位 | 上位机接收 | 功能码 | 参数码 | 数值4 | 数值3 | 数值2 | 数值1 | | :----: | :---------: | :-------: | :---------: | :---------: | :-------: | | 0x24 | 0x1b(接收P) | float高位 | float低三位 | float低二位 | float低位 | | 0x24 | 0x1c(接收I) | float高位 | float低三位 | float低二位 | float低位 | | 0x24 | 0x1d(接收D) | float高位 | float低三位 | float低二位 | float低位 | ##### 3. 开环控制 上位机发送 | 功能码 | 参数码 | 数值4 | 数值3 | 数值2 | 数值1 | | :----: | :----------------: | :---: | :---: | :---: | :----------------------: | | 0x32 | 0x1a(设置运动方向) | 0 | 0 | 0 | 方向(0-顺时针,1-逆时针) |