找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1430|回复: 2
打印 上一主题 下一主题
收起左侧

BLCD无刷电机仿真模型 附单片机程序

[复制链接]
跳转到指定楼层
楼主
BLDC无刷电机的驱动都是用方波,我想了想。能不能简化一下。STC8G单片机IO口输出频率可以到30KHZ左右的。
然后直接用3个IO口PWM方式驱动三个2104单端半桥驱动。组成120度正玄波呢?
在利用反馈追频率不就可以想怎么控制就怎么控制了吗?
说干就干。
代码非常简单。驱动方式采用两两导通制
电路原理图如下:



单片机源程序如下:
#include <stc8.h>                        //调用51常规库头文件
#include <INTRINS.H>
#define uint unsigned int   //宏命令,声明uint替代unsignde int
#define uchar unsigned char        //宏命令,声明uchar替代unsigned char

sbit a=P2^0;
sbit b=P2^1;
sbit c=P2^2;
sbit hla=P2^3;            //外接393比较器 检测A相
sbit hlb=P2^4;           //外接393比较器  检测B相
sbit hlc=P2^5;           //外接393比较器  检测C相

uchar pwm,num,mod,ym;
uchar scnt;
uchar azkb,bzkb,czkb;

void main()                                        //主程序
{  
   P0M0=0X00;
   P0M1=0X00;
   P1M0=0X00;
   P1M1=0X00;
   P2M0=0X00;
   P2M1=0X00;
   P4M0=0X00;
   P4M1=0X00;
   P5M0=0X20;
   P5M1=0X00;
   P6M0=0X00;
   P6M1=0X00;
   P7M0=0X00;
   P7M1=0X00;
   P3M1=0x00;                                 
   P3M0=0x00;

   ym=100;  //油门                                

   azkb=5;
   bzkb=5;
   czkb=5;                        
   while(1)
   {

        pwm++;if(pwm>11){pwm=0;}
        mod++;
        if(mod>ym)
        {
        switch(num)
         {
          case 0 : if(azkb<9){azkb++;} if(bzkb>1){bzkb--;} if(czkb>5){czkb--;} if(hlc==0&scnt==0){scnt=1;}if(hlc==1&scnt==1){scnt=2;} if(hlc==0&scnt==2){scnt=0;num=1;} break;         //AB    检测C相过零点,并且经过两次上升沿滤波
          case 1 : if(azkb<9){azkb++;} if(bzkb<5){bzkb++;} if(czkb>1){czkb--;} if(hlb==0&scnt==0){scnt=1;}if(hlb==1&scnt==1){scnt=2;} if(hlb==0&scnt==2){scnt=0;num=2;} break;         //AC   检测B相过零点,并且经过两次上升沿滤波
          case 2 : if(azkb>5){azkb--;} if(bzkb<9){bzkb++;} if(czkb>1){czkb--;} if(hla==0&scnt==0){scnt=1;}if(hla==1&scnt==1){scnt=2;} if(hla==0&scnt==2){scnt=0;num=3;} break;         //BC   检测A相过零点,并且经过两次上升沿滤波
          case 3 : if(azkb>1){azkb--;} if(bzkb<9){bzkb++;} if(czkb<5){czkb++;} if(hlc==0&scnt==0){scnt=1;}if(hlc==1&scnt==1){scnt=2;} if(hlc==0&scnt==2){scnt=0;num=4;} break;         //BA   检测C相过零点,并且经过两次上升沿滤波
          case 4 : if(azkb>1){azkb--;} if(bzkb>5){bzkb--;} if(czkb<9){czkb++;} if(hlb==0&scnt==0){scnt=1;}if(hlb==1&scnt==1){scnt=2;} if(hlb==0&scnt==2){scnt=0;num=5;} break;         //CA   检测B相过零点,并且经过两次上升沿滤波
          case 5 : if(azkb<5){azkb++;} if(bzkb>1){bzkb--;} if(czkb<9){czkb++;} if(hla==0&scnt==0){scnt=1;}if(hla==1&scnt==1){scnt=2;} if(hla==0&scnt==2){scnt=0;num=0;} break;         //CB  检测A相过零点,并且经过两次上升沿滤波
         }
         mod=0;
        }

        if(pwm>azkb){a=0;} else{a=1;}
        if(pwm>bzkb){b=0;} else{b=1;}
        if(pwm>czkb){c=0;} else{c=1;}

   }
}


最后查看输出波形



可以看到输出的阶梯波。主要是我仿真的BLDC模型电感设置得太小了。之后0.01UH。
下面再看我把BLDC电感设置为0.1UH的波形。



评分

参与人数 1黑币 +80 收起 理由
admin + 80 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:718536 发表于 2023-3-3 22:07 | 只看该作者
检测过零点,就跟音箱过零保护一样,原理是检测音箱磁铁的反电动势,检测到直流电就保护。我这里是检测到直流(即转子跨越定子磁场)就换相。切换下一步相序形成追频接力。
回复

使用道具 举报

板凳
ID:1060905 发表于 2023-8-18 10:50 | 只看该作者
可以看看工程不
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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