找回密码
 立即注册

QQ登录

只需一步,快速开始

打印 上一主题 下一主题
开启左侧

26万转:用最短代码,转最快电机

  [复制链接]
31#
xiaoxiao2013 发表于 2015-4-16 11:07:34 | 只看该作者
本帖最后由 xiaoxiao2013 于 2015-4-16 11:53 编辑
Angus 发表于 2015-4-15 20:57
PPM的标准是 1000us表示Duty=0, 2000us 表示 Duty = 100%,  这个公式把 1000~2000间的数值, 变到大约 0~  ...

服了新唐,版本真多,我用的这个版本尽然是不正确的,重新在论坛里下载了一遍。
后面的理解了,只有1000这个数值没理解,不明白为什么是这个数值?
回复 支持 反对

使用道具 举报

32#
 楼主| Angus 发表于 2015-4-16 17:56:40 | 只看该作者
xiaoxiao2013 发表于 2015-4-16 10:13
还有些不懂,为什么是1000这个数值,是不是因为计数器时钟设置哪里不一样?另外,如果temp32=2000,最后 ...


航模PPM调速信号的标准是 1ms表示0占空比停转, 2ms 最快速度,  用us表示范围刚好是2000 - 1000 = 1000.
1000us 时让 Duty=0, 2000us时, 让Duty 不小于Duty的最大值就行, 大一点点没关系, 为了简化计算. 就用了除8,而没用除10
回复 支持 反对

使用道具 举报

33#
 楼主| Angus 发表于 2015-4-16 21:11:33 | 只看该作者
xiaoxiao2013 发表于 2015-4-16 11:07
服了新唐,版本真多,我用的这个版本尽然是不正确的,重新在论坛里下载了一遍。
后面的理解了,只有1000这 ...

我们在不断的修正着电路和代码,争取帮大家做出性能最好的 BLDC 控制器。
回复 支持 反对

使用道具 举报

34#
 楼主| Angus 发表于 2015-4-17 13:23:31 | 只看该作者
xiaoxiao2013 发表于 2015-4-17 10:12
Deadline_Zero = PeriodNow SR & AcmpOutBit){ ++StepCount; break; }           // up zero        
  ...

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

使用道具 举报

35#
xiaoxiao2013 发表于 2015-4-17 13:52:01 | 只看该作者
Angus 发表于 2015-4-17 13:23
是的, 启转后等待时间不长, 启转阶段等待时间长短不定.

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

使用道具 举报

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

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

使用道具 举报

37#
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循环就不是毫秒的等待了,而是秒级的。
不知道分析的对不对?

回复 支持 反对

使用道具 举报

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秒后才第二次中断,不会等到那个时候。


回复 支持 反对

使用道具 举报

39#
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值,很大。
回复 支持 反对

使用道具 举报

40#
 楼主| 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 ;  
检到过零或者超时后, 重新计算周期, 若超过最大值, 按最大值算.   
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU