请选择一款直流电动机,利用51单片机控制该直流电动机的转速,给出上述功能系统的硬件设计电路和软件设计程序。
硬件设计电路:
软件程序设计:
#include <REG51.H>
#define K 21/8
void UartInit(void);
void UART_SendByte(unsigned char Byte);
void Timer0Init(void);
sbit motor1_IN1=P0^0;
sbit motor1_IN2=P0^1;
sbit motor1_ENA1=P0^2;
sbit ADD=P0^3;
sbit SUBTRACT=P0^4;
unsigned char led_mod[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极字模
unsigned char led_point[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点字模
unsigned char counter,compare;//compare为占空比
unsigned int n,m,rad;//n为脉冲数
void delay(unsigned char time) //1ms@11.0592MHz
{
unsigned char i, j;
i = 15*time;
j = 90;
do
{
while (--j);
} while (--i);
}
void Display() //LED显示
{
P2=(0x01);
P1=led_mod[(rad/100)%10];
delay(1);
P2=(0x01<<1);
P1=led_mod[(rad/10)%10];
delay(1);
P2=(0x01<<2);
P1=led_point[rad%10];
delay(1);
P2=(0x01<<3);
P1=led_mod[(rad%10)];
delay(1);
}
void move(void) //启动电机
{
motor1_IN1=1;
motor1_IN2=0;
}
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFD; //设置定时初始值
TH1 = 0xFD; //设置定时初始值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //定时器1开始计时
ES=1; //开启中断
EA=1; //开启中断
PS=1; //设置优先级
}
void Timer0Init(void) //100微秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x02; //设置定时器模式
TL0 = 0xA4; //设置定时初始值
TH0 = 0xA4; //设置定时重载值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1; //定时器0中断开启
EA=1; //EA开启
PT0=0; //定时器0开始计时
}
void UART_Routine(void) interrupt 4 //串口接收中断
{
if(RI==1)
{
compare=SBUF; //接收串口传输来的数据
SBUF=compare; //将当前占空比发送回上位机
while(!TI); //等待发送完毕
TI=0; //标志位复位
RI=0; //标志位复位
}
}
void Timer0_Routine(void) interrupt 1 //定时器0中断,用于PWM生成
{
TL0 = 0xA4; //设置定时初始值
TH0 = 0xA4; //设置定时初始值
counter++;
m++;
counter%=100;
if(counter<compare) //PWM生成
motor1_ENA1=1;
else
motor1_ENA1=0;
if(m==500) //50ms后计算一次转速
{
rad=n*K;//计算转速,若结果与实际有较大误差则调整比例系数K
m=0;
n=0;
}
}
void interrupt0_int() //电机编码器脉冲中断初始化
{
IT0=1;
EX0=1;
EA=1;
PX0=0;
}
void motor_Routine(void) interrupt 0 //编码器脉冲中断函数
{
n++; //脉冲数+1
}
void main()
{
Timer0Init(); //定时器0初始化
interrupt0_int(); //电机编码器中断初始化
UartInit(); //串口中断初始化
compare=70; //初始占空比70%
n=0; //电机旋转圈数初始化
m=0; //计时次数初始化
move(); //启动电机
while(1)
{
if(ADD==0)
{
compare=compare+10; //按下按键占空比+10
if(compare>100)
compare=100;
while(!ADD) //等待松开
Display();
}
if(SUBTRACT==0)
{
compare=compare-10; //按下按键占空比-10
if(compare<0)
compare=0;
while(!SUBTRACT) //等待松开
Display();
}
Display();
}
}
实验原理:
1、直流电机及其控制
1.1直流电机:
输出或输入为直流电能得旋转电机,能实现直流电能和机械能互相转换的电机。当它作电动机运行时是直流电动机,将电能转换为机械能;作发电机运行时是直流发电机,将机械能转换为电能。
1.2直流电机的控制
(1)方向控制:直流电机只有正负极,只需交换正负极就可以调节正反转。
(2)转速控制:在负载变化不大的时候,加在直流电动机两端的电压大小与其速度近似成正比。
2、PWM技术
使用PWM对电极调速时,是靠改变占空比(改变脉冲宽度)来控制输出电压的,电压较小电机转速就会下降;再通过改变周期(脉冲的周期)来控制其输出频率,脉冲频率对电机的转速有着决定性作用,脉冲频率越高连续性就越好。我们一般时通过改变占空比来改变电机转速的。(占空比:占空比是指一个脉冲循环内,通电(高电平)时间相对于总时间所占的比例。)
2.1PWM的频率
是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);
也就是说一秒钟PWM有多少个周期 单位: Hz 表示方式: 50Hz 100Hz
2.2PWM的周期
T=1/f 周期=1/频率 50Hz = 20ms 一个周期
如果频率为50Hz ,也就是说一个周期是20ms 那么一秒钟就有 50次PWM周期
2.3 占空比
是一个脉冲周期内,高电平的时间与整个周期时间的比例
单位: % (0%-100%) 表示方式:20%
2.4一个简单的生成PWM的方法
利用定时器进行定时中断,分别设置两个变量counter和compare。其中compare表示占空比。假设每100us定时器产生一次中断,则每进一次中断counter++,中断100次为一个周期,即T=10ms
3、使用L298芯片搭建一个驱动电路
L298芯片控制引脚状态与电机对应状态如下图。因此,若要让电机运动则需要,ENA置1,IN1与IN2引脚所处电平相反。
4、利用MOTOR-ENCODER测量电机转速
具体参数如下:
5、利用COMPIM进行串口通信
具体参数如下:
6、运行程序
加速:
减速:
7、实验总结
利用PWM调速,首先了解什么PWM,PWM即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效的获得所需要的模拟参量。即通过控制高低电平的时间,来对输出的波形进行控制。而产生PWM的方法有使用定时器产生一个恒定的周期和终端服务子程序里设置比较值。使用PWM对直流电机调速时通过按键控制直流电机的速度,通过PEM调速。