电机驱动板原理介绍参考链接小米电机一代拆解及使用_小米电机拆解-CSDN博客BuildIts in Progress: Mini Cheetah Clone Teardown小米铁蛋电机代码开源_哔哩哔哩_bilibilifanmyu/小米铁蛋一代主控芯片GD32F303RET6GD32F303RET6-MCU选择器-兆易创新 GigaDevice | 官方网站编码器方案电机端编码器AS5047磁编码器输出端编码器六个MT9105线性HALL传感器阵列搭配一个粘贴在输出端的条形磁铁输出类似开关的电压信号通过解析该信号获得大概的输出端绝对位置这里线性HALL传感器阵列的电路板电气上通过一个10PIN的接插件和主板相连HALL板和主板接插件序号1-10定义VCC (1 -- TP11) GND (3、5、7 -- TP23、TP18) HALL线序、测试点、传感器丝印、MCU引脚2 --TP12 -- U6 -- PA4 、4 -- TP13 -- U7 -- PA5、6 -- TP14 -- U8 -- PA6、8 -- TP15 -- U9 -- PA7、9 -- TP17 -- U11 -- PC5、10 -- TP16 -- U10 -- PC4可以看到在六个HALL芯片的的VCC和GND之间一共有两个二极管藏在HALL PCB的下面可能是TVS单向或双向用于抑制静电和浪涌或齐纳二极管用于过压保护或检测可以看到在磁编芯片的VCC和GND之间有个二极管可能是TVS单向或双向用于抑制静电和浪涌或齐纳二极管用于过压保护或检测同时发现线性HALL传感器阵列的电路板结构上通过三根支撑柱fix1、fix2、fix3和主板焊接相连可以用电烙铁加热拆下来建议拆的时候先慢慢掰开fix1、fix2两个点位等这两个点位差不多焊下来传感器阵列电路板可以微微左右晃动的时候再加热fix3点位将整块小板取下取下后如图工作原理示例这里我使用的是一个IIC通讯的AS5600磁编码器云台电机由于六个线性HALL在电路板背面都有对应的测试点2 --TP12 -- U6 -- PA4 、4 -- TP13 -- U7 -- PA5、6 -- TP14 -- U8 -- PA6、8 -- TP15 -- U9 -- PA7、9 -- TP17 -- U11 -- PC5、10 -- TP16 -- U10 -- PC4因此这里将线性HALL小板拆下来后随便选取两个测试点将对应IO口配置为软件IIC后使用软件IIC读取AS5600磁编码器角度驱动代码如下AS5600 驱动HAL库400K硬件IICDMA、1MHZ软件IIC_hal iicdma-CSDN博客AS5600驱动: 关于AS5600驱动以及软件IIC实现 - Gitee.com驱动电流采样DRV8323S 电机驱动芯片 40pinMOS管6个ST的STL140N6F760 V, 2.4 mΩ typ., 140 A这里和别人的拆解结果有点不同可能黑色电路板版本的MOS管和绿色电路板版本的不同驱动代码如下DRV8323/8353驱动_drv8323和drv8353驱动程序区别-CSDN博客电压采样电压采样是PC3引脚通过万用表测量ADC电压和母线电压大概得到ADC电压和母线电压的比例大概为116看参考代码里面是116.3但是不清楚怎么得出来的需要注意的是用ADC采样电压的时候ADC采样周期越长采到的电压值越大规则组最长ADC_SAMPLETIME_239CYCLES_5时母线24VADC采集电压为1.5V同时如果设置规则组和注入组同时采集母线电压的话采到的母线电压也会偏小GD32F303 HAL库配置HAL库版本6.15.0启用FPU浮点计算单元用CubeMX玩转国产GD32F303 - 哔哩哔哩1生成工程2Keil中选择对应的GD32芯片型号3配置FPU参数在下述函数开头加入(*(volatile uint32_t *)(0xE000ED88)) | (15 20);4、消除报错编译发现有关于FPU的报错找到报错位置直接注释报错消失5、验证FPU是否启用发现程序的汇编中出现了VMUL.F32这个浮点指令且执行该指令后系统无异常运算结果也正确则说明FPU已成功启用启用DSP库1、添加先勾选DSP选项然后在下面图片中加入对应自己单片机内核的宏定义这里我是M4内核就是写入ARM_MATH_CM4;(其他还有宏ARM_MATH_CM7或ARM_MATH_CM3或ARM_MATH_CM0或ARM_MATH_CM0plus等)最后在相应c文件中引用 arm_math.h就可以使用dsp库中的所有函数如下2、发现报错参考下面两篇文章主要是第二篇发现仍然报错不过少一些了在keil中加入DSP库并且使用arm_math.h - 海滩长颈鹿 - 博客园在Keil中加入DSP库并使用arm_math.h_哔哩哔哩_bilibili最后灵机一动把编译器从keil5改为keil6的就没有出现DSP库相关的报错了在修改了一些由于编译器版本导致的报错后成功解决CAN初始失败解决GD32使用ST HAL库 CAN无法初始化问题_gd32无法初始化-CSDN博客使用HAL库的MX_CAN_Init();后调试发现进入error_handler()最后定位在下面这个地方初始化超时上网查阅后发现ST和GD的CAN外设实现的底层顺序不一样需要在while ((hcan-Instance-MSR CAN_MSR_INAK) 0U)前增加一句CLEAR_BIT(hcan-Instance-MCR,CAN_MCR_SLEEP);ADC DMA采样卡死解决解决使用adcdma采集数据“卡死”的情况_stm32 adc dma 卡死-CSDN博客调用HAL_ADC_Start_DMA(hadc1, (uint32_t*)ADC_ConvertedValue, 1);后卡死在DMA中断将规则组采样时间从ADC_SAMPLETIME_7CYCLES_5改为ADC_SAMPLETIME_239CYCLES_5;后解决如果还不行就取消开启ADC_DMA中断这个问题不止在GD芯片上存在实测ST的芯片上也会出现这个情况原因暂且不清楚通道4无法正常触发ADC中断解决由于ADC采样完成中断是由定时器1的通道4触发我的代码如下:先调用 HAL_TIM_PWM_Start( htim1, TIM_CHANNEL_4);再调用HAL_TIM_Base_Start_IT(htim1); // 启动定时器1中断然后再次调用HAL_TIM_PWM_Start( htim1, TIM_CHANNEL_4);就不能正常触发ADC采样完成中断但此时如果将HAL_TIM_PWM_Start( htim1, TIM_CHANNEL_4);换成HAL_TIM_PWM_Start( htim1, TIM_CHANNEL_1/2/3);就都可以正常触发同时将HAL_TIM_Base_Start_IT(htim1);前面的 HAL_TIM_PWM_Start( htim1, TIM_CHANNEL_4);删掉也可以正常触发了最终选择删掉一开始多余的HAL_TIM_PWM_Start( htim1, TIM_CHANNEL_4);main() { HAL_TIM_PWM_Start( htim1, TIM_CHANNEL_4); __HAL_TIM_CLEAR_FLAG( htim1, TIM_FLAG_BREAK); HAL_TIM_Base_Start_IT(htim1); // 启动定时器1中断 Offset_Current_Start(); } void Offset_Current_Start(void) { HAL_TIM_PWM_Stop( htim1, TIM_CHANNEL_1); HAL_TIM_PWM_Stop( htim1, TIM_CHANNEL_2); HAL_TIM_PWM_Stop( htim1, TIM_CHANNEL_3); MotorState.run_state RUNSTATE_CALIBRATING; HAL_TIM_PWM_Start( htim1, TIM_CHANNEL_4); HAL_ADCEx_InjectedStart_IT(hadc1); //开启FOC运行 HAL_ADCEx_InjectedStart(hadc2); HAL_Delay(200); }重刷固件一开始我用Jlink和驱动板的SWCLK、SWDIO、GND连接但是发现识别不到芯片于是又将Jlink的3.3V用于驱动板供电断开外部供电再次识别发现识别成功成功之后将自己的程序烧录进去后面只连接SWCLK、SWDIO、GND三根线也能识别了固件链接Baseline-K/xiaomi_cyberdog1 还有很多不完善的地方仅供参考