找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

  [复制链接]
跳转到指定楼层
#
Angus 发表于 2013-12-23 15:55:08 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
本帖最后由 Angus 于 2024-7-17 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 (132.21 KB, 下载次数: 1758)


Mini52 BLDC 代码简介.pdf

2 MB, 下载次数: 17521

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 顶 踩
回复

使用道具 举报

推荐
 楼主| Angus 发表于 2024-10-22 10:01:10 | 只看该作者
为提高检过 0 的准确性,我们是在一个时间窗检过 0 的。如下图,每次检到过0后,延时 T0 时间换相,延时 T1 时间检过 0。检过 0 是图中斜线阴影时间。
而这个 T1 延时,是变化的,在起转时,稍长。起转成功后,每个周期前 80% 多的时间是不检过0的,只在实际过 0 附近检过0,所以滤除了很多干忧。




你若想验证这一点,可在main() 主循环中反转一个引脚的电平,因检过 0 是在 timer1 中断里,所以此引脚电平不反转时就是在检过0,这样就能看到检过 0 的时间窗了。

下图绿色是 main() 中反转引脚的波形,那些空缺是代码在 timer1 中检过0时间。
  



提高转速,会发现,无轮转速多快,都会在过 0 时间附近有这个空缺,只有这段时间检过0,其它时间是不检过 0 的


回复 支持 1 反对 0

使用道具 举报

推荐
陈飞宇 发表于 2013-12-26 13:37:18 | 只看该作者
貌似非常强大啊
回复 支持 1 反对 0

使用道具 举报

184#
 楼主| Angus 发表于 昨天 20:03 | 只看该作者
本帖最后由 Angus 于 2025-4-30 08:50 编辑

有人在此代码基础上,做成并量产了 380V/4KW 的电机控制板,最大功率 5KW。

电机控制板能做到量产,不仅是代码要完善,硬件细节没问题,还要了解电机的机械特性。如果你有项目需求,请直接联系新唐技术人员或新唐的代理公司寻求支持,能加快研发进度。
回复 支持 反对

使用道具 举报

183#
匿名  发表于 昨天 15:38
Angus 发表于 2025-4-25 23:34
低通滤波器,对于直流,是没有衰减的。低通计算公式输入一个常量,多次计算,最后输出也是常量。
可用 Exce ...

感谢作者大大,请问能不能把没有封库的代码分享一下,这是我的邮箱1021351119@qq.com
目前在做大功率的角磨机,大概需要带2000W的载启动,请问这个方案合适吗?
回复 支持 反对

使用道具

182#
 楼主| Angus 发表于 5 天前 | 只看该作者
本帖最后由 Angus 于 2025-4-25 23:40 编辑

低通滤波器,对于直流,是没有衰减的。低通计算公式输入一个常量,多次计算,最后输出也是常量。
可用 Excel 表格验证此公式 temp32 = temp32+((CurrentNow*55-LastCurrent*24)>>5);  





输入常量100一直计算,输出值会稳定在 3200。如果上次值、和上上次值都是 3200,再输入一个100常量,计算结果是 100+(3200*55-3200*24)/32 , 这个结果又是 3200,  刚好是输入值100的32倍,即增加了5位小数。



如果用公式  temp32 = (temp32+CurrentNow*55-LastCurrent*24)>>5 ; 计算一下,  不会增加小数,输入100 多次计算,值稳定在 100。
上次值,上上次值若都是100,再输入100,计算式 (100 +100*55-100*24)>>5 ,   结果仍是100。


回复 支持 反对

使用道具 举报

181#
匿名  发表于 5 天前
Angus 发表于 2025-4-24 16:41
temp32 = temp32 +((CurrentNow*55 -LastCurrent*24)>>5);  
这个是二阶低滤波器,这个计算增加了5位小数, ...

你好作者大大,我有个疑问。首先不管这个二阶低通滤波器的设计,temp32是ADC-DR的值*(PWM->CMP)/(100*PWM_ONE_PERCENT),到这temp32的量级还是跟ADC-DR的值一样,经过二阶低通滤波器之后temp32 = temp32 +((CurrentNow*55 -LastCurrent*24)>>5);  变成原来temp32大约两倍,此时将CurrentAvg = temp32>>5;相当于直接将temp32缩小了30倍,整个过程都没先将temp32左移5位把高5位当整数,低5位当小数的操作。但是最后比较的时候,我就是觉得CurrentAvg和CURRENT_LIMIT根本就不在一个量级。
  1.    
  2.          int32_t     temp32 ;  
  3.          uint32_t   static Turn_ADC = 0 ;   
  4.          int32_t     static LastCurrent=0, CurrentNow=0 ;  
  5.   
  6.   temp32 = ADC->DR & 0xFFFF ;
  7.   switch(ADC->CHER & 0xFF){  
  8.   case ADC7_CURRENT :
  9.     temp32 -= Current_Zero ;                                           // 功率管导通时的电流值
  10.     Adc_Current = temp32 ;
  11.     if(temp32 > CURRENT_PEAK){            Duty_Limit -=  1;      
  12.       if(temp32 > (CURRENT_PEAK*39>>5))    Duty_Limit -= 40;     // 一次减5%, 最快2ms可减80%
  13.       else if(temp32 >(CURRENT_PEAK*35>>5)) Duty_Limit -= 4;     // 两次减约0.5%
  14.       TickChangDuty = TIMER1->DR ;                    // 过流停止加电压,风机类转速上去电流就下来了         
  15.     }
  16.     if(temp32 < 0) temp32 = 0 ;                             // 风机类,若不控制功率就不必测平均电流
  17.     else if(PWM->CMR0 <PWM->CNR0)temp32 =(temp32*PWM->CMR0*Current_Cofficient)>>16; // 周期内均值   
  18. // Current_Cofficient = 65536ul/(100*PWM_ONE_PERCENT);      // 电流校正系数               
  19.     temp32 = temp32+((CurrentNow*55-LastCurrent*24)>>5);  // 二阶低通,转折频率13.8K/2/30= 230Hz
  20.     LastCurrent = CurrentNow;    CurrentNow = temp32 ;
  21.     CurrentAvg = temp32>>5;
  22.     break ;     
复制代码
回复 支持 反对

使用道具

180#
 楼主| Angus 发表于 6 天前 | 只看该作者
temp32 = temp32 +((CurrentNow*55 -LastCurrent*24)>>5);  
这个是二阶低滤波器,这个计算增加了5位小数, 所以最后把5位小数去掉 CurrentAvg = temp32>>5;

这个二阶低通,也可以写成  temp32 = (temp32 +CurrentNow*55 -LastCurrent*24) >>5 ;   这样计算不会增加小数位,但不如前面增加小数位的公式计算精度高。
回复 支持 反对

使用道具 举报

179#
匿名  发表于 7 天前
  case ADC7_CURRENT :      temp32 -= Current_Zero ;                                           // 功率管导通时的电流值     Adc_Current = temp32 ;     if(temp32 > CURRENT_PEAK){            Duty_Limit -=  1;             if(temp32 > (CURRENT_PEAK*39>>5))    Duty_Limit -= 40;     // 一次减5%, 最快2ms可减80%       else if(temp32 >(CURRENT_PEAK*35>>5)) Duty_Limit -= 4;     // 两次减约0.5%        TickChangDuty = TIMER1->DR ;                    // 过流停止加电压,风机类转速上去电流就下来了              }     if(temp32 < 0) temp32 = 0 ;                             // 风机类,若不控制功率就不必测平均电流     else if(PWM->CMR0 <PWM->CNR0)temp32 =(temp32*PWM->CMR0*Current_Cofficient)>>16; // 周期内均值                             temp32 = temp32 +((CurrentNow*55 -LastCurrent*24)>>5);  // 二阶低通,转折频率13.8K/2/30= 230Hz      LastCurrent = CurrentNow;    CurrentNow = temp32 ;     CurrentAvg = temp32>>5;     break ; 请问一下作者大大最后这个CurrentAvg = temp32>>5;是为什么
回复 支持 反对

使用道具

178#
匿名  发表于 2024-7-17 11:28:49
26万转,咋会这么快呢?
回复 支持 反对

使用道具

177#
a760656130 发表于 2024-2-24 15:40:51 | 只看该作者
Angus 发表于 2024-2-23 18:38
有客户在此代码基础上做手电钻

楼主您好,我想制作一个PCBA
我看前面有群友问答里面您有提及直接烧录进去,接线没有错误即可转动,所以我想自己制作试试看;现在就是有2个原理图,一个是这个帖子首页的贴图,一个是首页程序包内有个PDF的原理图,用哪一个制作PCBA更适配这个程序呢?
回复 支持 反对

使用道具 举报

176#
 楼主| Angus 发表于 2024-2-23 18:38:01 | 只看该作者
a760656130 发表于 2024-2-23 13:33
你好 有没有18V手电钻的这个原理图和PCB资料,适配这份代码吗?

有客户在此代码基础上做手电钻
回复 支持 反对

使用道具 举报

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

本版积分规则

新唐MCU