
无刷电机驱动方案兼容霍尔有感和无感无霍尔8051内核STC8H1kPCB资料资料包括立创EDA工程文件包括原理图和PCB。 Keil有感无感驱动程序。 注意不是实物是资料。 STC官网只有一个例程无刷电机这玩意儿玩过的都懂搞驱动就跟拆盲盒似的。今天聊的这个STC8H1K方案有点意思8051内核老当益壮关键能通吃霍尔有感和无感模式。直接上干货先说硬件怎么玩。无刷电机驱动方案兼容霍尔有感和无感无霍尔8051内核STC8H1kPCB资料资料包括立创EDA工程文件包括原理图和PCB。 Keil有感无感驱动程序。 注意不是实物是资料。 STC官网只有一个例程立创EDA的工程文件里藏着玄机电机驱动部分的PCB布局用了三明治结构——顶层走信号线中间层整块铺铜当地线底层功率管和电源线直接怼上2oz铜厚。原理图里有个骚操作HALL接口和反电动势检测共用引脚靠这两个零欧电阻跳线切换模式R12、R13不焊就是无感模式。// GPIO初始化骚操作 P3M0 ~0x38; // P35-P37准双向 P3M1 | 0x38; // 开启内部上拉这段配置把霍尔传感器的三个输入口设成了准双向带内部上拉实测发现STC的内部上拉比外接电阻更抗干扰。驱动代码里最核心的是这个状态机void BLDC_Phase_Switch(uint8_t pattern) { PWMA_CCER1 (pattern 0x07) 4; // PWM通道使能骚操作 PWMA_CCMR1 (pattern 3) 0x33; // 互补输出配置 }六个MOS管的PWM信号用位操作直接梭哈比库函数快一倍不止。有感模式下的霍尔中断才是真刺激注意这个volatile用得讲究volatile __idata uint8_t HALL_History; // 必须用idata加速访问 void HALL_ISR() __interrupt 9 { HALL_History (HALL_History 3) | (P3 0x38); PWMA_CNT 0; // 同步PWM计数器 EX2 1; // 允许下次中断 }用移位寄存器存最近三次霍尔状态防抖算法直接省了。无感模式的反电动势检测更骚ADC采样时机卡在PWM关闭期间void ADC_Init() { ADC_CONTR 0x80; // 开启ADC电源 P1ASF 0x38; // P15-P17模拟功能 CLK_DIV | 0x20; // 降频到系统时钟/8 } uint16_t Get_BEMF(uint8_t ch) { ADC_CONTR 0x80 | ch; while(!(ADC_CONTR 0x20)); // 等待转换完成 return ADC_RES 8 | ADC_RESL; }注意CLK_DIV那个骚操作ADC时钟太快了采样会飘。工程文件里Keil项目已经配好了两种模式的编译开关改个宏定义就能切换#define SENSORLESS_MODE 0 // 0:霍尔模式 1:无感模式 #if SENSORLESS_MODE #pragma message(当前为无感模式) #include bldc_sensorless.c #else #pragma message(当前为霍尔模式) #include bldc_hall.c #endifPCB设计有个坑得提醒电机电源地和信号地之间用磁珠连接的话PWM死区时间得适当加大不然MOS管容易发热。工程里给的参数是300ns死区实测能扛住2A电流。最后吐槽下STC官网的例程就一个光秃秃的方波驱动咱们这个方案好歹把启动算法优化了——三段式启动里加入了电流闭环看这串代码void Startup_Sequence() { // 强制定位阶段 for(uint8_t i0; i6; i){ Set_Phase(i); delay_ms(5); if(Get_Current() 500) break; // 电流超过0.5A停 } // 加速阶段 while(1){ PWM_Duty 5; if(Sync_Check()) break; // 同步检测 delay_comm_time(); } // 切闭环运行 g_run_mode RUNNING; }这个启动策略实测能在0.5秒内带起云台电机比官网例程靠谱多了。资料包里还有电机参数自整定脚本用串口发个指令就能自动测出电感、反电动势系数这里就不展开讲了。总之这套方案算是把STC8H的老骨头榨出汁了玩无刷的新手可以当个参考模板。