BLDC無刷電機的驅動都是用方波,我想了想。能不能簡化一下。STC8G單片機IO口輸出頻率可以到30KHZ左右的。
然后直接用3個IO口PWM方式驅動三個2104單端半橋驅動。組成120度正玄波呢?
在利用反饋追頻率不就可以想怎么控制就怎么控制了嗎?
說干就干。
代碼非常簡單。驅動方式采用兩兩導通制
電路原理圖如下:
BLDC仿真.png (67.02 KB, 下載次數: 72)
下載附件
2023-3-3 21:55 上傳
單片機源程序如下:
#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.png (59.93 KB, 下載次數: 56)
下載附件
2023-3-3 21:56 上傳
可以看到輸出的階梯波。主要是我仿真的BLDC模型電感設置得太小了。之后0.01UH。
下面再看我把BLDC電感設置為0.1UH的波形。
BLDC仿真2.png (132.24 KB, 下載次數: 65)
下載附件
2023-3-3 22:01 上傳
|