本帖最后由 Angus 于 2018-8-23 23:12 编辑
除了 顺利启转,PPM 调速之外,本代码还调试好了上电 PPM 校正,蜂鸣,3秒无 PPM 信号就降速等。
Timer1 连续定时模式,用于各种定时。
Timer0 周期模式,用于触发换相,只在 BLDC 转动时启动计数。
两个定时器计数频率都是 1MHz,溢出时间 16.777216 秒。
几个全局变量:
Duty_Command : 占空比命令,PPM 信号的占空比,或 UART 口、或旋钮的"实时占空比命令"。
Duty_Target : 目标占空比,决定转速,正常情况等于Duty_Command。欠压超温时比 Duty_Command 小, 甚至为0。
Duty_Current : 当前占空比,反复写入PWM 的 Duty寄存器,Duty_Target 增大时,这个变量一点点增大以防止过流。
Duty_Min : 最小占空比,目标占空比 Duty_Target 小于这个值,就停转。
电机启转时使能 Timer1 中断定时检过0。停转时关 Timer1 中断。是否使能 Timer1 中断可做为判断电机是否在转的标志。
启转:
若不超温不欠压,目标占空比 Duty_Tareget 大于 Duty_Min ,就启转 BLDC, 示例代码如下:
Duty_Current = Duty_Min ; // 起转占空比
PWM->CMR0 = Duty_Min ; Delayus(100); // 一个 PWM 周期后占空比更新
pPhaseEnd = &TabPhase[6] ; // 使用数组 TabPhase 转 BLDC
pPhase = &TabPhase[1] ; // 启转相
BLDC_Start(Period_Max, 500) ; // 启转 BLDC
BLDC_Start() 返回后,像刚执行完 Timer1 中断一样: 等下次 Timer1 发生中断检过0。详见"航模电调DIY——第2季"
BLDC 正在转动时需要做的事情:
BLDC 的检过0 换相由 Timer1 中断代码完成。中断外要做的,是:
1>,测电源电压,不能欠压。
2>,测温度,不能超温。
3>,测电流,不要过流。
4>,控制当前占空比 Duty_Current 按一定增速,接近目标占空比 Duty_Target。
1,2,3有一项出现意外,就减小目标占空比 Duty_Target 或让其值等 0。
停转 BLDC :
函数 BLDC_STOP() 里面,先关 Timer1 中断停止更新换相寄存器,再关六路功率管。一般满足以下条件 之一,才调用 BLDC_STOP() 停转 BLDC
1> 启转 N 步仍未成功,停转。一两秒后再判是否重启。
2> 占空比小于最小值 Duty_Min, 且转速较低
3> 其它需立即关功率管的情况
这些判断在函数 BLDC_Add_Duty() 里面。每次换相后(更新了换相周期)都要调用一下此函数,判 BLDC 是否太慢需停转 。
PPM 调速脉冲捕获:
Timer1 连续计数模式,适合做捕获定时器,但 Timer1 中断被检过零用了。PPM 信号的跳变,还会发生 GPIO 中断, 所以本代码是在 GPIO 中断里,处理捕获时间并计算 PPM 占空比,算出占空比命令 Duty_Command。
输出反相:
若由于功率管驱动电路的不同,需要对 PWM 输出极性反相,在函数 PWM_ACMP0_T0_T1_Init() 中打开极性反相语句即可。
稳速:
启转成功后,可由换相周期 PeriodNow 得到当前转速,调整占空比达到稳速目的。代码添加位置在函数 BLDC_Control() 中有注释。
改变 PWM 频率:
随时可改变 PWM 频率,方法见 main() 开头。BLDC 转动时改变PWM频率,要同时改变占空比的值 CMR 。
高压 BLDC 控制过零电路分压比
用 PWM1 去控制分压比, A- 信号可改接到 P0.1 上。
除法:
M0 内核没有除法指令,C语句里的除法,Mini51 都会变成一个执行时间达十几微秒的子程序。本代码里,所有除法运算都用 "乘法 + 移位" 代替。
短路保护和电流控制:
Mini51 的 Brake 功能可由中断或比较器输出驱动,电流超过某个值时,硬件先关功率管,再发生中断。
航模一般不测电流,Brake 配置打了双斜杠。
代码下载:http://www.nuvoton-mcu.com/forum.php?mod=viewthread&tid=1819&extra=page%3D1
|