发 帖  
原厂入驻New
[文章]

国产51单片机驱动无刷电机精髓资料!

2016-1-25 14:27:29  12701 51单片机 无刷电机
分享
13
推荐课程:
张飞软硬开源:基于STM32的BLDC直流无刷电机驱动器(视频+硬件)  
http://url.elecfans.com/u/73ad899cfd


很多人在做单片机控制电机,有不少用C8051做无感无刷电机的驱动的,在网上看见一个用国产51单片stc15W408AS驱动无刷电机的驱动资料。感觉不错,分享给大家。

源程序文件在这里下载
STC15W404AS程序.zip (43.24 KB, 下载次数: 296 )

1.硬件设计
主控单片机使用STC15W408AS,单片机自带硬件PWM模块、ADC模块和比较器模块,所以非常适合做无刷电机的驱动,主频35M,无需外部晶振和复位电路,接好VCCGND就可以工作。半桥电路使用PMOS+NMOS的组合,PMOSIRF9540NMOSIRF540.驱动芯片TC4427A
STC51驱动BLDC1.jpg
先在洞洞板上做实验吧。原理图如下所示,懒得用软件画了,还是手画来得快些。下面的图中,只画出了A相的桥,B相和C相的桥与A相一样。
BLDC原理图.jpg

依照原理图,焊接好的板子如下图所示:
3.jpg
2.软件设计
2.1PWM模块
PWM模块用来产生可调占空比,目的是为了给电机施加一定的电压,占空比越大,施加的电压越大,电机转的越快。反之,占空比越小,电机转的越慢。
void PWM_Init(void)
{
PWM0_L=0;
PWM1_L=0;
PWM2_L=0;

CMOD=0X0C; //选择系统时钟/6时钟源,即频率=35M/6/256=22.8K
CL=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;
}
2.2ADC模块和比较器模块
比较器用来做反电动势的过零检测,选择P5.4引脚为比较器的负输入端,选择ADC通道为比较器的正输入端。
void CMP_Init(void) // 比较器初始化函数
{
CMPCR1=0X8C; // 打开比较器,把P5.4引脚设置为负输入端,ADC通道为正输入端
CMPCR2=50;// 延时消抖时间设置
}
void ADC_Init(void) // ADC模块初始化
{
P1ASF = 0X38; //开通P1.3 P1.4 P1.5端口的模拟输入端
}
2.3六步时序换相
BLDC的六步时序为AB AC BC BA CA CB,下面程序中,分别用0~5表示每一步。
void StepXL(void) // 换相序列函数
{
switch(Step)
{
  case 0: // AB
  CCAP0H=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=0x9c; // 使能下降沿中断

  break;
  case 1: // AC
  CCAP0H=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=0xac; // 使能上升沿中断

  break;
  case 2: // BC
  CCAP0H=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=0x9c;// 使能下降沿中断

  break;
  case 3: // BA
  CCAP0H=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=0xac; // 使能上升沿中断

  break;
  case 4: // CA
  CCAP0H=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=0x9c; // 使能下降沿中断

  break;
  case 5: // CB
  CCAP0H=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=0xac; // 使能上升沿中断

  break;
  default:break;
}
}
2.4电机启动函数
char QiDong(void)
{
unsigned int timer = 300,i;
DISABLE_CMP_INT;
PWM_Value = 26; // 占空比=26/256=10%
Step=0;
StepXL();
delay_ms(100);
while(1)
{
  for(i=0;i<timer; i++)
  {
   delay_us(100); //
  }
  timer-= timer/15+1;
  if(timer < 25) return(1);
  if(Step<5)Step++;
  else Step=0;
  StepXL();
}
}
2.5闭环控制
电机启动以后,需要闭环控制电机的通电时序和速度。这个在比较器的中断函数里面实现。
void CMP_INT(void) interrupt 21 // 比较器中断函数
{
CMPCR1 &=~0X40; // 需软件清除中断标志位
if(Step<5)Step++;
else Step=0;
StepXL();
}
ADC转换结束后,必须软件清除转换标志,再重新开启ADC转换
void ADC_ISR() interrupt 5
{
ADC_CONTR&=0xEF; // ADC转换标志
ADC_CONTR|=0X08; // 启动ADC转换
}
2.6通信控制接口
用电脑上的串口调试助手给单片机串口发送启动”“加速”“减速”“停止命令。这个功能放到主函数while循环中。
串口初始化函数:
void serial_open(void)
{
SCON = 0X50;//工作在串口模式
AUXR |= 0X04;//
TL2 = 0X71;// 9600 @35MHz
TH2 = 0Xfc;
AUXR|=0X10;
}
主函数:
void main(void)
{
uchar rec=0; // 定义串口接收数据变量

PWM_Init(); // 初始化PWM
ADC_Init(); // 初始化ADC
CMP_Init(); // 初始化比较器
serial_open(); // 打开串口

while (1)
{
  if(RI) // 如果串口收到数据
  {
   rec=SBUF; // 把收到的数据给了rec
   RI=0; // 串口接收标志清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; // 打开全局中断
   }
   else if(rec==0x44) // 停止命令
   {
    CCAP0H=0;CCAP1H=0;CCAP2H=0;  // 占空比都置0
    EA=0; // 关闭全局中断
    DISABLE_CMP_INT; // 关闭比较器中断
   }
  }
}
}
3.总结
上面的软件和硬件,只是实现了简单的控制转动。缺点:1.没有任何的保护程序,比如电流检测、堵转保护等。在做实验的过程中,烧了2PMOS1NMOS3TC4427A.2.比较器过0直接换相,有些提前。电机转动噪音比较大。

sleep0000 2016-4-22 10:59:54
精品啊,酷爱51,谢谢楼主
回复

举报

未央 2016-4-29 17:45:42
可以啊                                                                                             
回复

举报

诗和远方1515 2016-5-3 23:52:26
谢谢楼主,想尝试一下
回复

举报

陈光江 2016-5-4 08:51:56
谢谢分享
回复

举报

张宏范 2017-4-23 11:06:29
xiexielouzhufenxiang
回复

举报

杨永勋 2017-5-4 10:38:18
学好技术,做好产品,感谢分享
回复

举报

小王 2017-5-23 22:23:50
学到了
回复

举报

wayenliu 2017-8-28 16:55:46
不懂,帮顶
回复

举报

王栋春 2017-9-2 21:28:13
感谢楼主分享   这个可以用来作为模板 进行升级改造
回复

举报

oyc 2017-10-15 20:08:39

谢谢分享
回复

举报

川楠 2017-10-16 17:57:47
为了正义,为了积分,多谢分享
回复

举报

乘风506 2017-11-9 21:01:37
谢谢了
回复

举报

乘风506 2017-11-9 21:01:50
楼主好人,感谢
回复

举报

吴微 2017-12-2 17:31:15
学习学习
回复

举报

落叶归根 2017-12-15 10:55:21
STC15W408AS驱动无刷电机的驱动资料 感谢分享
回复

举报

李典海 2017-12-15 18:01:21
楼主好人。多谢楼主
回复

举报

hu429615918 2017-12-29 17:42:43
来到这真不错啊
回复

举报

SXXYC 2018-1-27 11:59:38
谢谢楼主,想尝试一下
回复

举报

秦荣喜 2018-2-3 16:25:43
好东西!谢谢分享!
回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
123下一页
发文章
关闭

站长推荐 上一条 /4 下一条

快速回复 返回顶部 返回列表