大家好,又见面了,我是你们的朋友全栈君。
上封帖子介绍了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
单片机源程序如下:
#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)
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/128976.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...