直流电机PI转速控制(基于STC89C52RC)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PWM[k]=PWM[k-1]+ ΔPWM,k=1,2,3…。
式中,PWM[k]表示第k个时刻的PWM占空比,PWM[k-1]表示第k个时刻的前一时刻PWM占空比,且选定PWM[0]=10%,本项目时间间隔60ms。ΔPWM=Kp(err[k]-err[k-1])+Ki*err[k]。
图xx直流电机转速控制框图
while(1)
{
;//等待中断
}
}
void initimer()
{
TMOD=0x11;//T0、T1定时方式1
TH1=pwmh;//T1初值
TL1=pwml;//T1初值,10ms
TH0=0x15;//T0初值
TL0=0xa0;//T0初值,60ms
EA=1;//开总中断
EX1=1;//开INT1中断
3.3程序
#include<reg51.h>//调用库文件
#define Kp 20//设置比例系数20
#define Ki 10//设置积分系数10
#define target 1500//设置目标转速1500
unsigned int pulse=0;//全局变量,统计光电码盘个数
unsigned char count=0;//全局变量,统计T0中断次数
for(i=0;i<6;i++)
{
SBUF=weima[na[i]];//静态显示,依次发送
while(TI==0);//未发送完,即等待
TI=0;//标记位置0
}
}
void timer0() interrupt 1//T0中断响应函数
{
TR0=0;//关闭定时器T0
PWM1=1;//高电平
TH0=0x15;//T0初值,60ms
TL0=0xa0;//T0初值,60ms
count=count+1;//统计T0中断次数
PID_pwm();//调用PID的函数
pulse=0;//脉冲数清0
TR0=1;//开启定时器T0
TR1=ቤተ መጻሕፍቲ ባይዱ;//开启定时器T1
}
void int1() interrupt 2//INT1中断响应函数
直流电机PI转速控制—基于51单片机
1.项目系统组成
本项目由STC89C52RC单片机最小系统,12MHZ晶振。直流电机驱动电路、直流电机(5V)、光电测速电路以及数码管显示电路组成。详细器件见下文电路图。
2.直流电机转速控制电路原理
直流调速的方法有多种,本文是基于PWM(脉冲宽度调制)技术,改变直流电机等效电枢电压,以此在一定范围实现直流电机的调速。
3.2流程图
图xx程序流程图
STC89C52RC(PDIP-40)单片机没有PWM输出口,所以需要用IO口模拟产生PWM信号,而且要求PWM信号的占空比可调,因此需要对单片机内部的T0、T1定时相关寄存器进行设置,PWM频率(1000/60HZ)由T0设置,改变PWM占空比由改变T1设置实现,即T1定时器的初值TH1和TL1两个寄存器的初值设定。电机的转速由光电传感器来采集,选用单片机的外部中断INT1口统计光电码盘的脉冲个数(pulse),因此需要对单片机的INT1相关寄存器进行设置。转速显示采用LED数码管,利用单片机的串口方式0进行静态显示,故需要对串口的相关寄存器进行设置。基于控制框图和以上说明,流程图绘制如下。图中PWM1表示单片机P1^6口,PWM1表示单片机P1^7口(可参考上文电路原理图部分)。
na[1]=(pul%100000)/10000;//LED数码管第5位
na[2]=(pul%10000)/1000;//LED数码管第4位
na[3]= (pul%1000)/100;//LED数码管第3位
na[4]=(pul%100)/10;//LED数码管第2位
na[5]= pul%10;//LED数码管第1位
sbit PWM1=P1^6;//PWM1口
sbit PWM2=P1^7;//PWM2口
void main()
{
initimer();//T0、T1、INT1初始化
inituart();//串口方式0初始化
PWM1=1;//PWM1口
PWM2=0;//PWM2口
TR0=1;//T0开启
TR1=1;//T1开启
ET0=1;//开T0中断
ET1=1;//开T1中断
IT1=1;//INT1中断边沿触发
}
void inituart()
{
SCON=0x00;//方式0
ES=0;//关串口中断
}
void display(unsigned int pul)
{
unsigned char i;
na[0]=pul/100000;//LED数码管第6位
//码管位码,共阴极逆序
unsigned char na[6];//6个数码管显示数组
void initimer();//T0、T1、INT1初始化
void inituart();//串口方式0初始化
void display(unsigned int pul);//显示函数
void PID_pwm();//PI控制函数
2.1直流电机转速控制电路原理图
3.流程图及程序
流程图可以将编程思路更清晰的表达出来,下面将先将整个项目的控制框图绘制出来,然后根据框图将流程图绘制出来,最后在根据流程图将单片机C程序编辑出来。
3.1直流电机转速控制框图
直流电机转速控制框图如下图所示,其中目标值为想要设定的电机的转速(如本项目设定的1500转/分),测量值表示由光电传感器测量的电机转速(单位:转/分)。本框图是基于增量型的PI控制方法。图中err[k]=测量值-目标值,表示第k个时刻(本项目时间间隔60ms)测量值与目标值的差值,err[k-1]表示第k个测速时刻的前一时刻的差值。Kp表示比例放大系数,Ki表示积分系数。更新PWM是指更新PWM的占空比,PWM的频率(本项目16.7Hz)保持不变。更新公式为:
unsigned int err=0,err_l=0;//全局变量,定义err表示err[k],err_1表示err[k-1]
unsigned int pwmh=0xd8;//全局变量,TH1初值
unsigned int pwml=0xf0;//全局变量,TL1初值
unsigned char weima[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//LED数
式中,PWM[k]表示第k个时刻的PWM占空比,PWM[k-1]表示第k个时刻的前一时刻PWM占空比,且选定PWM[0]=10%,本项目时间间隔60ms。ΔPWM=Kp(err[k]-err[k-1])+Ki*err[k]。
图xx直流电机转速控制框图
while(1)
{
;//等待中断
}
}
void initimer()
{
TMOD=0x11;//T0、T1定时方式1
TH1=pwmh;//T1初值
TL1=pwml;//T1初值,10ms
TH0=0x15;//T0初值
TL0=0xa0;//T0初值,60ms
EA=1;//开总中断
EX1=1;//开INT1中断
3.3程序
#include<reg51.h>//调用库文件
#define Kp 20//设置比例系数20
#define Ki 10//设置积分系数10
#define target 1500//设置目标转速1500
unsigned int pulse=0;//全局变量,统计光电码盘个数
unsigned char count=0;//全局变量,统计T0中断次数
for(i=0;i<6;i++)
{
SBUF=weima[na[i]];//静态显示,依次发送
while(TI==0);//未发送完,即等待
TI=0;//标记位置0
}
}
void timer0() interrupt 1//T0中断响应函数
{
TR0=0;//关闭定时器T0
PWM1=1;//高电平
TH0=0x15;//T0初值,60ms
TL0=0xa0;//T0初值,60ms
count=count+1;//统计T0中断次数
PID_pwm();//调用PID的函数
pulse=0;//脉冲数清0
TR0=1;//开启定时器T0
TR1=ቤተ መጻሕፍቲ ባይዱ;//开启定时器T1
}
void int1() interrupt 2//INT1中断响应函数
直流电机PI转速控制—基于51单片机
1.项目系统组成
本项目由STC89C52RC单片机最小系统,12MHZ晶振。直流电机驱动电路、直流电机(5V)、光电测速电路以及数码管显示电路组成。详细器件见下文电路图。
2.直流电机转速控制电路原理
直流调速的方法有多种,本文是基于PWM(脉冲宽度调制)技术,改变直流电机等效电枢电压,以此在一定范围实现直流电机的调速。
3.2流程图
图xx程序流程图
STC89C52RC(PDIP-40)单片机没有PWM输出口,所以需要用IO口模拟产生PWM信号,而且要求PWM信号的占空比可调,因此需要对单片机内部的T0、T1定时相关寄存器进行设置,PWM频率(1000/60HZ)由T0设置,改变PWM占空比由改变T1设置实现,即T1定时器的初值TH1和TL1两个寄存器的初值设定。电机的转速由光电传感器来采集,选用单片机的外部中断INT1口统计光电码盘的脉冲个数(pulse),因此需要对单片机的INT1相关寄存器进行设置。转速显示采用LED数码管,利用单片机的串口方式0进行静态显示,故需要对串口的相关寄存器进行设置。基于控制框图和以上说明,流程图绘制如下。图中PWM1表示单片机P1^6口,PWM1表示单片机P1^7口(可参考上文电路原理图部分)。
na[1]=(pul%100000)/10000;//LED数码管第5位
na[2]=(pul%10000)/1000;//LED数码管第4位
na[3]= (pul%1000)/100;//LED数码管第3位
na[4]=(pul%100)/10;//LED数码管第2位
na[5]= pul%10;//LED数码管第1位
sbit PWM1=P1^6;//PWM1口
sbit PWM2=P1^7;//PWM2口
void main()
{
initimer();//T0、T1、INT1初始化
inituart();//串口方式0初始化
PWM1=1;//PWM1口
PWM2=0;//PWM2口
TR0=1;//T0开启
TR1=1;//T1开启
ET0=1;//开T0中断
ET1=1;//开T1中断
IT1=1;//INT1中断边沿触发
}
void inituart()
{
SCON=0x00;//方式0
ES=0;//关串口中断
}
void display(unsigned int pul)
{
unsigned char i;
na[0]=pul/100000;//LED数码管第6位
//码管位码,共阴极逆序
unsigned char na[6];//6个数码管显示数组
void initimer();//T0、T1、INT1初始化
void inituart();//串口方式0初始化
void display(unsigned int pul);//显示函数
void PID_pwm();//PI控制函数
2.1直流电机转速控制电路原理图
3.流程图及程序
流程图可以将编程思路更清晰的表达出来,下面将先将整个项目的控制框图绘制出来,然后根据框图将流程图绘制出来,最后在根据流程图将单片机C程序编辑出来。
3.1直流电机转速控制框图
直流电机转速控制框图如下图所示,其中目标值为想要设定的电机的转速(如本项目设定的1500转/分),测量值表示由光电传感器测量的电机转速(单位:转/分)。本框图是基于增量型的PI控制方法。图中err[k]=测量值-目标值,表示第k个时刻(本项目时间间隔60ms)测量值与目标值的差值,err[k-1]表示第k个测速时刻的前一时刻的差值。Kp表示比例放大系数,Ki表示积分系数。更新PWM是指更新PWM的占空比,PWM的频率(本项目16.7Hz)保持不变。更新公式为:
unsigned int err=0,err_l=0;//全局变量,定义err表示err[k],err_1表示err[k-1]
unsigned int pwmh=0xd8;//全局变量,TH1初值
unsigned int pwml=0xf0;//全局变量,TL1初值
unsigned char weima[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//LED数