标题: 51 MCU,BLDC有感无感全开源,轻松实践直流无刷电机控制(程序+电路详解) [打印本页]

作者: 51mcu003    时间: 2019-1-24 08:59
标题: 51 MCU,BLDC有感无感全开源,轻松实践直流无刷电机控制(程序+电路详解)
上封帖子介绍了51单片机,JMT18F003PLUS,提供了芯片例程和资料,链接如下:

JMT18F003PLUS单片机芯片手册,例程等资料下载
http://www.51hei.com/bbs/dpj-148985-1.html
(出处: 51hei)

这里把这款芯片用于直流无刷电机控制的demo程序,有感和无感源代码,一并开源,希望对学习者有帮助。

BLDC demo板是这样的:





芯片资料,bldc控制板简要说明,原理图,有感和无感的开源软件等等,请点击下载:

JMT18F003 PLUS BLDC DEMO 板应用笔记
1. 简介
本应用笔记讨论了使用 JMT18F003 PLUS 控制芯片对无刷直流电机(Brushless Direct Current Motor,  BLDC)进行方波算法的控制。
2.  JMT18F003 PLUS 芯片特点
  8位MCU,兼容 MCS51指令集;
  内核运行最高频率 24.576MHz;
  8K字节Flash、1K字节外部 RAM、128 字节内部RAM;
  2个高性能 16位 PWM 模块,最高运行频率 73.728MHz,其中 PWM0支持3路互补加 1路独立PWM, PWM1支持 1路互补PWM;
  1 个 12 通道的 10 位 ADC、1 个可编程运算放大器(4 组差分输入) 、1个模拟比较器(4组可切换) 、3个 Timer、1个蜂鸣器输出;
  通信接口:SPI总线、 I2C总线、 UART总线接口;
  支持 JTAG 调试。

3. 电机开发板使用说明
3.1 电机板如下图 1 所示,包括以下资源:
  控制芯片:JMT18F003 PLUS芯片;
  24V-DC电源接口:为电机板提供24V直流电;
  电机U/V/W 接口:连接电机的3根控制线;
  电机霍尔接口:连接电机霍尔信号的五根控制线,从左至右依次为: HC、HB、HA、VDD、GND;
  串口:用于程序下载和打印调试信息;
  滑阻:通过改变滑阻的大小,实现对电机转速的控制;
  采样电阻:0.05欧;
  排针J5、J6、J7:通过跳线帽选择电机运行方式为无感或有感;
  按键S1、S2:用户自定义。

3.2 电机板使用注意点
  由于下载串口的 RX管脚与滑阻管脚复用,在使用的时候只能二选一;
  电机控制方式选择如图 2 所示,排针 J5、J6、J7 按图 2 左边方式短接则表示选择的电机控制方式为无感控制方式,按图 2右边方式短接则表示选择的电机控制方式为有感控制方式。

JMT18F003 PLUS BLDC DEMO板原理图如下:


4.1JMT18F003 PLUS主控芯片电路如下图所示


4.2 供电模块电路
电压为24V供电,经过如下电路转为5V 电压,给芯片供电。


4.3 PWM MOS 管及驱动电路


4.4 电机反电动势采样电路


4.5 电机霍尔信号输入电路



4.6 电流采样电路
电机板默认采用内部放大电路对电流进行 AD采样。



5. 软件参数设置
电机控制方式选择 SENSORMODE、极对数 POLE_PAIRS、转速范围、电压保护
参数、电流保护参数等参数都位于MotorPara.h文件中。示例如下图所示。



电机控制方式选择SENSORMODE选择为0时,表示选择无感控制电机的方式,主板需要按图 2 左边的排针接法连接;SENSORMODE 选择为 1 时,表示选择有感控制电机的方式,主板需要按图2右边的排针接法连接。

注意:
1、除 PWM 外的其他模块的时钟由片内 24.576MHz(由片内 73.728MHz 高频振荡器产生的时钟经过 3 分频得到)或外部晶振(最高 24MHz)或片内低频振荡器产生的32.768KHz 时钟提供
2、由于滑阻VSP与RXD共用引脚,故调速是RXD不可接串口
3、UVW:红黄黑    HCHBHA:黄白蓝    HUHVHW:CW-326451;CCW-623154

单片机源程序如下:
  1. #include "main.h"

  2. /*****************************************************************************
  3. 函 数 名  : main
  4. 功能描述  : 主函数
  5. 输入参数  : 无
  6. 输出参数  : void
  7. *****************************************************************************/
  8. void main()
  9. {               
  10.         StartParaInit();
  11.         
  12.         WDT_Init();
  13.         Crpm_Init();
  14.         Port_Init();
  15.         UART_Init();
  16.         
  17.         Interrupt_Init();
  18.         
  19.         ADC_Init();

  20.         CMP_Init();
  21.         
  22.         Pss("V0.1", NONE);

  23.         PWM_Init();
  24.         
  25.         #if(SENSORMODE)
  26.         PWM1_Init();
  27.         #else
  28.         Timer0_Init();
  29.         #endif

  30.         while(1)
  31.         {
  32.                 switch(MasterState)
  33.                 {
  34.                         case Startup:
  35.                                 Ps("Start", NONE);
  36.                                        
  37.                                 Fault_InitOverUnderVoltage();        // 电源电压判断
  38.                                 
  39.                                 UserSpeedControlInit();        //滑阻判断

  40.                                 MasterState = Operation;
  41.                                 mcState = mcInit;
  42.                                 break;
  43.                                 
  44.                         case Operation:
  45.                                 MotorControl();
  46.                                 
  47.                                 if(ADCIntProtectCnt >= 5)        // 250us
  48.                                 {                                       
  49.                                         Fault_OverCurrent();
  50.                
  51.                                         Fault_OverUnderVoltage();

  52.                                         UserSpeedControl();
  53.                                 
  54.                                         ADCIntProtectCnt = 0;                                
  55.                                 }
  56.                                 break;
  57.                                 
  58.                         default:
  59.                                 MotorStop();
  60.                                 break;
  61.                 }
  62.         }
  63. }
复制代码
  1. #include "common.h"

  2. MasterState_T MasterState;
  3. MotorState_T mcState;

  4. volatile u8 xdata Phase = 0;        // 相位
  5. volatile u8 xdata NextPhase = 0;

  6. volatile u8 xdata MotorRotation = CW;        // 电机转动方向        

  7. volatile u8 xdata TuneDutyRatioCnt = 0;        // 调整转速占空比的周期计数

  8. volatile u16 xdata PWMDutyCycle = 0;        // PWM占空比

  9. volatile u16 xdata CurrentPgaSample = 0;
  10. volatile u16 xdata CurrentSample = 0;        // 电流采样值
  11. volatile u16 xdata VoltageSample = 0;        // 电压采样值
  12. volatile u16 xdata UserSpeedSample = 0;        // 用户调速采样值

  13. volatile u8 xdata ADCIntProtectCnt = 0;        // ADC中断计数保护
  14. volatile u8 xdata flag_ADCSample = 0;        // AD采样时的通道切换标志

  15. volatile u8 xdata flag_ErrorException = 0;        // BIT0:Timer2计数超时        BIT1:比较器中断异常        BIT2:长短波启动超时        BIT3:长短波电流采样过流        BIT4:ADC采样换相异常        BIT5:CMP换相异常

  16. volatile u8 xdata LastPhase = 0;
  17. volatile u8 xdata SamePhaseCnt = 0;

  18. // 电转速60度时间
  19. volatile bit flag_SpeedTime = 0;        
  20. volatile u8 xdata SpeedTimeCnt = 0;        
  21. volatile u16 xdata SpeedTime = 0;
  22. volatile u16 xdata SpeedTimeTemp = 0;
  23. volatile u32 xdata SpeedTimeSum = 0;

  24. volatile u16 xdata MotorSpeed = 0;
  25. volatile u16 xdata UserRequireSpeed = 0;        // 用户请求转速

  26. volatile u8 xdata RheostatCnt = 0;        // 调速信号

  27. // 保护计数
  28. volatile u8 xdata VoltageProCnt = 0;
  29. volatile u8 xdata CurrentPgaProCnt = 0;
  30. volatile u8 xdata CurrentProCnt = 0;

  31. #if(SENSORMODE)
  32. volatile u8 xdata NowHallState = 0;        // HALL当前位置
  33. volatile u8 xdata PreHallState = 0;        // 前次HALL位置

  34. volatile bit flag_HallStateRight = 0;

  35. volatile u16 xdata OverflowCnt = 0;        // PWM1捕获上溢中断计数
  36. #else
  37. volatile u16 xdata NeutralPoint = 0;
  38. volatile u16 xdata UBemf = 0;
  39. volatile u16 xdata VBemf = 0;
  40. volatile u16 xdata WBemf = 0;

  41. volatile u8 xdata BlankingCnt = 0;
  42. volatile u8 xdata CheckZeroCrossState = 0;

  43. volatile u8 xdata Timer0OutCnt = 0;        // 换相超时

  44. volatile u16 xdata ADCTimeCnt = 0;        // ADC中断计数
  45. volatile u16 xdata DragTime = 0;
  46. #endif

  47. /*****************************************************************************
  48. 函 数 名  : Common_Init
  49. 功能描述  : 全局变量初始化
  50. 输入参数  : 无
  51. 输出参数  : void
  52. *****************************************************************************/
  53. void Common_Init()
  54. {
  55.         Phase = 0;
  56.         NextPhase = 0;
  57.                
  58.         TuneDutyRatioCnt = 0;
  59.         
  60.         PWMDutyCycle = PWM_DUTYCYCLE_05;

  61.         CurrentPgaSample = 0;
  62.         CurrentSample = 0;        // 电流采样值
  63.         VoltageSample = 0;        // 电压采样值
  64.         UserSpeedSample = 0;

  65.         ADCIntProtectCnt = 0;
  66.         flag_ADCSample = 0;

  67.         flag_ErrorException = 0;
  68.         
  69.         LastPhase = 0;
  70.         SamePhaseCnt = 0;

  71.         flag_SpeedTime = 0;        
  72.         SpeedTimeCnt = 0;        
  73.         SpeedTime = 0;
  74.         SpeedTimeTemp = 0;
  75.         SpeedTimeSum = 0;

  76.         MotorSpeed = 0;
  77.         UserRequireSpeed = 0;        // 用户请求转速

  78.         RheostatCnt = 0;

  79.         VoltageProCnt = 0;
  80.         CurrentPgaProCnt = 0;
  81.         CurrentProCnt = 0;

  82.         #if(SENSORMODE)
  83.         NowHallState = 0;
  84.         PreHallState = 0;

  85.         flag_HallStateRight = 0;

  86. ……………………

  87. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码





所有资料51hei提供下载:
JMT18F003 BLDC资料.rar (6.03 MB, 下载次数: 1262)



作者: admin    时间: 2019-1-24 18:53
好资料,51黑有你更精彩!!!
作者: 51mcu003    时间: 2019-1-25 08:55
admin 发表于 2019-1-24 18:53
好资料,51黑有你更精彩!!!

谢谢!

希望这些内容对了解BLDC控制和51单片机爱好者有所帮助。
作者: HappyColt    时间: 2019-2-12 17:55
加个qq好友有些问题向你请教一下:1252574935
作者: GUOXUAN    时间: 2019-2-18 14:55
感谢您分亨资料,请问老师如何购买套件呢?
作者: lcclzy    时间: 2019-2-28 19:40
这个芯片在哪有卖,性价比怎么样
作者: linkappa    时间: 2019-3-1 13:04
谢谢分享,学习。。
作者: huihuangzeng    时间: 2019-6-15 11:21

好资料,51黑有你更精彩!!!
作者: lsyswh    时间: 2019-6-28 19:06
感谢分享!
作者: zhaijiwei123    时间: 2019-8-1 09:39
非常感谢
作者: jokeyli    时间: 2019-8-14 15:36
可以借鉴,多谢了
作者: xilinxue842    时间: 2019-8-26 08:10
好资料
作者: vkman    时间: 2019-8-27 10:35
好东西,感谢楼主分享
作者: 这一生只为你    时间: 2019-8-28 08:44
感谢楼主分享~
作者: shenyuqiu    时间: 2019-8-28 10:09
好资料,感谢楼主分享
作者: yoqsh    时间: 2019-8-31 14:51
学习一下,好久没有登录了。。。。
作者: mcu_mpu    时间: 2019-9-18 14:32
高手,学习了。
作者: yun1981    时间: 2019-9-25 17:17
无感是通过AD采集,计算过零点吗?
作者: wugw    时间: 2019-11-1 09:03
非常有用,谢谢楼主
作者: cba_cba    时间: 2019-11-15 09:59


非常有用,谢谢楼主 ,正在做这方面产品,
作者: jiajia86    时间: 2019-11-18 15:06
谢谢分享。
作者: 380088312    时间: 2019-11-29 16:30
感谢分享
作者: cdiyy    时间: 2019-11-30 09:34
感谢了,非常好的资料,学习了
作者: wudonghua    时间: 2019-12-3 15:38
感谢分享!!!
作者: lonecheat    时间: 2019-12-10 15:49
很全面了,看了几天代码,代码中检测 到过零后直接换相了,反电动势好像要延迟30电角度换相吧?想请教一下楼主是怎么处理延迟30度电角度的呢?
作者: 1213567    时间: 2019-12-21 14:43
代码实际测试过没
作者: pascal116    时间: 2020-2-21 17:21
感谢您分亨资料,请问可否购买相关资料
作者: shenyuqiu    时间: 2020-3-2 18:16
请问这款单机片能驱动十万转的无感无刷电机吗
作者: motor_driver    时间: 2020-3-4 12:55
学习了
作者: daqng    时间: 2020-3-17 16:11
好资料,51黑有你更精彩!!!
作者: petertang    时间: 2020-4-9 18:40
可以参考。谢谢。
作者: chaochao980704    时间: 2020-4-23 13:25
请问下楼主或是其他热心网友,这个代码Atmel的51单片机也能通用吗?
作者: lubinltb123    时间: 2020-5-28 16:27
好资料,51黑有你更精彩!!!
作者: swustlx86    时间: 2020-6-1 01:56
好资料,51黑有你更精彩!!!
作者: shooly    时间: 2020-6-3 10:28
很好的资料,学习了
作者: nhwhg    时间: 2020-6-5 19:58
谢谢分享,学习k中。。
作者: 霸气范    时间: 2020-6-12 23:10
学习,最近想做高压无刷电调
作者: ZHSHRONG    时间: 2020-6-22 19:32
刚刚在了解直流电机的驱动。好资料,51黑有你更精彩!!!
作者: wenyuyun    时间: 2020-6-28 16:57
无感检测和30度的相位差补偿这一块的实现上,一直有问题。

作者: Jeff_BlindCat    时间: 2020-7-9 07:43
谢谢楼主指导,俺又进步一点了。
电路齐全一目然,
耐心讲解明根源,
差分信号勤补拙,
有感无感都能转。
作者: 平凡的1769    时间: 2020-7-16 10:15
学习了,感谢楼主分享,支持国产芯片
作者: 欧迈加    时间: 2020-7-21 13:44
学习学习,这启动是怎么做的?
作者: waterbaby2011    时间: 2020-7-22 21:10
好定西,支持国产
作者: waterbaby2011    时间: 2020-8-5 17:45
代码经过实际测试了么
作者: waterbaby2011    时间: 2020-8-6 16:07
下载器用什么?
作者: fqc168    时间: 2020-9-26 10:52
正准备搞一个来玩玩,将山地车改成电动车,方便上下班,纯软件驱动不知道效果如何
作者: A星猫    时间: 2020-11-9 08:47
感谢作者的分享太全了,对我很有帮助,感谢作者。
作者: terrygame122    时间: 2020-11-20 00:41
好呀!正想学习呢?感谢!
作者: 紫色的云    时间: 2020-11-20 08:45
谢谢楼主的资料,最近正在找电机方面的资料学习
作者: sawyer-shao    时间: 2021-1-1 12:00
请教楼主一个问题,如何做只有2个线圈的BLDC驱动?
作者: chjchj816    时间: 2021-1-2 16:58
我也来学习一下别人的经验
作者: 云游天    时间: 2021-1-20 22:23
联系一下这个厂家,,,合作一下
作者: aktuan007    时间: 2021-1-24 16:00
这个是τ 宝上的?
作者: xql2008    时间: 2021-5-5 20:37
谢谢!收下了,不知道现在这个芯片能供货不?
作者: yf654987    时间: 2021-5-13 20:55
好东西!!!!!第一次见这个东西!!
作者: 电科小卒    时间: 2021-5-17 22:51
什么,请问分享的在哪?

作者: rdhenry    时间: 2021-10-12 16:43
想搞个玩玩,没货!
作者: meijiayuan    时间: 2021-11-5 13:13
带FOC吗
作者: weiwu1008    时间: 2021-12-6 20:29
貌视少了强拖函数
作者: 南山    时间: 2022-3-29 13:28
有没有印制板图

作者: 刚来51黑的小巷    时间: 2024-3-26 09:09
想要,真好在学习8位 的

作者: engcyh    时间: 2024-3-26 18:11
请问楼主,单片机程序怎么下载,需不需要专用下载器,另外编程软件兼容keil吗?

作者: 18689719961    时间: 2024-3-26 19:43
我有一块这样的驱动板,用他配套的USB串口工具和上位机不能烧录,不知道什么原因。
作者: 18689719961    时间: 2024-3-26 19:45
engcyh 发表于 2024-3-26 18:11
请问楼主,单片机程序怎么下载,需不需要专用下载器,另外编程软件兼容keil吗?

有他们专用的USB串口工具还有ISP上位机。
作者: aigo13428149596    时间: 2024-4-6 00:46
我也想做一个
作者: aigo13428149596    时间: 2024-4-6 13:40

想要,刚好在学习8位 的
作者: wkman    时间: 2024-4-8 09:49
当年搞过一阵JMT的,不过客户没下文,也就没有后续了
作者: xujibicool    时间: 2024-4-10 19:08
好资料,51黑有你更精彩!!!
作者: 1123551003    时间: 2024-10-8 15:15

很有用,可以学习学习,谢谢啦。。。
作者: yanggo    时间: 2024-11-14 16:49
这资料厉害了!感谢分享呀,最近在学习电机方面的知识。
作者: wthdyfg    时间: 2024-11-25 15:12
楼主有没有为什么需要设定极对数。这些资料可以看下的。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1