牛卧堂MCU技术交流

标题: 26万转:用最短代码,转最快电机 [打印本页]

作者: Angus    时间: 2013-12-23 15:55
标题: 26万转:用最短代码,转最快电机
本帖最后由 Angus 于 2023-10-24 11:11 编辑

点击图片-->实际大小,可查看高清大图

Mini51ZDE 航模电调——启转快,转速高,最高电转速 30万转以上


下图已达到 25.7万转/分,周期0.7ms/3=0.2333ms,  频率1/0.2333 =4.286KHz


Mini52LDE 电动工具——轻重载起转都顺利


310V (220V的峰值)高压,PWM1 控制过零分压比,启转效果佳


48V BLDC 控制器, 启用 Brake 功能,转动时输出线短路,功率管也不会烧。


吸尘器转速到13万6千转的波形


顺风起转





可以极低转速,4转/秒




上臂做 PWM 的电机端电压波形, 适用于高压BLDC


下臂做 PWM 波形, 下臂开关速度快


上下臂轮流做 PWM 的电机端波形, 上下MOS发热均衡


电流很大,续流时间较长,只单边有斜坡了,无感模式,仍正常转动



代码逻辑清晰:代码分三部分
1>,ADC 中断: 负责读取各路ADC值,以及保证电流不过流。即使功率管关闭仍会每个PWM 周期做ADC 测量,其它不管。
2>,Timer1中断:只负责检过0、换相。电压电流是多少一律不管,即使功率管关闭仍会检过0按时换相。除非关了Timer1的中断,才会停止这些工作。
3>,主循环: 控制起停、调速(决定输出电压)、正反转、高低压保护,以及温度保护等
Mini52xDE_BLDC_Code_V23.zip (135.84 KB, 下载次数: 766)


Mini52 BLDC 代码简介.pdf

2 MB, 下载次数: 16528


作者: 陈飞宇    时间: 2013-12-26 13:37
貌似非常强大啊
作者: Angus    时间: 2014-5-9 14:05
本帖最后由 Angus 于 2014-5-30 15:35 编辑
xiaoxiao2013 发表于 2014-4-29 15:40
新唐采用AD检测过零点的BLDC方案例程序,速度响应很慢,不符合客户要求,请问留的有接口可以改吗?我看了看 ...


目前我们已推出采用比较器检测过零的方案,  硬件和以前的基本兼容。从启转到加100%加压, 不到半秒.  
作者: xiaoxiao2013    时间: 2014-5-13 15:32
Angus 发表于 2014-5-9 14:05
目前我们已推出采用比较器检测过零的方案,  从启转到加100%加压, 不到半秒.   ...

但是现在用了那个AD采样检测过零的方案,那个是不是不好?动态响应有什么方法可以改?就是速度变化很快到某个值,封装的太多,不好用啊
作者: Angus    时间: 2014-5-27 17:43
本帖最后由 Angus 于 2016-12-8 11:38 编辑
xiaoxiao2013 发表于 2014-4-29 15:40
新唐采用AD检测过零点的BLDC方案例程序,速度响应很慢,不符合客户要求,请问留的有接口可以改吗?我看了看 ...

电机工作电压是多少?
如果是15V以下,可直接使用软件包里的电路。
如果是15V~100V之间,改一下MOS驱动方式。
若是100V以上,改动较大,硬件软件都要改。
作者: w70770777    时间: 2014-9-16 15:42
LZ大大 “如果是300V的电机,由PWM4去控制分压比。” 这句话怎么理解 和 怎么具体操作  是不是线路板要改动?
作者: Angus    时间: 2014-9-16 18:09
w70770777 发表于 2014-9-16 15:42
LZ大大 “如果是300V的电机,由PWM4去控制分压比。” 这句话怎么理解 和 怎么具体操作  是不是线路板要改动 ...

300V分压到5V要衰减60倍,启转时,反电势较小,再衰减这么多,增加过零点检测难度,这时可以用一路PWM控制一个三极管调整分压比,启转时分压比降到1:5左右,转起来后,让三极管关断,分压比恢复至1:60。这部分要软硬件配合。  
作者: xiaoxiao2013    时间: 2014-9-17 11:40
本帖最后由 xiaoxiao2013 于 2014-9-17 11:42 编辑

《《《《新发布的水泵方案电路图中的Neutral point比较电压接到电路哪里?》》》
看出来了,没问题了

作者: Angus    时间: 2014-9-17 19:22
本帖最后由 Angus 于 2014-9-17 19:24 编辑

把 Mini51 的 ADC 配置成 300Ksps,一次ADC只需3us,在过零点附近只采样过零相,参考电压可在过零后再测供下次过零参考, 这样过零点时间误差就是一次 ADC 时间。优化一下代码,时间误差不超过5us。我们的 ADC 方案就是这么做的,所以速度才做到了20万转。

用三个电阻产生一个中点,ADC 采用差分式,做一次 ADC 就可知两相电压差了,深圳某专业电调公司就这么做的。

ADC做过零需要丰富的经验和高超的技巧,相比之下,比较器方式较简单,只要读一下比较器的输出值为0还是为1就可以了。我们现在已推出比较器方式做过零检测的方案,过零检测时间误差 1us,建议您采用我们的新方案。
作者: xiaoxiao2013    时间: 2014-9-18 14:44
本帖最后由 xiaoxiao2013 于 2015-9-15 10:11 编辑
Angus 发表于 2014-9-17 19:22
把 Mini51 的 ADC 配置成 300Ksps,一次ADC只需3us,在过零点附近只采样过零相,参考电压可在过零后再测供 ...

非常感谢你的解惑,理解了很多,还有一点不能确定,是不是这样:


作者: xiaoxiao2013    时间: 2014-9-19 12:06
Angus 发表于 2014-9-17 19:22
把 Mini51 的 ADC 配置成 300Ksps,一次ADC只需3us,在过零点附近只采样过零相,参考电压可在过零后再测供 ...

可能我问的太直接,楼主不方便回答,不好意思。
楼主可否方便说下AD采样过零方案中的pwm中断设置的是周期中断还是占空比中断呢?
作者: xiaoxiao2013    时间: 2014-9-23 13:27
Angus 发表于 2014-9-23 12:39
我们的 ADC 方案加了 RC 滤波, 所以没再区分ON还是OFF.也没使能PWM中断.

你说的方案可能与我说的那个不一样,你说的是电调用AD检测过零的方案,应该还有一个非电调的,也是用AD检测过零点。对于电调那个我看了下,不知道我对方案的评估对不对,希望指正:
1、电调方案中AD一直在运行,然后进入中断,感觉是在不断的执行AD程序,这样mcu处理其他的事件时间就很紧张了。
2、非电调那个方案中,应该有pwm中断吧?我看初始化打开了pwm中断啊。
作者: Angus    时间: 2014-9-23 17:31
xiaoxiao2013 发表于 2014-9-23 13:27
你说的方案可能与我说的那个不一样,你说的是电调用AD检测过零的方案,应该还有一个非电调的,也是用AD检 ...

方波控制BLDC一般无需打开PWM中断, 弦波方式控制电机要打开PWM中断, 不知您说的是哪个BLDC方案。
用ADC方式量产的客户,我们继续支持。BLDC新客户我们都推荐用新的ACMP的方案。
作者: fkepdcjgd    时间: 2014-11-4 13:44
fkepdcjgd 发表于 2014-11-4 13:42
不知你们是想卖芯片,还是想卖程序?

请相关人员做一个像stm32一样完备的库函数来配置各模块。
作者: fkepdcjgd    时间: 2014-11-4 13:51
fkepdcjgd 发表于 2014-11-4 13:44
请相关人员做一个像stm32一样完备的库函数来配置各模块。

我们用户要的程序是一个一个的单独模块华程序,是可以直接编译后,下载运行某一特定模块的功能的。比如定时,比较器,PWM,AD,还有输入捕获功能 ;不是要一大堆用写51程序的思想写出来的代码,这样的代码,地球人很难看懂,因为arm内核的寄存器太多,不比51核。
作者: fkepdcjgd    时间: 2014-11-4 13:56
我们不需要BLDC代码,我们要的是有三路以上的比较器,6路PWM,有定时器,有各模块的样代码和非常详细备注!
作者: Angus    时间: 2014-11-4 13:59
fkepdcjgd 发表于 2014-11-4 13:56
我们不需要BLDC代码,我们要的是有三路以上的比较器,6路PWM,有定时器,有各模块的样代码和非常详细备注! ...

若需要技术支持, 华南地区请与我们深圳公司联系, 北方客户请与上海公司联系. 谢谢
作者: xiaoxiao2013    时间: 2014-11-5 10:16
fkepdcjgd 发表于 2014-11-4 13:56
我们不需要BLDC代码,我们要的是有三路以上的比较器,6路PWM,有定时器,有各模块的样代码和非常详细备注! ...

代码其他需要的人会要。芯唐电机方案推广代码是需要的一部分,但还有另一重要部分是应用文档,芯唐缺乏公开的能在网络上搜索到的应用文档,导致很多人都不了解芯唐也做电机控制。
作者: w70770777    时间: 2014-12-16 10:53
Angus 发表于 2014-5-9 14:05
目前我们已推出采用比较器检测过零的方案,  硬件和以前的基本兼容。从启转到加100%加压, 不到半秒.   ...

不知道有没有硬件比较器的线路图?能开放么
作者: Angus    时间: 2014-12-19 10:47
全部原理图都在, 比较器在Mini51芯片里面.
作者: nicdau    时间: 2015-2-6 11:51
本帖最后由 nicdau 于 2015-2-6 11:54 编辑

你好,我发现原理图 中C相ADC输入端 AIN_PWM45接了一个上拉电阻300K;
而其他相都没有连接,这个电阻有什么用呢?  
还有就是mini51我在调试过程中发现PWM 用于控制BLCD的寄存器恒为FFFFFFF。一直写不进去这个又是什么问题??




作者: Angus    时间: 2015-2-9 09:05
本帖最后由 Angus 于 2015-2-9 09:06 编辑
nicdau 发表于 2015-2-6 11:51
你好,我发现原理图 中C相ADC输入端 AIN_PWM45接了一个上拉电阻300K;
而其他相都没有连接,这个电阻有什么 ...


R8可以不要, 防ACMP抖动。
不使能外设时钟,外设寄存器就无法写入,貌似你没使能PWM的时钟,在CLK->APBCLK里使能PWM时钟就可以了。
作者: nicdau    时间: 2015-3-1 10:15
Angus 发表于 2015-2-9 09:05
R8可以不要, 防ACMP抖动。
不使能外设时钟,外设寄存器就无法写入,貌似你没使能PWM的时钟,在CLK->APBCL ...

          我用的是后缀是LAN的芯片。     时钟已经使能了,是不是我选错芯片了? LAN没有那个功能?
作者: Angus    时间: 2015-3-2 08:36
nicdau 发表于 2015-3-1 10:15
我用的是后缀是LAN的芯片。     时钟已经使能了,是不是我选错芯片了? LAN没有那个功 ...

AN 的芯片 PWM 部分没有控制 BLDC 的寄存器, DN 或 DE 的才有.
作者: 董自祝    时间: 2015-3-13 17:42
楼主好厉害啊。最经在研究这个
作者: suzhou_chen    时间: 2015-3-30 09:07
请教:我们用该方案,反复启动时,电机有少数次出现一直慢速抖动反转。哪些设置能改善此现象。
作者: Angus    时间: 2015-3-30 14:12
suzhou_chen 发表于 2015-3-30 09:07
请教:我们用该方案,反复启动时,电机有少数次出现一直慢速抖动反转。哪些设置能改善此现象。 ...

你们做的是什么应用? 请直接电话芯唐咨询.
作者: xiaoxiao2013    时间: 2015-4-15 16:28
本帖最后由 xiaoxiao2013 于 2015-5-5 11:21 编辑

楼主,图片是脉冲捕获函数,
Duty_Pulse = ((temp32-1000)*Period_Hundred) >> 3 ;
这句里的1000是什么,怎么得来的这个数值?后面为什么右移3位呢?

作者: Angus    时间: 2015-4-15 20:57
xiaoxiao2013 发表于 2015-4-15 16:28
楼主,图片是脉冲捕获函数,
Duty_Pulse = ((temp32-1000)*Period_Hundred) >> 3 ;
这句里的1000是什么, ...

PPM的标准是 1000us表示Duty=0, 2000us 表示 Duty = 100%,  这个公式把 1000~2000间的数值, 变到大约 0~ (100*Period_Hundred) 之间
作者: xiaoxiao2013    时间: 2015-4-16 10:13
本帖最后由 xiaoxiao2013 于 2015-5-5 11:22 编辑
Angus 发表于 2015-4-15 20:57
PPM的标准是 1000us表示Duty=0, 2000us 表示 Duty = 100%,  这个公式把 1000~2000间的数值, 变到大约 0~  ...

,,,,,,,,,,,,,,,
作者: xiaoxiao2013    时间: 2015-4-16 11:07
本帖最后由 xiaoxiao2013 于 2015-4-16 11:53 编辑
Angus 发表于 2015-4-15 20:57
PPM的标准是 1000us表示Duty=0, 2000us 表示 Duty = 100%,  这个公式把 1000~2000间的数值, 变到大约 0~  ...

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

作者: Angus    时间: 2015-4-16 17:56
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
作者: Angus    时间: 2015-4-16 21:11
xiaoxiao2013 发表于 2015-4-16 11:07
服了新唐,版本真多,我用的这个版本尽然是不正确的,重新在论坛里下载了一遍。
后面的理解了,只有1000这 ...

我们在不断的修正着电路和代码,争取帮大家做出性能最好的 BLDC 控制器。
作者: Angus    时间: 2015-4-17 13:23
xiaoxiao2013 发表于 2015-4-17 10:12
Deadline_Zero = PeriodNow SR & AcmpOutBit){ ++StepCount; break; }           // up zero        
  ...

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

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

Deadline_Zero 最长也只有几十毫秒,  定时器1下次中断要 8.38 秒以后, 不会出现你说的情况.
作者: xiaoxiao2013    时间: 2015-4-17 18:09
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循环就不是毫秒的等待了,而是秒级的。
不知道分析的对不对?


作者: Angus    时间: 2015-4-17 18:31
本帖最后由 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
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
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
Angus 发表于 2015-4-20 10:21
过零检测超时不会等太久这个你明白了, 对吧?
再看这两句:
  PeriodNow  = (PeriodNow + PeriodLast)>>1 ; ...

非常感谢,明白了。
作者: Angus    时间: 2015-5-5 11:41
本帖最后由 Angus 于 2015-5-5 13:31 编辑
xiaoxiao2013 发表于 2015-5-5 11:24
请问新唐有没有常规比较器方波方案的,比较器中断那种,不是新唐这样的定时器内等待过零,很常规中断来就进 ...


有些代理公司或D/H优化了这套代码,可向芯唐咨询。
作者: Angus    时间: 2015-5-6 10:45
本帖最后由 Angus 于 2015-5-6 10:53 编辑
xiaoxiao2013 发表于 2015-5-5 16:58
这套架构优化的也不怎么样,新唐可否有其他的。


你觉得哪里还不算太好, 或者什么功能还实现不了,  可否说出来讨论一下?
作者: w70770777    时间: 2015-6-29 08:56
我想问一下 “Timer1 中断里检过零超时为Timer0计数到 PeriodNow*2”  while判断条件里为什么要持续两个PeriodNow,Timer1 中断是过零检测后3/4个PeriodNow再一次发生,那么while里只要持续监测一个PeriodNow应该就够了,但是我改成一个PeriodNow后 电机启动不了

还有就是我用的24V 4000转的电机做试验,慢速情况下都没问题,当我缓慢加速时 到一定速度后 电机会突然停止,然后就会在那里发出呜呜声 转不了。我测了下,2500rpm时电机平稳转动 但是最高不能超过3000rpm。我找了好久找不到原因
作者: Angus    时间: 2015-6-30 12:47
w70770777 发表于 2015-6-29 08:56
我想问一下 “Timer1 中断里检过零超时为Timer0计数到 PeriodNow*2”  while判断条件里为什么要持续两个Per ...

现在你的电机已转起来了,有些硬件或软件的细节可能没调好,你与芯唐电话或邮件联系吧。
作者: w70770777    时间: 2015-7-1 16:35
我想知道 输入比较器的三相波形是怎么样的
我这里量出来变三角波了 不知道对不对
作者: Angus    时间: 2015-7-29 16:58
w70770777 发表于 2015-7-1 16:35
我想知道 输入比较器的三相波形是怎么样的
我这里量出来变三角波了 不知道对不对 ...

和电机端电压波形一样,只不过幅度变小了。
作者: Angus    时间: 2015-9-15 12:32
本帖最后由 Angus 于 2015-9-15 12:47 编辑
xiaoxiao2013 发表于 2015-9-15 10:08
这方案新塘可否自己多次测试过?实际效果并不好。

有否向芯唐寻求技术支持? 有人做的效果很好。
作者: xiaoxiao2013    时间: 2015-9-24 10:46
Angus 发表于 2015-9-15 12:32
有否向芯唐寻求技术支持? 有人做的效果很好。

有,没有解决的方法
作者: Angus    时间: 2015-9-24 14:36
xiaoxiao2013 发表于 2015-9-24 10:46
有,没有解决的方法

你遇到了什么问题? 只是起转不好? 你的原理图是什么样的?
即然有人做的很好,你也可以做得很好。
作者: xiaoxiao2013    时间: 2015-9-24 15:25
Angus 发表于 2015-9-24 14:36
你遇到了什么问题? 只是起转不好? 你的原理图是什么样的?
即然有人做的很好,你也可以做得很好。 ...

软件硬件都是新唐的,只能自己改了
作者: Angus    时间: 2015-9-24 16:25
xiaoxiao2013 发表于 2015-9-24 15:25
软件硬件都是新唐的,只能自己改了

芯唐去年的板子和代码效果不太好,今年改版的硬件和软件,效果很好。
让电机转起来容易,让电机转好不容易,你可以联系芯唐技术支持
作者: ai_evan    时间: 2016-2-1 10:43
mini52LDE开发板的原理图能扔一份吗?谢谢!
作者: ai_evan    时间: 2016-2-2 13:38
Angus 发表于 2016-2-1 12:19
Mini51/52/54/58的开发板资料可以在这里下载
http://www.nuvoton.com/hq/products/microcontrollers/arm ...

非常感谢,能提供一个河北石家庄这边的联系人吗
作者: Angus    时间: 2016-2-2 14:05
ai_evan 发表于 2016-2-2 13:38
非常感谢,能提供一个河北石家庄这边的联系人吗

我们北京办事处的人,他老家就是石家庄的
作者: ai_evan    时间: 2016-2-2 16:10
Angus 发表于 2016-2-2 14:05
我们北京办事处的人,他老家就是石家庄的。

呵呵,那正好,回石家庄了正好聊聊,电话私信给一下,谢谢
作者: ai_evan    时间: 2016-2-2 16:12
Angus 发表于 2016-2-2 14:05
我们北京办事处的人,他老家就是石家庄的。

想找个监控摄像头云台控制的方案的
作者: ligengtao    时间: 2016-3-23 11:21
本帖最后由 ligengtao 于 2016-3-23 11:22 编辑

@Angus,对电路图有2个疑问,第一:标号VM,+15V来自哪里,VM做什么用?第二:“电源开关”电路目的是什么?我对这部分实现的功能还不了解
作者: Angus    时间: 2016-3-24 22:57
本帖最后由 Angus 于 2016-3-24 23:01 编辑
ligengtao 发表于 2016-3-23 11:21
@Angus,对电路图有2个疑问,第一:标号VM,+15V来自哪里,VM做什么用?第二:“电源开关”电路目的是什么 ...

一,图中没有画出 15V 怎么来的,MOS驱动电压一般用15V~17V,稳压精度无需太高,只要不超 20V 就可以。
二,  可以用 VM 来产生15V 电压。接通开关,电压经二级管 D1 供给 VM 产生 15V 再产生 5V 供给 Mini51。Mini51 工作后让 Q7导通,经 Q2 给 VM 供电。
三,断电时, CPU 由 AIN2 可知道开关断开了,但由 Q2 供电控制是仍正常工作。Mini51 关 MOS 管并做必要的处理后,才让 Q7 截止,Q2 也截止,Mini51 断电,整个控制系统断电。 有些系统需要这样的断电过程,但不是所有。

作者: ligengtao    时间: 2016-3-25 09:34
@Angus,1.代码里面P00和P01脚做什么用呢?ABC依次就是UVW吗?pwm0-pwm5是不是依次对应电机的UVW?还是UWV? 2.代码里,PWM的PHCHG寄存器,PWM0_CH7和PWM0_CH6做什么用的呢,不是一共6个通道吗0-5?
作者: ligengtao    时间: 2016-3-25 11:16
Angus 发表于 2016-3-24 22:57
一,图中没有画出 15V 怎么来的,MOS驱动电压一般用15V~17V,稳压精度无需太高,只要不超 20V 就可以。
二 ...

赞,解释的很清楚!
作者: harvardx    时间: 2016-3-27 10:23
admin 发表于 2014-3-21 13:31
电机应用比较多:电扇 电动车, ...都有完善的方案

方案有公开不 可否让我们不懂的人也学习一下
作者: ligengtao    时间: 2016-3-31 09:27
@Angus,你这里的工程,程序往你们送的NuTiny-SDK-Mini51上烧写,工程配置里面把CPU配置为Mini54LDE,工程的Debug选项里面,Chip Type选Mini51,烧写时有下面的提示框,点确定后就提示找不到DLL,什么情况?
有个别时候是好的,大部分都会提示找不到dll。

error.png (79.69 KB, 下载次数: 286)

环境信息及错误提示

环境信息及错误提示

作者: harvardx    时间: 2016-3-31 12:08
楼上的 MDK 太久了 .纵容是固守MDK4, 也必须用474版本, 才是最稳定. 建议还是升级到最新的MDK5.18A
吧.
作者: ligengtao    时间: 2016-4-1 16:46
harvardx 发表于 2016-3-31 12:08
楼上的 MDK 太久了 .纵容是固守MDK4, 也必须用474版本, 才是最稳定. 建议还是升级到最新的MDK5.18A
吧.  ...

感谢!我试试看
作者: ligengtao    时间: 2016-4-3 17:41
@Angus, 控制方式是不是在PWM ON的时候判断过零?还是ON 和OFF时都可以判断?
作者: Angus    时间: 2016-4-10 16:18
ligengtao 发表于 2016-4-3 17:41
@Angus, 控制方式是不是在PWM ON的时候判断过零?还是ON 和OFF时都可以判断?

都可以判断。
作者: soosqt    时间: 2016-4-18 09:17
进来支持一把BLDC
作者: feilia557    时间: 2016-5-15 09:16
值得收藏...
作者: lizhegao    时间: 2016-7-18 18:44
本帖最后由 lizhegao 于 2016-7-18 18:52 编辑

hi @Angus
请教下 根据变量Periodow 可以算出电机速度1,我使用uart将该速度传到电脑上显示,
我根据示波器看到的电流,测得电流频率,根据60f/p,计算得电机速度2,
我觉得这两个速度应该是相等的,但是我发现   速度1 > 速度2,
比如速度1为46000rpm时,速度2是44000rpm,不知道你是否遇到这样的问题,谢谢!
作者: Angus    时间: 2016-7-19 11:10
本帖最后由 Angus 于 2016-7-19 21:41 编辑
lizhegao 发表于 2016-7-18 18:44
hi @Angus
请教下 根据变量Periodow 可以算出电机速度1,我使用uart将该速度传到电脑上显示,
我根据示波 ...

    看一下 Timer1 的中断代码,每次检测到过0后,先用 Timer1 的值减上次过零时刻值 ZeroTick 得当前周期值,后面再更新当前过零时刻 ZeroTick,这样中间就有一段时间没记入,所以 PeriodNow 的值会比实际周期小一点点,用倒数算出来的转速就会高一点点。我做过测试,电转速在10万转以下时,这个误差很小。
     后来的代码已修正了这个问题,用前后两次过零时刻 ZeroTick 计算 PeriodNow 。重新下载代码测测,与你用示波器测前后两次换相时刻算出来转速,误差应很小了。
作者: lizhegao    时间: 2016-7-20 13:45
明白了,非常感谢
作者: 冰破    时间: 2016-10-25 10:21
这套代码对应的demo板子有出售的吗? 板子烧进demo代码后能直接把电机运转起来的那种
作者: Angus    时间: 2016-10-25 14:24
冰破 发表于 2016-10-25 10:21
这套代码对应的demo板子有出售的吗? 板子烧进demo代码后能直接把电机运转起来的那种 ...

做过两批板子,全送光了,今年没再做。
作者: 冰破    时间: 2016-10-26 08:25
Angus 发表于 2016-10-25 14:24
做过两批板子,全送光了,今年没再做。

反电势比较器的输入端,电路图上是P3.1  P3.4 P3.5,但是代码里边是
#define   ACMP_PH_A                CMP1_PIN_P32               
#define   ACMP_PH_B                CMP1_PIN_P34               
#define   ACMP_PH_C                CMP1_PIN_P35   

两者不对应,何解?
作者: Angus    时间: 2016-10-26 09:23
冰破 发表于 2016-10-26 08:25
反电势比较器的输入端,电路图上是P3.1  P3.4 P3.5,但是代码里边是
#define   ACMP_PH_A                ...

P3.1,P3.2,P3.4,P3.5 这四个引脚都是比较器1的输入,任选三就可以,代码上改一下定义即可。
P3.1 即可以做比较器输入,同时又可以做 ADC 测反电势大小。
我测试的板子是 P3.2,P3.4,P3.5。
作者: 冰破    时间: 2016-10-26 10:16
Angus 发表于 2016-10-26 09:23
P3.1,P3.2,P3.4,P3.5 这四个引脚都是比较器1的输入,任选三就可以,代码上改一下定义即可。
P3.1 即可 ...

了解,那10月份更新的这份代码,这份代码对应的电路图能给我一份参考吗?   图不对码看的很辛苦。
304080523@qq.com

10-28 的苏州研讨会我会去参加,你会过去吗?
作者: Angus    时间: 2016-10-26 14:11
冰破 发表于 2016-10-26 10:16
了解,那10月份更新的这份代码,这份代码对应的电路图能给我一份参考吗?   图不对码看的很辛苦。

苏州研讨会我会去的。
我是连线测试的,没有用绘图软件做成一个文件。
我上传的这些个原理图更合理,软件上只要调用一个函数,再修改一个宏定义就可以了。
作者: 冰破    时间: 2016-10-26 14:21
Angus 发表于 2016-10-26 14:11
苏州研讨会我会去的。
我是连线测试的,没有用绘图软件做成一个文件。
我上传的这些个原理图更合理,软件 ...

PWM->PHCHGMASK =  PHCHG_CTL_CMP1 | P01_OUT_D6 | P00_OUT_D7 ;        

P01和P00用PWM输出模块输出值,用意是什么?  
我手上的硬件,p00和P01用作了串口,那这两个我可以直接关掉了是吗?

作者: 冰破    时间: 2016-10-26 15:03
PWM024_0_MOS_On() ;                 // PWM024 输出低时 MOS 导通,调用此函数让输出反相     
  PWM135_1_MOS_On() ;                 // PWM135 输出高时 MOS 导通,调用此函数让输出反相

如果代码中把这两行MARK掉,TabPhase对应的电路是上桥臂PWM024高电平导通,下桥臂PWM135低电平导通吗?
作者: Angus    时间: 2016-10-26 16:14
本帖最后由 Angus 于 2016-10-26 22:44 编辑
冰破 发表于 2016-10-26 14:21
PWM->PHCHGMASK =  PHCHG_CTL_CMP1 | P01_OUT_D6 | P00_OUT_D7 ;        

P01和P00用PWM输出模块输出值 ...

P00,P01用做串口,只要把这两个引脚配置成串口功能即可,其它不用改。
作者: Angus    时间: 2016-10-26 16:16
冰破 发表于 2016-10-26 15:03
PWM024_0_MOS_On() ;                 // PWM024 输出低时 MOS 导通,调用此函数让输出反相     
  PWM135_ ...

若不调用这两个函数,数组数据对应:PWM024输出高,上 MOS 导通。PWM135输出低,下 MOS 导通。
作者: 冰破    时间: 2016-10-27 09:21
计算周期的时候,定时器计到了最大值,然后从0再开始,这时读出来的TIMER1->DR会比上一次的值小,这时候计算周期的公式还是正确的吗?

例如 上一次的值ZeroTick为0xFFFF00, 到了这次过零,TIMER1->DR已经从最小重新开始数了,变成了0x0000FF, 那下面计算还能得到正确的周期值吗?

PeriodLast = (TIMER1->DR - ZeroTick) & 0xFFFFFF ;
作者: Angus    时间: 2016-10-27 09:34
冰破 发表于 2016-10-27 09:21
计算周期的时候,定时器计到了最大值,然后从0再开始,这时读出来的TIMER1->DR会比上一次的值小,这时候计 ...

正确的,你可以测试一下。
作者: 冰破    时间: 2016-10-27 10:52
关于TIMER0的配置和使用,我有点疑问

code中这么初始化的:
TIMER0->CSR   =  T_CRST | T_MODE_PERIODIC   | T_WR_TCMP_NO_RST | T_TDR_EN + 21 ;
所以更新timer0的CMP寄存器时,只要当TCMP <= TDR时才会重新从0开始计数
Periodic Mode Behavior Selection
0 = In One-shot or Periodic mode, when write new TCMP, timer counter will reset.
1 = In One-shot or Periodic mode, when write new TCMP if new TCMP > TDR(current
counter) , timer counter keep counting and will not reset. If new TCMP <= TDR(current
counter) , timer counter will reset.



再看运用:
void TMR1_IRQHandler(void)                                    
{  
  uint32_t  PeriodLast ;


  TIMER0->CMPR = ~0 ;          //     ~0 is 0xFFFFFFFF                     
  TIMER1->ISR  = ~0 ;                                           // Clear all interrupt flag
  ZeroDeadline = PeriodNow << 1 ;
  do{
    if((*pPhase) & DetectUpBit){                                                                                          
      if(ACMP->SR & AcmpOutBit){ ++StepCount; break; }           // up zero      
    }
    else{                                                                                                                 
      if((ACMP->SR & AcmpOutBit)==0){ ++StepCount; break; }      // down zero                     
    }
  }while(TIMER0->DR < ZeroDeadline) ;   
  PeriodLast = (TIMER1->DR - ZeroTick) & 0xFFFFFF ;



这里ZeroDeadline 的值是周期的一半,按while条件中的比较,TIMER0->DR从0开始计数才是合理的,但是前面TIMER0->CMPR赋予的是最大值,所以定时器0不会RST,
TIMER0->DR不会从0开始计数。这个while的延时条件是有问题的。




================================
我认为应该这么做:
只要更新TIMER0->CMPR值,就会重新从0开始计数
TIMER0->CSR   =  T_CRST | T_MODE_PERIODIC  | T_TDR_EN + 21 ;  

然后再修改一处地方:
  if(PeriodNow > PeriodMax) PeriodNow = PeriodMax ;  
  TIMER0->CMPR = TIMER0->DR + ((PeriodNow*PhaseAngle) >> 6) ;    // Set TIMER0 period
  TIMER1->CMPR = TIMER1->DR + ((PeriodNow*3)>>2) ;               // Set TIMER1 interrupt
修改成:
  if(PeriodNow > PeriodMax) PeriodNow = PeriodMax ;  
  TIMER0->CMPR = ((PeriodNow*PhaseAngle) >> 6) ;    // Set TIMER0 period
  TIMER1->CMPR = TIMER1->DR + ((PeriodNow*3)>>2) ;               // Set TIMER1 interrupt



作者: Angus    时间: 2016-10-27 14:25
冰破 发表于 2016-10-27 10:52
关于TIMER0的配置和使用,我有点疑问

code中这么初始化的:

善于思考是个好习惯
你手头有板子,也有代码,你可以验证一下你的思路是否正确,看看电机能否正常转动。
作者: 冰破    时间: 2016-10-27 15:52
Angus 发表于 2016-10-27 14:25
善于思考是个好习惯。
你手头有板子,也有代码,你可以验证一下你的思路是否正确,看看电机能否正常转 ...

能先告诉我答案吗? 我的分析是否正确。

我手上的板子不是按那个电路图来的。我目前的阶段是理解你的代码以后,再摘取有用的部分移植进我的BLDC代码中。我自己有成熟代码,不过是基于STM32的
作者: Angus    时间: 2016-10-27 17:46
本帖最后由 Angus 于 2016-10-27 20:44 编辑

你说的方法应该也是可以的。
配置"写 TIMER0->CMPR 不从 0 开始计数",但写 TIMER0->CMPR 时加上了定时器的当前值。
你配置"写 TIMER0->CMPR 从 0 开始计数",但写 TIMER0->CMPR 时没加定时器的当前值。
二者延时长度是一样的,
作者: Angus    时间: 2017-1-4 12:45
wangjiahao88 发表于 2016-12-26 17:13
有没有开发板?

在哪里采购?

电机开发板,已赠送完了,没再做。
Mini52/NM1200 的最小系统板子,仍有,可通过代理商申请。
作者: pongwy    时间: 2017-2-9 09:45
学习了,做的很好很好,可以拿着份资料入门了,非常感谢!
作者: rete0786    时间: 2017-3-14 13:42
貌似非常强大啊
作者: rete0786    时间: 2017-3-14 13:42
代码看不懂啊  有没有什么详细的说明文档哈,有就非常的好了,
作者: Angus    时间: 2017-3-18 15:16
rete0786 发表于 2017-3-14 13:42
代码看不懂啊  有没有什么详细的说明文档哈,有就非常的好了,

不是貌似,是真的非常强大!
作者: rete0786    时间: 2017-3-25 15:13
  if(((TIMER1->CSR & T_IE) == 0 ) && ( flag_Start == 0))
    {   
        if(Duty >= DUTY_START)
        {
            flag_Start = 1;                                         // 需要启转
//          DC_Bus = ADC_DC_BUS();
            //10-bit ADC
            temp_DC32 = DC_Bus&0x3FF;
            temp_DC32 = DEFINE_Voltage-temp_DC32;
//          Duty_Voltage=DUTY_START;
            Duty_Voltage = DUTY_START+(temp_DC32*DUTY_Differ)/0x1A0;            
            BLDC_Start(Duty_Voltage, 0) ;                           // 第二个参数Duty_Voltage
            Step_High_V   = 0 ;
            //LED_TOGGLE();
        }   
    }
    // BLDC 启转中,或已同步 ///////////////////////////////  
请问这一段怎么理解?
作者: Angus    时间: 2017-3-25 16:28
本帖最后由 Angus 于 2017-3-25 19:08 编辑
rete0786 发表于 2017-3-25 15:13
if(((TIMER1->CSR & T_IE) == 0 ) && ( flag_Start == 0))
    {   
        if(Duty >= DUTY_START)

你这是哪里下载的代码? 貌似不是这个帖子里的。
从这段代码内容看,是测电源,按电压大小调整起转占空比。

作者: rete0786    时间: 2017-3-29 19:31
Angus 发表于 2017-3-25 16:28
你这是哪里下载的代码? 貌似不是这个帖子里的。
从这段代码内容看,是测电源,按电压大小调整起转占空比 ...

可以加一下你的QQ吗,我这个里面还有好多的地方看不懂。
作者: Angus    时间: 2017-3-29 20:51
本帖最后由 Angus 于 2017-3-29 20:52 编辑
rete0786 发表于 2017-3-29 19:31
可以加一下你的QQ吗,我这个里面还有好多的地方看不懂。

本帖代码咨寻可以在这里回帖,其它地方的代码,我也没看过,看明白别人的代码,也是需要花点时间的。
我们公司的防火墙阻挡了所有网络通信软件,无法登陆。
作者: doit    时间: 2017-4-3 20:04
如果所用的驱动电路上下桥MOS管都是输入高电时平导通, 请问是否删除以下这行指令即可?


作者: Angus    时间: 2017-4-5 08:40
doit 发表于 2017-4-3 20:04
如果所用的驱动电路上下桥MOS管都是输入高电时平导通, 请问是否删除以下这行指令即可?
...

是的。
如果你的电路,上下桥都是CPU输出高时,功率管导通,注释掉那一行就可以了。
作者: doit    时间: 2017-4-8 19:27
Angus 你好, 想再请教一下, 我在调试时电机不断重复起动没法进入正常运行状态, 板子的输入电压是14V, 而在单片机的输入端测到的反电动势波型只有1.88V, 这电压是否太低? 正常这电压在怎么范围? 谢谢!







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