锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

51 MCU,BLDC有感无感全开源,轻松实践直流无刷电机控制(程序+电路详解)

时间:2023-06-01 02:37:00 什么是无感电阻器

上封帖介绍了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指令集;

内核运行最高频率 244.576MHz;

8K字节Flash、1K字节外部 RAM、128 字节内部RAM;

16位PWM 模块,最高运行频率 73.728MHz,其中 PWM0支持3路互补 1路独立PWM,PWM支持 1路互补PWM;

10 位 12 通道ADC、1 可编程操作放大器(4 组差输入) ,1个模拟比较器(4组可切换) ,3个 Timer、一个蜂鸣器输出;

通信接口:SPI总线、 I2C总线、 UART总线接口;

支持 JTAG 调试。

3. 电机开发板使用说明书

3.如下图所示,1 电机板包括以下资源:

控制芯片:JMT18F003 PLUS芯片;

24V-DC电源接口:24V直流电;

电机U/V/W 接口:连接电机的三条控制线;

电机霍尔接口:连接电机霍尔信号的五条控制线,从左到右依次为: 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

单片机源程序如下:

#include "main.h"

/*****************************************************************************

函 数 名: main

功能描述: 主函数

输入参数: 无

输出参数: void

*****************************************************************************/

void main()

{

StartParaInit();

WDT_Init();

Crpm_Init();

Port_Init();

UART_Init();

Interrupt_Init();

ADC_Init();

CMP_Init();

Pss("V0.1",NONE);

PWM_Init();

#if(SENSORMODE)

PWM1_Init();

#else

Timer0_Init();

#endif

while(1)

{

switch(MasterState)

{

case Startup:

Ps("Start",NONE);

Fault_InitOverUnderVoltage(); // 电源电压判断

UserSpeedControlInit(); ///滑阻判断

MasterState = Operation;

mcState = mcInit;

break;

case Operation:

MotorControl();

if(ADCIntProtectCnt >= 5) // 250us

{

Fault_OverCurrent();

Fault_OverUnderVoltage();

UserSpeedControl();

ADCIntProtectCnt = 0;

}

break;

default:

MotorStop();

break;

}

}

}

复制代码

#include "common.h"

MasterState_T MasterState;

MotorState_T mcState;

volatile u8 xdata Phase = 0; // 相位

volatile u8 xdata NextPhase = 0;

volatile u8 xdata MotorRotation = CW; // 电机旋转方向

volatile u8 xdata TuneDutyRatioCnt = 0; /// 调整计数调整转速占空比

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

volatile u16 xdata CurrentPgaSample = 0;

volatile u16 xdata CurrentSample = 0; // 电流采样值

volatile u16 xdata VoltageSample = 0; // 电压采样值

volatile u16 xdata UserSpeedSample = 0; //

volatile u8 xdata ADCIntProtectCnt = 0; // ADC中断计数保护

volatile u8 xdata flag_ADCSample = 0;       // AD采样时的通道切换标志

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

volatile u8 xdata LastPhase = 0;

volatile u8 xdata SamePhaseCnt = 0;

// 电转速60度时间

volatile bit flag_SpeedTime = 0;

volatile u8 xdata SpeedTimeCnt = 0;

volatile u16 xdata SpeedTime = 0;

volatile u16 xdata SpeedTimeTemp = 0;

volatile u32 xdata SpeedTimeSum = 0;

volatile u16 xdata MotorSpeed = 0;

volatile u16 xdata UserRequireSpeed = 0;        // 用户请求转速

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

// 保护计数

volatile u8 xdata VoltageProCnt = 0;

volatile u8 xdata CurrentPgaProCnt = 0;

volatile u8 xdata CurrentProCnt = 0;

#if(SENSORMODE)

volatile u8 xdata NowHallState = 0;        // HALL当前位置

volatile u8 xdata PreHallState = 0;        // 前次HALL位置

volatile bit flag_HallStateRight = 0;

volatile u16 xdata OverflowCnt = 0;        // PWM1捕获上溢中断计数

#else

volatile u16 xdata NeutralPoint = 0;

volatile u16 xdata UBemf = 0;

volatile u16 xdata VBemf = 0;

volatile u16 xdata WBemf = 0;

volatile u8 xdata BlankingCnt = 0;

volatile u8 xdata CheckZeroCrossState = 0;

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

volatile u16 xdata ADCTimeCnt = 0;        // ADC中断计数

volatile u16 xdata DragTime = 0;

#endif

/*****************************************************************************

函 数 名  : Common_Init

功能描述  : 全局变量初始化

输入参数  : 无

输出参数  : void

*****************************************************************************/

void Common_Init()

{

Phase = 0;

NextPhase = 0;

TuneDutyRatioCnt = 0;

PWMDutyCycle = PWM_DUTYCYCLE_05;

CurrentPgaSample = 0;

CurrentSample = 0;        // 电流采样值

VoltageSample = 0;        // 电压采样值

UserSpeedSample = 0;

ADCIntProtectCnt = 0;

flag_ADCSample = 0;

flag_ErrorException = 0;

LastPhase = 0;

SamePhaseCnt = 0;

flag_SpeedTime = 0;

SpeedTimeCnt = 0;

SpeedTime = 0;

SpeedTimeTemp = 0;

SpeedTimeSum = 0;

MotorSpeed = 0;

UserRequireSpeed = 0;        // 用户请求转速

RheostatCnt = 0;

VoltageProCnt = 0;

CurrentPgaProCnt = 0;

CurrentProCnt = 0;

#if(SENSORMODE)

NowHallState = 0;

PreHallState = 0;

flag_HallStateRight = 0;

……………………

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

复制代码

所有资料51hei提供下载:

JMT18F003 BLDC资料.rar(6.03 MB, 下载次数: 268)

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章