# 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),采用两层板设计。
## 二. 软件设计
##### (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-逆时针) |