# 逐飞科技基于沁恒CH32V307的双电机BLDC开源项目
**Repository Path**: daniel-xing/CH32V307_BLDC_Project
## Basic Information
- **Project Name**: 逐飞科技基于沁恒CH32V307的双电机BLDC开源项目
- **Description**: 逐飞科技精心设计了基于沁恒的双电机无刷驱动参考方案,该方案使用CH32V307,此单片机具有内置运放,无需外加运放。电机为内转子、500Kv、电压为12V。开源项目具有的功能,目前支持电机正反转、内部速度闭环、支持刹车、支持堵转保护。
- **Primary Language**: C
- **License**: GPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 11
- **Created**: 2025-06-27
- **Last Updated**: 2025-06-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 逐飞科技基于沁恒CH32V307的双电机BLDC开源项目
## 一、简介

逐飞科技作为沁恒微电子大学计划官方合作伙伴,针对第十八届智能汽车竞赛单车越野组的BLDC应用需求,为参赛选手们精心设计了符合赛事需求的CH32V307双电机BLDC驱动开源方案供大家参考,该方案使用CH32V307VCT6,此单片机具有4个运放,无需外加运放与比较器。无刷电机为有感、外转子、电压为12V。开源项目目前已实现电机正反转、内部速度闭环、支持刹车、支持电机加速度可调、支持硬件级堵转保护。
## 二、逐飞科技基于CH32V307的智能车双电机BLDC开源项目
### 2.1、无刷电机原理简介
在讲解本开源项目之前,还需要再简单科普一下无刷电机的原理,下面我们以三槽两极内转子电机进行讲解。
图1是无刷电机的基本模型示意,电机内部有三个线圈,每个线圈的一端都连接起来,另外一端引出到外部,中间有一个具有N/S两极的永磁铁内转子。

图1
如果我们按照一定的顺序给电机通电,转子就可以旋转起来。我们举例几种给电的情况来进行简单分析和模拟:
a.给A通正电压,B通负电压。
A相产生的磁场会吸引转子的S极,B相线圈产生的磁场会吸引转子的N极,转子会转到向左倾斜的位置,如下图2所示。(其中每一相产生的磁场我们需要使用右手螺旋定则判断磁场的南极与北极)

图2
b. 给A通正电压,C通负电压。
A相产生的磁场会吸引转子的S极,C相线圈产生的磁场会吸引转子的N极,转子会转到水平位置,如下图3所示。

图3
c. 给B通正电压,C通负电压。
B相产生的磁场会吸引转子的S极,C相线圈产生的磁场会吸引转子的N极,转子会转到向右倾斜的位置,如下图4所示。

图4
d.给B通正电压,A通负电压。
B相产生的磁场会吸引转子的S极,A相线圈产生的磁场会吸引转子的N极,转子会转到向左倾斜的位置和a种情况类似但转子的南北极相反,如下图5所示。

图5
根据前四次的举例,我们可以得出第5、第6次也可以依次类推。
最终我们总结一下每次换相之后转子到达的位置,转动一圈需要换相6次,每次换相角度为60度,如下图6所示

图6
以上就是我们控制无刷电机转动的基本原理了,但是要真正的实现无刷电机的驱动,我们还缺少一个最重要的东西,就是如何知道转子已经到达预定位置,因为我们只有知道了转子到达了预定位置之后才能进行换相,这样电机才能顺滑的运转。转子位置检测常用的有三种方式。
方式一:通过过零检测,三相相电压与电机中性点电压进行比较,比较器输出的三路信号就类似于霍尔的三路信号一样。过零检测的优点在于电机与驱动连接的线较少,但是缺点在于启动的时候需要开环启动,会导致低速的时候控制效果差,并且硬件电路会更加复杂。当然也有其他办法使得在无感的方式下低速控制效果也不错,但是会大大增加软件上的复杂程度。
方式二:通过安装霍尔检测转子位置,一共安装三个霍尔分别间隔120度安装,霍尔输出的波形如下图7所示(使用逻辑分析仪采集到的波形),每当波形改变的时候就需要进行换相。优点是电路结构简单,缺点是成本会稍微高一点点。

图7
方式三:加装磁编码器直接检测转子具体的位置。这种方式成本会高很多。
我们推荐选择方式二,采用霍尔检测转子的位置信息,驱动电路硬件会稍微简单一点,成本上也并未增加太多。我们推荐的有感无刷电机就是采用这种方式,使用这种电机,还可以节省下有刷电机闭环使用到的编码器,算下来反而更实惠。这一种方式可以得到转子位置信息,我们就可以通过位置信息来编写程序进行换相,然后就可以驱动无刷电机转动了。
### 2.2、逐飞CH32V307双电机BLDC驱动开源项目的电机控制芯片选型
本次单车越野组使用沁恒微电子的CH32V307VCT6驱动无刷电机。
这款单片机特点如下:
1.使用高性能的 RISC-V为内核的 32 位微控制器。
2.最高工作频率可达 144MHz。
3.通用定时器4 个、基本定时器2个、针对电机控制的 PWM 高级定时器4 个。
4.UART 接口8 个、I2C 接口2 个、SPI 接口3 个。
5.针对无刷电机应用内置 4 个运放
以下几个具有特点的功能介绍下。
PWM高级定时器1/8/9/10:
该芯片的TIMER1、TIMER8、TIMER9和TIMER10定时器,可以直接输出三路PWM信号或者是三路互补的PWM信号,当是互补的PWM信号时可以设置死区,无刷电机的三个半桥通过我们有三种驱动方式,方式一上桥给PWM信号下桥通过IO控制开启与关闭。方式二上桥通过IO控制开启与关闭下桥给PWM信号。方式三上下桥都给PWM信号(逐飞本次开源项目即使用的这种方式),但是需要注意的是上下桥的PWM信号必须是互补的,因为上下桥不能同时导通,否则出现电源与地短路的情况,由于MOS开关具有延时,所以互补PWM信号还必须设置死区,作用是当其中一个桥关闭之后要延时一段时间再打开另外一个桥,避免出现电源对地短路的情况。插入死区之后的互补PWM信号如下图8所示(使用逻辑分析仪采集到的波形)。

图8
单片机集成比较器:
该芯片内置四个运算放大器,其中每一个运算放大器都可以当做比较器使用,如果采用六步方波无传感器的方式驱动无刷电机,那么势必会用到过零检测来判断何时进行换相,内置了比较器也为无传感器控制无刷电机带来了更多的便捷。在使用霍尔有感的方式我们也可以使用比较器来实现自动(这里的自动表示无需代码干预即可实现)堵转保护等功能。
单片机集成运放:
该芯片内置了四个运放,可以用于电流检测,有助于实现磁场定向控制(FOC),或者检测线路电流从而判断是否堵转等故障出现,然后及时关闭控制避免硬件出现损坏。内置运放进一步简化了电路降低了制作的难度。
### 2.3、逐飞CH32V307双电机 BLDC驱动开源项目的MOS和预驱选型
由于单片机内部已经集成了运放、因此外围器件选择主要就集中在了MOS管型号和预驱型号的选择上,MOS管我们选择的型号是TPH1R403NL,这款MOS电流高达150A,10V的时候内阻低至1.2毫欧,开启电压低至2.5V左右,性价比较高。预驱的型号我们选择的型号是FD6288,它是一款集成了三个独立半桥栅极驱动芯片,可高压、高速驱动MOSFET,内置欠压保护、直通防止功能,具有体积小,价格低等优点。
所以用它加上MOS和预驱就简单的构成了无刷电机驱动硬件方案,如下图9、10所示:

图9

图10
这里的图如果看不清楚不要紧,原理图的PDF文件会放到开源资料里的。
### 2.4、逐飞CH32V307双电机 BLDC驱动开源项目的代码部分
#### 2.4.1、开源项目的工程目录结构
逐飞CH32V307双电机BLDC开源项目的目录结构如下图11所示。

图11
bldc_config文件夹下存放的是无刷的一些配置文件。
bldc_hardware文件夹下放置的是驱动无刷电机一些必要的单片机片内外设模块,例如GPIO、ADC、UART、
PWM输入捕获、高级定时器1、运放、比较器。
bldc_software文件夹下放置的是pid,电机控制,滑动滤波代码。
user_c文件夹下放置的是main.c、isr.c文件。
user_h文件夹下放置的是isr.h文件。
seekfree_libraries文件夹下放置的是逐飞科技精心编写的底层驱动,底层驱动是用沁恒微电子提供的`CH32V307`的`SDK`进行二次封装,以简化各个模块的使用步骤,使用更加方便。同时也方便熟悉seekfree开源库的同学进行代码的修改。
#### 2.4.2、无刷电机驱动需要用到的单片机外设

无刷电机需要用到的单片机片内外设有:
ADC:主要用于检测电源电压、采集放大时候的母线电流。
比较器:使用运放当做比较器,主要用于实现自动堵转保护,当母线电流超过设定值的时候,自动关闭高级定时器输出。
GPIO:主要用于LED指示灯,用于显示各种状态。
运放:主要用于放大采样电阻的电压信号,然后用于计算母线。
PWM输入:使用通用定时器的输入捕获实现,对外部PWM信号的周期以及占空比获取。
高级定时器:主要用于输出三路PWM信号以及接受刹车信号。
普通定时器:主要用于检测霍尔的值、换相时间计算、转速计算。
通用定时器:主要用于产生周期信号,进行PI闭环计算,用于控制电机的速度。
UART:主要用于发送电机信息到虚拟示波器,便于查看电机运行情况。
#### 2.4.3、无刷电机驱动文件

motor文件主要用于电机占空比输出、速度计算、速度和方向信息输出。
move_filter文件主要用于,对数据进行滑动平均滤波。
pid文件主要用于对转速进行速度PID闭环。
virtual_oscilloscope文件主要是用于传输数据到虚拟示波器上。
#### 2.4.4、主函数及中断函数说明
主函数与中断的文件存放在user文件夹中,无刷电机大部分代码都是在中断内运行的,中断相关的函数全部放在了isr.c中。
### 2.5、逐飞CH32V307双电机BLDC驱动开源项目的程序工作流程讲解
为了更清楚的表达起工作流程,整个项目的软件流程绘制了几张流程图,同时也加以文字说明。
#### 2.5.1、主函数流程图

主函数主要的作用是初始化各种外设以及一些软件资源,然后在主循环中持续的发送电机信息到虚拟示波器,便于观察电机运行情况。
#### 2.5.2、霍尔定时器中断流程图


霍尔定时器中断是无刷电机的核心中断,霍尔接口所使用的定时器通道1作为触发中断。在中断内主要是获取读取当前霍尔值,滑动滤波,进行速度计算,计算下一次霍尔的期望值,进行电机换向。换向超时处理。
读取本次换相所用时间,主要是统计每次换相的时间。当电机正常运行的时候将每次换相的时间都进行滑动滤波,当得到最近6次的换相时间之后,我们就能知道电机转动一圈所花费的时间,从而就能够计算出电机的转速了。
如果换相时间过长,则会触发霍尔接口所使用的定时器通道3中断,认为出现故障此时应该及时关闭输出。
#### 2.5.3、PIT周期定时器流程图

定时器6中断频率为1KHz,主要用于根据获得的占空比设置电机速度,然后计算速度曲线,用于实现电机缓慢加速(此功能可关闭),缓慢加速降低电机加速时功率,在调试阶段可以尽量保护车模以及硬件电路。然后进行PI闭环调节,这里主要实现是将我们采集到的电机速度与设置的电机速度求差,将得到的偏差*系数KP得到比例输出Pout,然后对偏差*系数KI并将每次计算出的结果进行求和得到Iout,最终将Pout与Iout相加,然后将相加之后的和输出到占空比寄存器驱动电机运转。其中KP、KI系数可能需要自己在多多调试,以找到更加完美的参数,使得电机运行更加迅速且稳定。
#### 2.5.4、PWM信号输入定时器中断流程图


该定时器中断主要作用是用来接收外部PWM信号的周期与高电平时间,然后计算信号的占空比,根据占空比的大小设置电机的转速,从而实现外部控制器来控制电机的转速。
逐飞会对本开源项目进行持续更新和维护,预计功能上还会继续添加速度环作为外环,电流环作为内环,这样可以不需要曲线计算即可实现电机缓慢加速的功能,通过内部电流环限定电流大小也能更好的保护硬件电路。当然,对这些功能有兴趣的同学可以自己提前研究尝试一下,讲真,这些东西搞明白之后,都足够你找一份相对不错的工作了。
## 三、基于沁恒CH32V307的双电机无刷驱动学习板使用简介
## 3.1、单车越野组无刷电机驱动逐飞学习板

上图中1-8号标号的含义如下:
1. 电源端口(不超过12V,建议使用3S电池)
2. 控制与信号输出端口,PWM引脚是速度调节端口,外部控制器输出1KHz频率的PWM,通过调节占空比大小来调节速度。DIR引脚是用于设置电机转动方向的。SPDOUT与DIROUT引脚是输出电机转速信息的,电机越快此引脚上输出的信号频率越高,推荐使用单片机采集编码器的接口进行信息采集。SPDOUT连接编码器采集接口的A通道或者连接单片机的计数通道,DIROUT连接编码器采集接口的B通道或者连接方向引脚(具体可以参考编码器采集例程)。
3. 调试接口,可以使用WCH-LINK对电机驱动上的单片机烧写程序以及在线调试。
4. 使能开关,开关是连接到IO上,通过软件实现的使能。
5. 无刷电机霍尔接口,连接无刷电机霍尔接口。
6. 连接无刷电机A相。
7. 连接无刷电机B相。
8. 连接无刷电机C相。
## 3.2、无刷电机推荐
第十八届智能汽车竞赛,由博思生产的N车模,原装飞轮和后轮都是无刷。刚好跟CH32V307双电机无刷驱动匹配。

飞轮无刷电机的参数如下:有感7对级,500KV值,堵转电流高达12A,支持2s-3s供电。

后轮无刷电机的参数如下:有感,7对级,堵转电流高达7.8A,支持1s-6s供电。
温馨提示:该驱动板成品仅供学习参考调试,不能直接将成品驱动使用在正式参赛的小车上,正式参赛的无刷电机驱动板需要同学们自行制作并按要求在铜层打上队伍信息。
# 四、全套无刷电机驱动方案的工作演示
以上开源项目经过逐飞的精心设计和代码编写,真实可靠,特别拍摄了一个演示车模视频,视频中通过我们控制N车模,进行性能测试以及模拟比赛,视频如下:
视频请通过“逐飞科技”微信公众号推文查看。
https://mp.weixin.qq.com/s/BE-FIqRKL9eL0QS0miTBLA
最后,当然是上开源项目gitee链接:
https://gitee.com/seekfree/CH32V307_BLDC_Project
打包下载开源库压缩包,就可以愉快的开始玩无刷啦,各位下载之前别忘了帮我们点一点小星星哦,感谢各位的支持。
特别说明:该开源项目仅用于各参赛同学在设计自己的小车时进行参考,硬件和软件都不能够直接拷贝使用在自己的作品中,请大家参考后重新完成硬件和软件的设计制作。
好了,本期的开源项目介绍就到这里了,推荐款无刷电机及无刷驱动学习板已上架逐飞淘宝店预售,感谢各位支持,你们的支持是我们开源的动力,如果能帮到大家,深感荣幸。时间紧张,水平有限,大神轻拍,如果开源项目中有任何BUG,欢迎留言反馈,逐飞会持续维护和完善,也可通过QQ群与我们进行交流讨论(单车越野组技术支持交流群--逐飞科技:300610841)。欢迎各位持续关注“逐飞科技”微信公众号,逐飞的开源项目及相关信息更新都会在该公众号上发布,点击下方通道即可关注。