设计思路:
直流电机PWM控制系统的主要功能包括:实现对直流电机的加速、减速以及电机的正转、反转和急停,并且可以调整电机的转速,能够很方便的实现电机的智能控制。 主体电路:即直流电机PWM控制模块。这部分电路主要由AT89C52单片机的I/O端口、定时计数器、外部中断扩展等控制直流电机的加速、减速以及电机的正转和反转,并且可以调整电机的转速,能够很方便的实现电机的智能控制。其间是通过AT89C52单片机产生脉宽可调的脉冲信号并输入到L298驱动芯片来控制直流电机工作的。该直流电机PWM控制系统由以下电路模块组成: 设计输入部分:这一模块主要是利用带中断的独立式键盘来实现对直流电机的加速、减速以及电机的正转、反转和急停控制。 设计控制部分:主要由AT89C52单片机的外部中断扩展电路组成。直流电机PWM控制实现部分主要由一些二极管、电机和L298直流电机驱动模块组成。 设计显示部分: LED数码显示部分,实现对PWM脉宽调制占空比的实时显示。
系统框架设计: 仿真运行: 程序部分: ********************************************************************* 直流电机PWM调速 功能描述:使用单片机T0定时器产生(xxxHz)脉宽调制信号,输到L298N的EN_A 实现双直流电机的速度调控。 修订日期:2011-5-7 *********************************************************************/ #include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int
/********************************************************************** L298n接口定义 **********************************************************************/ sbit MOTOR_A_2=P3^6; sbit MOTOR_A_1=P3^7; sbit EN_MOTOR_A =P3^4; sbit k1=P1^5; sbit k2=P3^1; sbit k3=P3^2; sbit k4=P3^3; uchar T=0; uchar W=0; uchar A=0; uchar k=0; uchar i=0;
uchar code table1[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};
uchar code table2[]={0xef,0xbf,0xdf,0x7f};
void delayms(uint t); /********************************************************************** 数码管显示 **********************************************************************/ void disp(void) { P0=table2[3]; P2=table1[W%10]; delayms(1); P0=0xff;
P0=table2[2]; P2=table1[W/100]; delayms(1); P0=0xff;
P0=table2[1]; P2=table1[W/10%10]; delayms(1); P0=0xff;
P0=table2[0]; P2=table1[A]; delayms(1); P0=0xff; }
/********************************************************************** 定时器变量定义 **********************************************************************/
void init(void) { TMOD=0x01; EA=1; ET0=1; TR0=1; //设置定时时间 TH0=0xfd; TL0=0x17; } void timer0() interrupt 1 { TL0=0x17; TH0=0xff; T++; disp(); if(T>W) EN_MOTOR_A=1; else EN_MOTOR_A=0; if(T==100) T=0;
} /********************************************************************** 延时1ms **********************************************************************/ void delayms(uint t) { ucharj; while(t--) { for(j=0;j<250;j++) { _nop_(); _nop_(); _nop_(); _nop_(); } }
}
|