STC15W408AS无感BLDC电机驱动程序


  • 本程序来源于开源《51单片机STC15W404AS驱动无感无刷电机BLDC 开源》

原项目作者,实现了基本的BLDC无感电机的控制功能,如果你想借用请仔细阅读作者的开源文档。

  • 在这里主要是针对程序进行验证,采用逻辑分析仪,采集3路PWM引脚信号来参看驱动时的运行效果。
  • 通过串口发送指令来控制。

逻辑分析仪工具

  • Logic采集的数据情况(采集的是U V W)

  • 采用自制的STC15W408AS开发板

  • 《【开源分享】自制STC15W408AS开发板》

  • 程序采用的是内部晶振,频率选择35MHz

串口调试命令说明

程序代码

/******************************************/
//
// 该程序工作的主频是35MHz
// STC15W408AS
// 作者:瑞生
// 博客:http://www.rationmcu.com
//
/******************************************/#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int/* STC15W408AS寄存器补充 */
sfr AUXR1 = 0XA2;
sfr CCON = 0XD8;
sfr CMOD = 0XD9;
sfr CCAPM0 = 0XDA;
sfr CCAPM1 = 0XDB;
sfr CCAPM2 = 0XDC;sfr CL     = 0xE9;
sfr CCAP0L = 0xEA;
sfr CCAP1L = 0xEB;
sfr CCAP2L = 0xEC;
sfr CH     = 0xF9;
sfr CCAP0H = 0xFA;
sfr CCAP1H = 0xFB;
sfr CCAP2H = 0xFC;sbit CF    = CCON^7;
sbit CR    = CCON^6;
sbit CCF2  = CCON^2;
sbit CCF1  = CCON^1;
sbit CCF0  = CCON^0;sbit PPCA = IP^7;sfr P2M1 = 0X95;
sfr P2M0 = 0X96;sfr CMPCR1 = 0XE6;
sfr CMPCR2 = 0XE7;sfr AUXR = 0X8E;
sfr TH2 = 0XD6;
sfr TL2 = 0XD7;
sfr P4 = 0xc0;
sfr P5 = 0xc8;sfr PCA_PWM0 = 0XF2;
sfr PCA_PWM1 = 0XF3;
sfr PCA_PWM2 = 0XF4;sfr P1ASF = 0X9D;
sfr ADC_CONTR = 0XBC;
sfr PCON2 = 0X97;sfr SPSTAT      =   0xCD;   //
sfr SPCTL       =   0xCE;   //
sfr SPDAT       =   0xCF;   //
//按键控制 启动 加速 减速 停转
sbit ADD = P1^2;
sbit DEL = P5^5;sbit PWM2_L = P3^2;
sbit PWM1_L = P3^3;
sbit PWM0_L = P3^6;#define DISABLE_CMP_INT CMPCR1&=0X7F // 关闭比较器
#define ENABLE_CMP_INT CMPCR1|=0X80 // 打开比较器/*************************/unsigned char Step=0; // 换相步骤
unsigned char PWM_Value=0; // 决定PWM占空比的值
unsigned char QD_Sign=0; // 0 没有启动 1启动void Delay1ms()      //@35MHz
{unsigned char i, j;i = 35;j = 8;do{while (--j);} while (--i);
}void delay_ms(unsigned int ms)
{while(ms){Delay1ms();ms=ms-1;}
}void Delay1us()        //@35MHz
{unsigned char i;_nop_();i = 6;while (--i);
}void delay_us(unsigned int us)
{while(us){Delay1us();us=us-1;}
}
// 换相序列函数
void StepXL(void)
{switch(Step){case 0:  // ABCCAP0H=PWM_Value;CCAP1H=0;CCAP2H=0; // 打开A相的高端PWM0_L=0;PWM2_L=0;PWM1_L=1; // 打开B相的低端ADC_CONTR = 0XED; // 选择P1.5作为ADC输入 即c相电压CMPCR1&=0xDF; // PIE=0,关闭上升沿中断CMPCR1|=0x10; // NIE=1,使能下降沿中断break;case 1:  // ACCCAP0H=PWM_Value;CCAP1H=0;CCAP2H=0; // 打开A相的高端PWM0_L=0;PWM1_L=0;PWM2_L=1; // 打开C相的低端ADC_CONTR = 0XEC; // 选择P1.4作为ADC输入 即B相电压CMPCR1&=0xEF; // NIE=0 ,关闭下降沿中断CMPCR1|=0x20; // PIE=1,使能上升沿中断break;case 2:  // BCCCAP0H=0;CCAP2H=0;CCAP1H=PWM_Value; // 打开B相的高端PWM0_L=0;PWM1_L=0;PWM2_L=1; // 打开C相的低端ADC_CONTR = 0XEB; // 选择P1.3作为ADC输入 即a相电压CMPCR1&=0xDF; // PIE=0,关闭上升沿中断CMPCR1|=0x10; // NIE=1,使能下降沿中断break;case 3:  // BACCAP0H=0;CCAP2H=0;CCAP1H=PWM_Value; // 打开B相的高端PWM1_L=0;PWM2_L=0;PWM0_L=1; // 打开A相的低端ADC_CONTR = 0XED; // 选择P1.5作为ADC输入 即c相电压CMPCR1&=0xEF; // NIE=0 ,关闭下降沿中断CMPCR1|=0x20; // PIE=1,使能上升沿中断break;case 4: // CACCAP0H=0;CCAP1H=0;CCAP2H=PWM_Value; // 打开C相的高端PWM1_L=0;PWM2_L=0;PWM0_L=1; // 打开A相的低端ADC_CONTR = 0XEC; // 选择P1.4作为ADC输入 即B相电压CMPCR1&=0xDF; // PIE=0,关闭上升沿中断CMPCR1|=0x10; // NIE=1,使能下降沿中断break;case 5: // CBCCAP0H=0;CCAP1H=0;CCAP2H=PWM_Value;// 打开C相的高端PWM0_L=0;PWM2_L=0;PWM1_L=1; // 打开B相的低端ADC_CONTR = 0XEB; // 选择P1.3作为ADC输入 即a相电压CMPCR1&=0xEF; // NIE=0 ,关闭下降沿中断CMPCR1|=0x20; // PIE=1,使能上升沿中断break;default:break;}
}/*****************串口配置函数**********************/
void serial_open(void)
{SCON = 0X50;//工作在串口模式AUXR |= 0X04;//TL2 = 0X71;// 9600 @35MHzTH2 = 0Xfc;AUXR|=0X10;//
}/******************串口发送数据函数********************/void senddata(uchar data_buf){SBUF = data_buf;while(!TI);TI = 0;}// PWM初始化函数
void PWM_Init(void)
{PWM0_L=0;PWM1_L=0;PWM2_L=0;CMOD=0X0C; //选择系统时钟/6为时钟源,即频率=35M/6/256=22.8KCL=0;            // PCA计数器清零CH=0;PCA_PWM0 = 0X00;CCAP0H=0;    // 初始化占空比为0% H的值装载到L中CCAP0L=0;CCAPM0=0x42;    // 设置为PWM模式PCA_PWM1 = 0X00;CCAP1H=0;    // 初始化占空比为0%CCAP1L=0;CCAPM1=0x42;   // 设置为PWM模式PCA_PWM2 = 0X00;CCAP2H=0;    // 初始化占空比为0%CCAP2L=0;CCAPM2=0x42;   // 设置为PWM模式CR = 1;
}
// ADC初始化函数
void ADC_Init(void)
{P1ASF = 0X38; // 开通P1.3 P1.4 P1.5的AD输入口ADC_CONTR=0XE0; // 打开ADC电源 设置最大转换速度IE|=0X20; // EADC=1 允许ADC中断
}void ADC_ISR() interrupt 5
{ADC_CONTR&=0xEF; // 清ADC转换标志ADC_CONTR|=0X08; // 启动ADC转换
}// 比较器启动函数
void CMP_Init(void)
{CMPCR1=0X0c; // P5.4作为比较器的反相输入端,ADC引脚作为正输入端 CMPCR2=0x10;// 个时钟滤波
}
// 比较器中断函数
void CMP_ISR(void) interrupt 21
{CMPCR1 &=0XBF; // 需软件清除中断标志位TH0=0x00; // 给定时器初值TL0=0X00;if(Step<5)Step++;else Step=0;StepXL();
}// 电机启动函数
unsigned char QiDong(void)
{unsigned int timer = 300,i;DISABLE_CMP_INT;PWM_Value = 20; // 占空比=20/256=7.8%Step=0;StepXL();delay_ms(5);while(1){for(i=0;i<timer; i++) {delay_us(50);  //} timer-= timer/15+1;if(timer < 25) {QD_Sign=1; // 标志已经启动return(1);}if(Step<5)Step++;else Step=0;StepXL();}
}
// 定时器0初始化函数
void T0_Iint(void)
{TMOD=0X01; // T0工作于16位计数模式TH0=0x00; //TL0=0X00;ET0=1;// 允许ET0中断
}// 定时器0中断函数(如果进入定时器0中断,代表电机停转,用于保护)
void T0_ISR(void) interrupt 1
{PWM0_L=0;PWM1_L=0;PWM2_L=0;CCAP0H=0;CCAP1H=0;CCAP2H=0;  // 占空比为0TR0=0;EA=0;DISABLE_CMP_INT;TH0=0x00; //TL0=0X00;QD_Sign=0; // 标志没有启动QiDong(); // 再次启动ENABLE_CMP_INT; // 打开比较器中断EA=1; // 打开总中断TR0=1; // 打开定时器0
}/**********************************************/
void main(void)
{uchar rec=0; // 串口接收数据
//  uchar i;PWM_Init(); // 初始化PWMADC_Init(); // 初始化ADCCMP_Init(); // 初始化比较器serial_open(); // 打开串口T0_Iint(); // 定时器0初始化(如果进入定时器0中断,代表电机停转,用于保护)while (1){// 如果串口收到数据(这部分是串口控制 启动 加速 减速 停转)if(RI) {rec=SBUF; // 把接收到的数据给了recRI=0; // 清串口接收标志if(rec==0x22) // 加速{if(PWM_Value<250){PWM_Value++; // 增加占空比}}else if(rec==0x33) // 减速{if(PWM_Value>10){PWM_Value--; // 减小占空比}}else if(rec==0x11) // 电机启动{QiDong(); // 启动ENABLE_CMP_INT; // 打开比较器中断EA=1; // 打开总中断TR0=1; // 打开定时器0}else if(rec==0x44) // 停转{CCAP0H=0;CCAP1H=0;CCAP2H=0;  // 占空比为0PWM0_L=0;PWM1_L=0;PWM2_L=0;EA=0; // 关总中断DISABLE_CMP_INT; // 关比较器中断}senddata(SBUF);}// 此部分是按键控制 启动 加速 减速 停转if(ADD==0) // 按下了增加加速按键{delay_ms(20);if(ADD==0){if(QD_Sign==0)// 如果没有启动{QiDong(); // 启动ENABLE_CMP_INT; // 打开比较器中断EA=1; // 打开总中断TR0=1; // 打开定时器0}else if(PWM_Value<250){PWM_Value++; // 增加占空比}}}else if(DEL==0) // 按下了减速按键{delay_ms(20);if(DEL==0){if(PWM_Value>10) {PWM_Value--; // 减小占空比}else // 停转{CCAP0H=0;CCAP1H=0;CCAP2H=0;  // 占空比为0PWM0_L=0;PWM1_L=0;PWM2_L=0;TR0=0;EA=0;DISABLE_CMP_INT;TH0=0x00; //TL0=0X00;QD_Sign=0; // 标志没有启动}}}}
}

STC15W408AS无感BLDC电机驱动程序相关推荐

  1. 基于 EG6831 的无感 BLDC 控制方案

    屹晶微电子有限公司 版本号:V1.11 电机控制解决 方案 Motor Control Solution ---------基于 EG6831 的无感 BLDC 控制方案屹晶微电子有限公司 基于 EG ...

  2. FOC 无感 代码 算法 电机控制 PMSM 基于中颍SH32F2601的洗衣机量产无感bldc控制方案,电机控制算法完全手写

    FOC 无感 代码 算法 电机控制 PMSM 基于中颍SH32F2601的洗衣机量产无感bldc控制方案,电机控制算法完全手写,MCU寄存器配置完全手写,未用到任何库文件 ID:34500065518 ...

  3. 低压无感BLDC方波控制方案 反电动势和比较器检测位置 带载满载启动

    低压无感BLDC方波控制方案 反电动势和比较器检测位置 带载满载启动! 1.启动传统三段式,但是我强拖的步数少,启动很快,基本可以做到任意电机启动切闭环. 2.入门方波控制的程序和原理图,方案简单,可 ...

  4. GC5958三相无刷(BLDC)无感正弦波电机驱动芯片 替代APX9358

    GC5958 是一款三相无刷无感直流电机驱动控制电路,GC5958采用无感正弦波的驱动方式,更有效的降低产品噪声.GC5358功能包括启动电路.反电动势换向控制.脉宽调制(PWM)速度控制.锁定保护和 ...

  5. bldc不同载波频率_有刷CD电机好用还是无刷BLDC电机好用?该选那个?

    无刷直流电机 (BLDC电机/BLDC直流电机) 图二:直流无刷电机(BLDC电机) 无刷直流(BLDC)电机可以想像成与有刷直流电机截然相反,其中永久磁性在转子上,而绕线在定子上.因此,该电机没有刷 ...

  6. 无感FOC电机参数测量方法

    无感FOC需要实时观测反向电动势来判断转子的电气角和转速.观测反向电动势时,一方面需要每个PWM周期采集相电压和电流,另一方面需要提前测量出电机的极对数.反电势常数.定子线圈的相电阻和相电感.下面是测 ...

  7. diy无感无刷电机霍尔安装_51 MCU,BLDC有感无感全开源,轻松实践直流无刷电机控制(程序+电路详解)...

    上封帖子介绍了51单片机,JMT18F003PLUS,提供了芯片例程和资料,链接如下: JMT18F003PLUS单片机芯片手册,例程等资料下载 http://www.51hei.com/bbs/dp ...

  8. AC7811-BLDC无感控制代码详解

    BLDC控制框图 BLDC 的控制电路对电机转子位置信号进行逻辑变换后产生脉宽调制 PWM 信号,驱动逆变器的功率开关管,从而控制 BLDC 电机各相绕组按一定顺序工作,在电机气隙中产生跳跃式旋转磁场 ...

  9. 无刷无霍尔BLCD电机控制

    声明:本文出自百度文库无刷无霍尔电机控制,因为该文为繁体,看起来特别别扭,特此翻译. 文库网址: https://wenku.baidu.com/view/b99217dca0116c175f0e48 ...

最新文章

  1. ApacheCN 数据科学/人工智能/机器学习知识树 2019.2
  2. Swfit Array 遍历 map flatMap filter reduce
  3. Git - ‘假设未改变‘和‘跳过工作树‘之间的区别
  4. mysql处理存在则更新,不存在则插入(多列唯一索引)
  5. mysql中文乱码解决方案_Mysql中文乱码解决方案
  6. 深度模拟java动态代理实现机制系类之三
  7. 创建python虚拟环境,安装django,创建一个django项目,在项目中创建一个应用(ubuntu16.04)...
  8. css线条伸缩_伸缩布局(CSS3)
  9. “对不起,我们只招父母毕业于名牌院校的孩子”:最可怕的,是你还以为学历不重要...
  10. 在NetBeans,Eclipse,IntelliJ,OpenShift和Maven上使用WildFly 9
  11. 前端学习(2007)vue之电商管理系统电商系统之优化复选框的样式
  12. 3563: DZY Loves Chinese - BZOJ
  13. Firefox 按一下Alt键 出现菜单!
  14. 原创 | 一文了解人工智能对精准扶贫的作用及数字乡村建设现状
  15. floquet端口x极化入射波_hfss和cst电磁媒质色散曲线dispersiondiagram研究方法.pdf
  16. 管理理念:导致员工工作效率低下的8大原因
  17. 谷歌浏览器开发者模式
  18. java中成员方法_java中的成员变量和方法
  19. windows无法自动修复此计算机鼠标,win10 2.4g无线鼠标驱动异常怎么修复_win10 2.4g无线鼠标驱动出错处理方法...
  20. android 使用xposed安装器

热门文章

  1. 树莓派ibus输入法无法输入中韩文
  2. 基于电磁仿真软件CST的3.4-4GHz波导魔T设计
  3. 五种主流web报表工具的功能对比
  4. php把buffer转化为图片_php base64转换成图片的方法
  5. python朋友圈头像_用python一键生成头像墙,将你微信好友头像全部收集起来
  6. Win10自动修复错误无法开机
  7. 2023武汉中级工程师职称申报流程一览 秋禾火
  8. 今日头条一面问题随记
  9. 张钹、朱军团队获得 ICLR 2022 杰出论文奖
  10. KUKA 以太网安装包