非常感谢 我也整段示例代码吧 直接源码 #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位计数器模式 TH0 = 0x3C; TL0 = 0xB0; ET0 = 1; TR0 = 1; EA = 1; } void SerialInit() { PCON = 0x00; SCON = 0x50; TMOD |= 0x20; //Timer1为8位自动重载定时器模式 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; } ``` 在此示例中,我们使用了定时计数器Timer0来产生控制无刷电机(4相)的PWM信号。通过修改定时器的计数方式和TH0、TL0寄存器的值,可以实现不同的PWM频率和占空比。具体实现步骤为: 1. 根据控制要求,定义引脚和占空比常量 2. 初始化定时器Timer0,并编写相应的定时器中断服务函数Timer0_ISR() 3. 初始化串口通信,并在主函数中调用PWM()函数来控制无刷电机的速度和方向 |
非常感谢你的资料 |
刚好需要学习电调DIY,非常感谢你的资料,我将竭尽所能学习,不浪费你的心血 |
资料非常好,值得推荐 |
非常好的直流电机设计资料 |
感谢分享 |
好资料,感谢分享 |