- 打卡等级:以坛为家I
- 打卡总天数:341
- 最近打卡:2026-05-10 11:40:36
超级版主
- 积分
- 15917
|
发表于 2026-4-1 11:25:23
|
显示全部楼层
/************* 功能说明 **************
本程序试验使用STC8H1K28-LQFP32来驱动无传感器无刷三相直流电机.
关于无感三相无刷直流电机的原理, 用户自行学习了解, 本例不予说明.
PWM占空比最大值为1000。
用户可以在初始化程序里给定占空比用于上电就启动(比如水泵)。
本例支持串口发送字符0~5来调速,0为停止,1~5档对应PWM为200、400、600、800、1000,用户可以改为自己想要的调速方式。
启动时每走一步都返回一个字符,方便调试,程序调试好之后,可以将这些程序注释掉。
返回A:启动时未检测到电机转动,开始冷启动。
返回B:开始检测A相下降沿,用于顺风、逆风转动检测。
返回C:开始检测B相上升沿,用于顺风、逆风转动检测。
返回D:开始检测A相下降沿,用于顺风、逆风转动检测。
返回E:检测到逆风转动,开始刹车。
返回F:检测到顺风转动。
返回G:检测到顺风转动,但转速过低,开始刹车。
返回H:刹车时仍然检测到转动。
返回1:开始预定位。
返回2:预定位结束,开始SVPWM强拖启动。
返回3:SVPWM强拖启动结束,进入转动检测 或 直接进入闭环。
STC8H1K28-无感-串口调速-V5A1-SVPWM启动.c SVPWM启动,启动前先检测是否在转动,如果是顺风转动超过一定速度则直接切换到闭环驱动,否则转刹车。
如果是逆风转动则刹车。刹车后或检测到停止则开始初始定位、SVPWM强拖,再转为检测转动或直接进入闭环。
对于惯性较大的风扇类,建议启动后进入转动检测,这样会非常可靠。
******************************************/
#define FOSC 24000000UL //定义主时钟
/************* 电机参数设置宏说明 ************* */
#define DIRECT_RUN 1 // 0:强拖启动结束后,进入转动检测以确定电机已启动成功。1:强拖启动结束后直接进入闭环驱动。对于惯性较大的风扇类,建议启动后进入转动检测,这样会非常可靠。
#define CMP_DIFF_VOL 2 // 比较器迟滞输入选择: 0: 0mV, 1: 10mV, 2: 20mV, 3: 30mV, 迟滞电压越低 低速性能越好, 越高稳定性越好
#define CONTEMPRATY 1 // 1:使用互补PWM, 0:使用单端PWM。
#define MPP 4 // 电机磁极对, Magnetic Pole Pair,机械转速 = 电子转速 / 磁极对.
#define ROLL_MinSpeed 60 // 启动时检测到低于这个转速则认为电机停止。 要求ROLL_MinSpeed*MPP >=22 以免计算溢出。
#define PRE_STATE_TIME1 100 // 预定位时间1,ms, 最大值为2730ms。转动惯量越大,额定转速越低,第一个预定位时间就要越长。
#define PRE_STATE_TIME2 70 // 预定位时间2,ms, 最大值为2730ms。第二个预定位时间要比第一个段,相当于预启动,转过30度电角度。
#define PRE_STATE_TIME3 50 // 预定位时间3,ms, 最大值为2730ms。第三个预定位时间要比第一个段,相当于预启动,转过30度电角度。
#define START_PWM_DUTY 200 // 启动时的占空比。不同电机、不同电压需要的启动占空比不同,占空比小了,启动不起来,大了,启动电流较大。
#define BeginSpeed 60 // 启动起始转速,转/分。启动时从这个转速开始启动,根据电机特性而定,转动惯量越大,额定转速越低,起始转速就越低。
#define FinishSpeed 480 // 启动完成转速,转/分。启动到这个转速则完成启动,根据电机特性而定,转动惯量越大,额定转速越低,完成转速就越低。
#define D_StartTime 1000 // 加速时间,单位ms,最大5461ms,一般500~3000。根据电机特性而定,转动惯量越大,额定转速越低,则启动时间越长。
#define RollSpeedMin 300 // 闭环转速最小值(RPM),用于判断异常. 转速RPM = 60/(T*MPP), 电周期 T(us) = 60*10^6/(RPM*MPP), 要求(RPM*MPP) >= 611 以免计算溢出。
#define RollSpeedMax 4200 // 闭环转速最大值(RPM),用于判断异常. 转速RPM = 60/(T*MPP), 电周期 T(us) = 60*10^6/(RPM*MPP), 要求(RPM*MPP) >= 611 以免计算溢出。
#define PRE_PWM_DUTY (START_PWM_DUTY/2) // 开始启动PWM占空比, 根据电机特性适当改变
#define STOP_PWM_DUTY (START_PWM_DUTY/2) // 停机占空比,PWM小于此站波比就停机, 根据电机特性适当改变
#define RollPeriodMax (10000000UL/(RollSpeedMin *MPP)) // 闭环电转速周期/6(即换相周期) 最大值 T(us) = 60*10^6/(RPM*MPP)/6 = 10^7/(RPM*MPP)
#define RollPeriodMin (10000000UL/(RollSpeedMax *MPP)) // 闭环电转速周期/6(即换相周期) 最小值 T(us) = 60*10^6/(RPM*MPP)/6 = 10^7/(RPM*MPP)
更新程序:2026-4-1
三相无刷电机驱动-STC8H1K28-无感-LQFP32.rar
(178.12 KB, 下载次数: 9)
|
|