找回密码
 立即注册

QQ登录

只需一步,快速开始

开启左侧

高速 BLDC 无霍尔转动 Mini5D 原代码

[复制链接]
xiaoxiao2013 发表于 2015-4-17 10:12:06 | 显示全部楼层
本帖最后由 xiaoxiao2013 于 2015-5-5 11:22 编辑
Angus 发表于 2015-4-16 21:11
我们在不断的修正着电路和代码,争取帮大家做出性能最好的 BLDC 控制器。 ...

,,,,,,,,,,,
回复 支持 反对

使用道具 举报

 楼主| Angus 发表于 2015-4-17 13:23:31 | 显示全部楼层
xiaoxiao2013 发表于 2015-4-17 10:12
Deadline_Zero = PeriodNow SR & AcmpOutBit){ ++StepCount; break; }           // up zero        
  ...

是的, 启转后等待时间不长, 启转阶段等待时间长短不定.
回复 支持 反对

使用道具 举报

xiaoxiao2013 发表于 2015-4-17 13:52:01 | 显示全部楼层
Angus 发表于 2015-4-17 13:23
是的, 启转后等待时间不长, 启转阶段等待时间长短不定.

启转阶段时间不确定,还有可能会定时器1又一次中断了,这个while内循环还没执行完?这样的话启动效果是不是不平滑?
回复 支持 反对

使用道具 举报

 楼主| Angus 发表于 2015-4-17 16:58:30 | 显示全部楼层
xiaoxiao2013 发表于 2015-4-17 13:52
启转阶段时间不确定,还有可能会定时器1又一次中断了,这个while内循环还没执行完?这样的话启动效果是不 ...

Deadline_Zero 最长也只有几十毫秒,  定时器1下次中断要 8.38 秒以后, 不会出现你说的情况.
回复 支持 反对

使用道具 举报

xiaoxiao2013 发表于 2015-4-17 18:09:44 | 显示全部楼层
Angus 发表于 2015-4-17 16:58
Deadline_Zero 最长也只有几十毫秒,  定时器1下次中断要 8.38 秒以后, 不会出现你说的情况.  ...

我还是觉得Deadline_Zero 不一定只有几十毫秒。
程序执行是这样的:初始化时,定时器1使能,开始计数,当符合启动条件时,执行一次  void BLDC_Start(int32_t Duty)  ,在函数里执行语句  TIMER1->CMPR   =  TIMER1->DR + 2000 ;  这时的定时器计数有可能到了8s时刻,此刻定时器1还未中断,程序继续执行,当计数到TIMER1->CMPR 时定时器1中断,此时的TIMER1->DR值有可能在8-8.88s之间,然后执行  PeriodLast = (TIMER1->DR - ZeroTick) & 0xFFFFFF ;
此时的PeriodLast 就非常大,下一次中断while循环就不是毫秒的等待了,而是秒级的。
不知道分析的对不对?

回复 支持 反对

使用道具 举报

xiaoxiao2013 发表于 2015-4-17 18:10:38 | 显示全部楼层
本帖最后由 xiaoxiao2013 于 2015-4-17 18:12 编辑
Angus 发表于 2015-4-17 16:58
Deadline_Zero 最长也只有几十毫秒,  定时器1下次中断要 8.38 秒以后, 不会出现你说的情况.  ...

网络不好,发重了

回复 支持 反对

使用道具 举报

 楼主| Angus 发表于 2015-4-17 18:31:01 | 显示全部楼层
本帖最后由 Angus 于 2015-4-17 19:05 编辑
xiaoxiao2013 发表于 2015-4-17 18:09
我还是觉得Deadline_Zero 不一定只有几十毫秒。
程序执行是这样的:初始化时,定时器1使能,开始计数,当 ...


1>,Timer0 计数到 CMPR 时回零,TIMER1 计数等于 CMPR 时不回零,发生中断。
2>,无论 TIMER1->DR 当前等于几,  写 TIMER1->CMPR = TIMER1->DR+2000;  Timer1 都一定是2000次计数后中断。
3>,如果上次执行完 Timer1 中断的时刻点是 ZeroTick,时间过PeriodNow/4 之后 Timer0 回零,Timer1 中断里检过零超时为Timer0计数到 PeriodNow*2,那么发生超时时,Periodlast=(TIMER1->DR - ZeroTick)&0xFFFFFF 的值为 PeriodNow 的2倍再加1/4倍。  

所以,每次 Timer1 中断后控制好 PeriodNow 最大值为几十毫秒,就不会有太长等待。若不改写CMPR,Timer1一个循环8.38秒后才第二次中断,不会等到那个时候。


回复 支持 反对

使用道具 举报

xiaoxiao2013 发表于 2015-4-20 09:38:37 | 显示全部楼层
Angus 发表于 2015-4-17 18:31
1>,Timer0 计数到 CMPR 时回零,TIMER1 计数等于 CMPR 时不回零,发生中断。
2>,无论 TIMER1->DR 当前 ...

你好,感谢你前面的回答。
3>,如果上次执行完 Timer1 中断的时刻点是 ZeroTick,时间过PeriodNow/4 之后 Timer0 回零,Timer1 中断里检过零超时为Timer0计数到 PeriodNow*2,那么发生超时时,Periodlast=(TIMER1->DR - ZeroTick)&0xFFFFFF 的值为 PeriodNow 的2倍再加1/4倍。  
我的疑问就是ZeroTick的初始值,这个初始值为0,当定时器第一次进入中断,而TIMER1->DR值在8-8.88s之间时,Periodlast=(TIMER1->DR - ZeroTick)&0xFFFFFF 此时Periodlast就等于TIMER1->DR值,很大。
回复 支持 反对

使用道具 举报

 楼主| Angus 发表于 2015-4-20 10:21:51 | 显示全部楼层
xiaoxiao2013 发表于 2015-4-20 09:38
你好,感谢你前面的回答。
3>,如果上次执行完 Timer1 中断的时刻点是 ZeroTick,时间过PeriodNow/4 之后 ...

过零检测超时不会等太久这个你明白了, 对吧?
再看这两句:
  PeriodNow  = (PeriodNow + PeriodLast)>>1 ;               
  if(PeriodNow > Period_Max) PeriodNow = Period_Max ;  
检到过零或者超时后, 重新计算周期, 若超过最大值, 按最大值算.   
回复 支持 反对

使用道具 举报

xiaoxiao2013 发表于 2015-4-20 11:18:20 | 显示全部楼层
Angus 发表于 2015-4-20 10:21
过零检测超时不会等太久这个你明白了, 对吧?
再看这两句:
  PeriodNow  = (PeriodNow + PeriodLast)>>1 ; ...

非常感谢,明白了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

新唐MCU