找回密码
 立即注册

QQ登录

只需一步,快速开始

12
返回列表 发新帖回复
打印 上一主题 下一主题
开启左侧

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

  [复制链接]
11#
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循环就不是毫秒的等待了,而是秒级的。
不知道分析的对不对?

回复 支持 反对

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

14#
xiaoxiao2013 发表于 2015-9-24 10:46:26 | 显示全部楼层
Angus 发表于 2015-9-15 12:32
有否向芯唐寻求技术支持? 有人做的效果很好。

有,没有解决的方法
回复 支持 反对

使用道具 举报

15#
xiaoxiao2013 发表于 2015-9-24 15:25:07 | 显示全部楼层
Angus 发表于 2015-9-24 14:36
你遇到了什么问题? 只是起转不好? 你的原理图是什么样的?
即然有人做的很好,你也可以做得很好。 ...

软件硬件都是新唐的,只能自己改了
回复 支持 反对

使用道具 举报

16#
xiaoxiao2013 发表于 2017-5-5 14:12:51 | 显示全部楼层
这么久了还有新人在玩这个代码
回复 支持 反对

使用道具 举报

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

本版积分规则

新唐MCU