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的波形。
|