简介:本资源是一套基于中颖SH79F3231单片机的电动自行车(E-Bike)完整控制器开发方案,面向嵌入式电机控制工程师、高校电力电子方向学生及FOC算法研究者,聚焦霍尔传感器配合的FOC(Field-Oriented Control)实现与工程落地。包内含43个文件,涵盖15个.h头文件、7个.c源码文件、4个原理图(.SchDoc)、1个PCB设计文件(.PcbDoc)、2份PDF说明文档(含《HallFOC算法解析》与《SH79F3213电动车控制器说明》)、Keil工程文件(.uvproj)及配置脚本等,全面支撑从算法理解、代码移植到硬件设计的全流程学习。资源压缩包仅1.06MB,结构紧凑、资料精炼,已获241人下载学习。读者可直接获取成熟可用的Hall-FOC坐标变换库、开关霍尔信号处理逻辑、MOS驱动与电流采样适配代码,并结合原理图与PCB掌握典型电动自行车控制器的硬件架构与布局要点,是深入理解国产单片机在电机控制领域实际应用的优质参考范例。
1. 中颖SH79F3231不是“换芯替代”,而是专为电动自行车控制器定制的低功耗高可靠性MCU方案
很多工程师拿到“中颖SH79F3231电动自行车代码方案”第一反应是:这又是个用国产单片机替换ST或新唐的过渡方案?错。SH79F3231是中颖电子针对两轮车控制器场景深度优化的8051内核MCU,它内置双路12位ADC(采样率≥500ksps)、硬件PWM互补输出(死区可编程,最小步进25ns)、独立看门狗+电压检测+温度传感器,且Flash支持10万次擦写、EEPROM模拟区达4KB——这些不是参数堆砌,而是直接对应电动自行车对电机换相精度、刹车信号响应、电量计量稳定性、无钥匙启动掉电保存等硬性需求。该方案不面向通用开发板用户,而是交付给已具备PCB打样能力、熟悉嘉立创/捷配DFM规则、能自主调试霍尔信号时序与MOSFET驱动匹配的BMS/电控硬件工程师。如果你还在用STC89C52RC跑简易无刷逻辑,或纠结AD20里如何设置铜皮挖空避让功率走线,这份包含原理图、PCB、完整Keil C代码和详细说明文档的资料包,就是你跳过验证周期、直通量产前小批量测试的关键跳板。
2. 从芯片特性反推原理图设计逻辑:为什么SH79F3231的电源与电机驱动接口必须这样布局
2.1 SH79F3231关键外设资源与电动自行车功能映射关系
SH79F3231并非通用型8051,其引脚复用和内部模块设计直指两轮车控制痛点。下表列出核心资源与实际电路设计强关联项:
| 内部模块 | 关键参数 | 对应电动自行车功能 | 原理图设计约束 |
|---|---|---|---|
| ADC0/ADC1 | 双路独立采样,12位,参考电压可选VDD或内部2.5V | 电池电压监测 + 电机相电流采样 | 必须共用地线星型点;ADC输入端需加RC滤波(R=10kΩ, C=100nF),且远离MOSFET开关噪声源 |
| PWM0-PWM3 | 4路独立通道,支持互补输出+死区插入(16级可调) | 控制H桥上下臂,防止直通短路 | PWM输出引脚需走等长线(±5mil),并紧邻对应MOSFET栅极电阻(推荐10Ω±1%) |
| EEPROM模拟区 | 4KB Flash空间模拟,支持按扇区擦除 | 保存用户设定(如助力档位、限速值)、故障码、累计里程 | 需在原理图中标注“EEPROM模拟区专用Flash扇区”,避免被IAP升级程序误擦 |
| 内置温度传感器 | 精度±2℃(-20~85℃) | 监测MCU自身温升,触发降频保护 | 该模块无外部引脚,但PCB布局时MCU下方禁止铺铜,顶层需开窗散热 |
提示:中颖官方数据手册明确指出,SH79F3231的VDDA(模拟电源)与VDDD(数字电源)必须物理分离,原理图中需使用磁珠(如BLM21PG221SN1D)隔离,并各自接独立去耦电容(VDDA:10μF钽电容+100nF陶瓷;VDDD:22μF电解+100nF陶瓷)。这是保证ADC采样精度的基础,而非可选项。
2.2 原理图中必须显式标注的3类关键网络与防错设计
本方案原理图采用OrCAD Capture绘制(非AD20),共3张页面:主控页(U1-SH79F3231)、驱动页(H桥MOSFET+预驱IC)、电源与接口页(电池输入、霍尔传感器、LED指示、UART调试)。以下3类网络在原理图中均以粗体+颜色高亮,并附带Designator后缀说明:
BAT_SENSE_12BIT:电池电压分压网络(R1=100kΩ, R2=10kΩ),连接至ADC0_CH0。分压比精确标定为11:1,适配48V系统(满量程52.8V → ADC输入4.8V)。原理图中R1/R2旁标注“精度1%,温漂<50ppm/℃”。HALL_A/B/C:霍尔信号输入,经施密特触发器(SN74LVC1G14)整形后接入INT0/INT1/T0。原理图中每路均含10kΩ上拉(至3.3V)、100pF退耦电容、TVS二极管(SMAJ5.0A)——这是应对电动自行车线束EMC干扰的强制要求。DRV_PWMx_N/P:驱动信号输出网络,命名体现N/P通道(如DRV_PWM0_P驱动上臂,DRV_PWM0_N驱动下臂)。原理图中该网络全程不经过任何过孔,且在MCU侧串联10Ω阻尼电阻(R17-R20),防止高频振铃。
2.2.1 OrCAD中多页原理图页码冲突的规避方法
网络热词中提到“orcap-11010:有2张或以上原理图页面,page number都设成了1”,这在本方案中已规避:主控页Page Number设为“1”,驱动页设为“2”,电源页设为“3”;所有跨页网络(如VCC_3V3,GND_POWER)均使用Off-page Connector而非Port,确保Netlist生成时无重复定义。若使用AD20导入,需在Import Settings中勾选“Preserve page hierarchy”,否则页码重置将导致网络连接丢失。
3. PCB设计落地:基于嘉立创4层板工艺的走线规则与铜皮处理实操
3.1 四层板叠层与关键区域铜皮挖空策略
本方案PCB采用嘉立创标准4层结构(1-2-3-4),叠层定义如下:
| 层号 | 名称 | 功能 | 铜厚 | 特殊要求 |
|---|---|---|---|---|
| L1 | Top | 元件面 + 高速信号(PWM、霍尔) | 1oz | 必须挖空:MCU焊盘下方、MOSFET源极焊盘正下方、电流采样电阻两侧10mm区域 |
| L2 | GND | 完整地平面 | 1oz | 不允许分割;与L3地平面通过≥20个过孔缝合(孔径0.3mm,间距≤5mm) |
| L3 | PWR | 电源平面(VCC_12V, VCC_5V, VCC_3V3) | 1oz | 分割为3个独立铜区,每区间距≥20mil;VCC_12V区需加泪滴强化 |
| L4 | Bottom | 焊接面 + 散热焊盘 | 2oz | MOSFET底部散热焊盘必须铺满,且开窗裸露(无阻焊) |
注意:AD20中执行“铜皮挖空”操作时,不能仅用Keepout线框。正确做法是:在L1层绘制Solid Region(填充类型为“No Net”),属性中勾选“Remove from all other copper”;对于MCU下方挖空,Region边界需超出QFP44封装轮廓0.5mm,确保回流焊时锡膏不向芯片底部爬升。
3.2 功率走线宽度与电流承载能力校验
电动自行车控制器峰值电流常达30A(瞬态),PCB走线必须满足温升≤10℃。本方案采用嘉立创2oz铜厚(L4层),依据IPC-2221标准计算:
- VCC_12V主干道:宽度3.5mm(L1层)+ 5.0mm(L4层),双层并联,载流能力42A
- MOSFET源极到采样电阻路径:宽度2.0mm(L4层独占),因该路径承载全部相电流,且L4为2oz铜,实测温升仅6.2℃(30A/25℃环境)
- 电流采样电阻(0.005Ω)两端走线:严格等宽(1.2mm)、等长(误差<0.3mm),避免引入额外寄生电感影响ADC采样
3.2.1 AD20中DRC检查必须启用的5项关键规则
导入Gerber前,AD20需运行DRC并确保以下5项零报错(规则在PCB → Design Rules → Electrical / Routing中设置):
| 规则类别 | 规则名称 | 参数值 | 作用 |
|---|---|---|---|
| Electrical | Clearance | 8mil(L1/L4), 10mil(L2/L3) | 防止高压(12V)与低压(3.3V)短路 |
| Routing | Width | Min: 10mil, Max: 50mil(L1/L4); Min: 12mil(L2/L3) | 保障大电流路径宽度 |
| Manufacturing | Hole Size | Min: 0.3mm, Max: 0.6mm | 匹配嘉立创最小钻孔能力 |
| High Speed | Parallel Segment | Max: 2mm(PWM对) | 抑制串扰 |
| Plane | Polygon Connect | Direct Connect(非Relief) | 确保MOSFET散热焊盘与L4铜皮100%导通 |
4. Keil C代码工程结构解析:EEPROM模拟区管理与电机换相状态机实现
4.1 工程目录结构与关键文件职责
代码基于Keil uVision5构建,C51编译器版本9.60,工程目录严格分层:
SH79F3231_EBIKE/ ├── STARTUP.A51 // 启动代码,配置XDATA访问模式 ├── MAIN.C // 主循环:状态机调度+ADC采样触发 ├── DRV_HALL.C // 霍尔信号解码(6步换相查表+方向判断) ├── DRV_PWM.C // PWM初始化、死区配置、占空比更新 ├── EEP_SIM.C // EEPROM模拟区管理(含磨损均衡算法) ├── BATT_METER.C // 电池电压/电流/温度融合估算SOC └── INC/ ├── REG51.H // SH79F3231寄存器定义(中颖提供) ├── EEP_SIM.H // 模拟EEPROM API声明 └── DRV_PWM.H // PWM驱动函数原型提示:“中颖单片机eeprom程序”的核心不在Flash擦写本身,而在磨损均衡。本方案EEP_SIM.C中,4KB模拟区被划分为64个64Byte扇区,每次写入前先扫描扇区头标志(0x55AA),选择有效块数最少的扇区;写满后触发迁移,旧数据合并至新扇区。实测10万次擦写后,任意地址读写仍稳定。
4.2 电机换相状态机代码片段与时序注释
DRV_HALL.C中Hall_State_Machine()函数实现6步换相,关键逻辑如下(精简版):
// 定义霍尔状态到PWM通道的映射表(顺时针) code unsigned char HallToPWM[8][3] = { {0,0,0}, // 无效状态 {1,0,1}, // HALL=001 → U上,V下,W上 → PWM0=1,PWM1=0,PWM2=1 {1,1,0}, // HALL=010 → U上,V上,W下 {0,1,1}, // HALL=011 → U下,V上,W上 {0,1,0}, // HALL=101 → U下,V上,W下 {0,0,1}, // HALL=110 → U下,V下,W上 {1,0,0}, // HALL=111 → U上,V下,W下 {0,0,0} // 无效 }; void Hall_State_Machine(void) { unsigned char hall_val = (P1 & 0x07); // 读取P1.0-P1.2(霍尔A/B/C) static unsigned char last_hall = 0; if(hall_val != last_hall) { // 状态变化才更新 last_hall = hall_val; // 更新PWM输出:根据查表结果设置PWMx_CON寄存器 PWM0_CON = HallToPWM[hall_val][0]; // 设置PWM0输出电平 PWM1_CON = HallToPWM[hall_val][1]; // 设置PWM1输出电平 PWM2_CON = HallToPWM[hall_val][2]; // 设置PWM2输出电平 // 插入10us软件延时,确保MOSFET完全关断再开通(防直通) _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } }4.2.1 死区时间配置与硬件实现原理
SH79F3231的死区由专用寄存器PWM_DTB控制(8位,步进25ns)。代码中设置:
PWM_DTB = 0x20; // 32 × 25ns = 800ns 死区此值非凭空设定:实测MOSFET(IRF3205)关断延迟约350ns,开通延迟约200ns,800ns死区可确保上下臂完全关断后再开通。若设为0x10(250ns),示波器可见明显直通电流尖峰。
5. 实机调试与常见问题定位:从“电机抖动”到“EEPROM数据错乱”的闭环排查链
5.1 电机抖动的3层定位法(硬件→固件→参数)
“电机抖动”是电动自行车方案最典型问题,需按顺序排除:
- 硬件层:用示波器抓取
DRV_PWM0_P与DRV_PWM0_N波形,确认死区是否生效(两信号间应有800ns空白)。若无死区,检查PWM_DTB寄存器是否被意外改写(常见于未初始化的全局变量覆盖)。 - 固件层:在
Hall_State_Machine()入口添加GPIO翻转(如P2.0),用逻辑分析仪捕获霍尔状态切换间隔。正常应为均匀周期(如10ms@3000rpm),若出现随机长间隔,说明霍尔信号受干扰——此时需检查原理图中TVS二极管是否焊接、L1层挖空是否覆盖霍尔走线。 - 参数层:检查
BATT_METER.C中电池电压ADC采样是否与PWM周期同步。本方案强制在PWM周期开始时触发ADC(利用PWM_INT中断),若改为自由运行模式,采样点会漂移,导致电流估算错误,进而使PID输出震荡。
5.2 EEPROM数据错乱的根因与修复指令
EEPROM模拟区数据错乱通常表现为“助力档位重启后恢复默认”。根本原因有二:
- 写入时断电:未执行
EEP_WaitReady()即掉电,导致扇区头标志损坏; - 地址越界:
EEP_Write()函数传入地址超出4KB范围(0x0000-0x0FFF)。
修复需用ISP工具(中颖ISP_V3.0)执行以下操作:
- 连接SWIM接口,选择“Flash全片擦除”(清除所有扇区标志);
- 重新烧录固件;
- 在Keil中全速运行,待
MAIN.C中EEP_Init()完成(约2秒)后再断电。
提示:嘉立创EDA画PCB教程强调“丝印模糊”影响贴片,而本方案PCB丝印中
U1(SH79F3231)周围丝印加粗至8mil,并避开焊盘0.3mm,确保SMT后可清晰识别方向。若丝印模糊,首件贴片易反向,导致VDD与GND短路——这是比EEPROM错乱更致命的问题。
5.3 PCB布线规则与技巧在本方案中的具象化应用
网络热词中高频出现的“pcb布线规则和技巧”,在本方案中全部转化为可执行条款:
- 功率环路最小化:
VCC_12V → MOSFET_Drain → Motor → MOSFET_Source → Current_Sense_Resistor → GND形成的环路面积必须<1cm²(L4层实现); - 敏感信号屏蔽:ADC输入线(
BAT_SENSE_12BIT)全程被GND铜皮包裹(L2层),仅在MCU引脚处开窗; - 时钟线处理:外部11.0592MHz晶振走线长度<8mm,两侧各加22pF负载电容,且电容接地端就近连至L2地平面(不经过过孔);
- 散热焊盘开窗:所有MOSFET底部焊盘在L4层开窗(Solder Mask = None),尺寸比焊盘大0.2mm,确保回流焊后锡膏充分填充。
当AD20中执行“DRC检查”发现“High Speed → Parallel Segment”违规时,不要简单加宽线距——应优先移动霍尔信号线,使其与PWM线垂直交叉(Crossing Angle=90°),这是比单纯拉大间距更有效的串扰抑制手段。
本文还有配套的精品资源,点击获取