牛卧堂MCU技术交流

标题: 航模电调 DIY —— 第3季,代码 [打印本页]

作者: Angus    时间: 2015-9-24 18:08
标题: 航模电调 DIY —— 第3季,代码
本帖最后由 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


作者: Angus    时间: 2015-10-10 12:52
本帖最后由 Angus 于 2015-12-4 09:10 编辑

电调 DIY, 分三个帖子,简单介绍了电调硬件和软件。本方案不仅启转快,而且适用于多种电机。

作者: 我爱下载    时间: 2016-3-7 13:32
相当好的介绍,准备研读一下代码
作者: 匿名    时间: 2018-7-12 14:16
謝謝大大提供資料
作者: soosqt    时间: 2018-7-21 14:25
代码下载不了啊
作者: admin    时间: 2018-7-26 16:16
soosqt 发表于 2018-7-21 14:25
代码下载不了啊

http://www.nuvoton-mcu.com/forum ... 1&extra=#pid144
试试这个
作者: 匿名    时间: 2018-8-1 18:09
代碼何處下載
作者: 匿名    时间: 2019-8-13 10:26
10万RPM/2对极BLDC。请高手帮忙(费用详谈)QQ:20931 87831




欢迎光临 牛卧堂MCU技术交流 (http://nuvoton-mcu.com/) Powered by Discuz! X3.2