电机功能测量:
1、测量直流电机的电压电流,计算功率
2、设计采样电路,通过AD芯片测量参数
3、LCD显示测量结果
4、按键控制电机转速
资料包括:
原理图:
仿真图:
程序运行图:
efine uint unsigned int
#define THC0 0xf8
#define TLC0 0x50 //2ms,0x30,含中断处理时间时,0x50
#include "LCD.H"
#include "delay.h"
#include"TLC1543.h"
sbit sw=P2^7;//切换
unsigned char aa[]={'S','e','t','u','p',':',' ',' ',' ',' ',' ','r','/','m','i','n'}; //目标转速。 r/min
unsigned char cc[]={' ',' ',' ',' ',' ',' ',' ',' ','r','/','m','i','n',' ',' ',' '}; //实测转速: r/min
uchar i=0,n;
sbit AddSpeed=P3^6;
sbit SubSpeed=P3^7;
sbit PWM_FC=P1^0;
uchar flag=0;
int e ,e1 ,e2 ;//pid 偏差
float uk ,uk1 ,duk ;//pid输出值
float Kp=0.1,Ki=0.05,Kd=0.016;//pid控制系数 10,12,1.5
float current=0;//电流
float volt=0;//电压
uchar disp[]="00.0V";
/*
PID的参数设置可以参照以下来进行:
参数整定找最佳,从小到大顺序查;
先是比例后积分,最后再把微分加;
曲线振荡很频繁,比例度盘要放大;
曲线漂浮绕大湾,比例度盘往小扳;
曲线偏离回复慢,积分时间往下降;
曲线波动周期长,积分时间再加长;
曲线振荡频率快,先把微分降下来;
动差大来波动慢。微分时间应加长;
理想曲线两个波,前高后低4比1 ;
一看二调多分析,调节质量不会低;
PID调节器各校正环节的作用
a、比例环节:即时成比例地反应控制系统的偏差信号e(t),偏差一旦产生,
调节器立即产生控制作用以减小偏差。
b、积分环节:主要用于消除静差,提高系统的无差度。积分作用的强弱取
决于积分时间常数TI,TI越大,积分作用越弱,反之则越强。
c、微分环节:能反应偏差信号的变化趋势(变化速率),并能在偏差信号的
值变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系
统的动作速度,减小调节时间。
*/
int out=0;
uint SpeedSet=3000;
uint cnt=0;
uint Inpluse=0,num=0,zs;//脉冲计数
uint PWMTime=100;//脉冲宽度
void PIDControl();
void SystemInit();
void delay(uchar x);
void PWMOUT();
void SetSpeed();
/**************主函数************/
void main()
{
uchar i=0;
uint j;
float k=0;
SystemInit();
init();
LCD_Write_String(0,0,aa);
zs=1;
n=60; //实物制作时,需要根据你自己选择的码盘电机码盘数修改该值
while(1)
{
SetSpeed();
//切换控制
if(sw &&(flag==0))
{
flag=1;
write_com(1);
}
if(!sw &&(flag==1))
{
flag=0;
write_com(1);
}
if(zs==1)
{
zs=0;
k=num;
j=k/2.2;
cc[4]=j/1000+'0';
cc[5]=j/100%10+'0';
cc[6]=j/10%10+'0';
cc[7]=j%10+'0';
if(sw)
LCD_Write_String(0,1,cc);
//测量电压
for(i=0;i<8;i++)
{
j=TLC1543_read(0);
}
volt=j;
volt=volt*5/4096;
volt=volt*12;//校准
//测量电流
for(i=0;i<8;i++)
{
j=TLC1543_read(1);
}
current=j;
current=current*5/4096;
current=current*1.5;//校准
if(!sw)
{
//显示电压
j=volt*10;
disp[0]=j/100+0x30;
disp[1]=j%100/10+0x30;
disp[2]='.';
disp[3]=j%10+0x30;
disp[4]='V';
LCD_Write_String(0,0,"U:");
LCD_Write_String(2,0,disp);
//显示电流