|
非常感謝 我也整段示例代碼吧 直接源碼
#include <reg51.h>
#define FOSC 11059200L
#define BAUD 9600
#define TIMER_CLOCK 921600L
sbit IN1 = P1^0; //引腳定義
sbit IN2 = P1^1;
sbit IN3 = P1^2;
sbit IN4 = P1^3;
unsigned char code PWM_HL[8] = {0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x3F}; //PWM占空比
void delay_us(unsigned char i)
{
while(i--);
}
void delay_ms(unsigned char i)
{
unsigned char j;
while(i--)
for(j = 0; j < 110; j++);
}
void Timer0Init()
{
TMOD &= 0xF0;
TMOD |= 0x01; //16位計(jì)數(shù)器模式
TH0 = 0x3C;
TL0 = 0xB0;
ET0 = 1;
TR0 = 1;
EA = 1;
}
void SerialInit()
{
PCON = 0x00;
SCON = 0x50;
TMOD |= 0x20; //Timer1為8位自動(dòng)重載定時(shí)器模式
TH1 = 256-((FOSC/12/32)/BAUD);
TL1 = TH1;
TR1 = 1;
}
void PWM(unsigned char speed)
{
unsigned char i;
if(speed > 7)
speed = 7;
for(i = 0; i < 500; i++)
{
if(speed > i >> 8)
IN1 = 1;
else
IN1 = 0;
if(speed > i >> 6)
IN2 = 1;
else
IN2 = 0;
if(speed > i >> 4)
IN3 = 1;
else
IN3 = 0;
if(speed > i >> 2)
IN4 = 1;
else
IN4 = 0;
delay_us(1);
}
}
void main()
{
SerialInit();
Timer0Init();
while(1)
{
PWM(5);
delay_ms(2000);
PWM(2);
delay_ms(2000);
}
}
void Timer0_ISR() interrupt 1
{
static unsigned char count = 0;
static unsigned char speed = 0;
TH0 = 0x3C;
TL0 = 0xB0;
count ++;
if(count >= 10)
{
count = 0;
if(SBUF > 10)
speed = SBUF - 10;
else
speed = 0;
}
PWM(speed);
TF0 = 0;
}
```
在此示例中,我們使用了定時(shí)計(jì)數(shù)器Timer0來(lái)產(chǎn)生控制無(wú)刷電機(jī)(4相)的PWM信號(hào)。通過(guò)修改定時(shí)器的計(jì)數(shù)方式和TH0、TL0寄存器的值,可以實(shí)現(xiàn)不同的PWM頻率和占空比。具體實(shí)現(xiàn)步驟為:
1. 根據(jù)控制要求,定義引腳和占空比常量
2. 初始化定時(shí)器Timer0,并編寫相應(yīng)的定時(shí)器中斷服務(wù)函數(shù)Timer0_ISR()
3. 初始化串口通信,并在主函數(shù)中調(diào)用PWM()函數(shù)來(lái)控制無(wú)刷電機(jī)的速度和方向 |
|