• PUDN用户
    了解作者
  • Visual C++
    开发工具
  • 49KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 23
    下载次数
  • 2013-08-13 16:42
    上传日期
这是本做的一个用于激光器驱动电路和温度控制电路的程序。已经调试通过。控制效果蛮好。希望对大家有用
LD_driver_PID.zip
  • LD_driver_PID
  • 04_uvopt.bak
    54.9KB
  • STARTUP.LST
    13.7KB
  • 04
    19.6KB
  • 04.uvproj
    13.1KB
  • 04_uvproj.bak
    13.1KB
  • 04.uvopt
    54.9KB
  • STARTUP.A51
    6.2KB
  • 04.hex
    9.6KB
  • 04.OBJ
    19.8KB
  • 04.plg
    155B
  • 04.c
    6.1KB
  • STARTUP.OBJ
    749B
  • 04.M51
    23.8KB
  • 04.lnp
    52B
  • 04.LST
    11.7KB
内容介绍
#include<reg52.h> #include<intrins.h> #include<math.h> #define uint unsigned int #define uchar unsigned char sbit lcdrs=P0^6; sbit lcden=P0^7; //LCD引脚定义 sbit AD7705_DRDY=P1^0; // AD7705 data ready sbit AD7705_DATA=P1^1; // AD7705 input data & output data sbit AD7705_RESET=P1^2; // AD7705 RESET sbit AD7705_CS=P1^3; // AD7705 CS sbit AD7705_CLK=P1^4; // AD7705 CLK sbit MAX541_DIN=P1^5; sbit MAX541_SCLK=P1^6; sbit MAX541_CS=P1^7; //MAX541引脚定义 void delay(uint k); void MAX541_init(); //MAX541初始化 void MAX541_SPIWrite(int temp); //单片机向MAX541写16bits数据 int VoltToData(float out_volt); //将电压值转换为对应的16bits数字量 void SetMAX541(float temp); //设置MAX541输出电压 float T_Voltage; uchar H_Data,L_Data; void AD7705_init(); AD7705_Read (); //读取采样数值 void AD7705_Write_Reg(uchar Data_byte); uchar AD7705_Read_Reg(); //读寄存器,包括2个字节 void lcd_init(); void lcd_write_data(char dat); void lcd_write_com(char com); void lcd_disp(uchar a); uchar tab_key[6]; uchar code tab[]="0123456789"; uchar n,key; uchar x1,x2,x3,x4,x5,x6; long temp; void i_set(); typedef struct { double dState; // Last position input double iState; // Integrator state double iMax, iMin; // Maximum and minimum allowable integrator state double iGain; // integral gain double pGain; // proportional gain double dGain; // derivative gain } SPid; double UpdatePID(SPid * pid, double error, double position) { double pTerm, dTerm, iTerm; // calculate the proportional term pTerm = pid->pGain * error; // calculate the integral state with appropriate limiting pid->iState += error; if (pid->iState > pid->iMax) pid->iState = pid->iMax; else if (pid->iState < pid->iMin) pid->iState = pid->iMin; iTerm = pid->iGain * pid->iState; // calculate the integral term dTerm = pid->dGain * (position - pid->dState); pid->dState = position; return pTerm + iTerm - dTerm; } //MAX541初始化 void MAX541_init() { MAX541_DIN=0; MAX541_CS=0; MAX541_SCLK=0; } //单片机向MAX541写16bits数据 void MAX541_SPIWrite(int temp) { uint i; for(i=0;i<16;i++) { MAX541_DIN=(bit)(temp&0x8000); MAX541_SCLK=0; temp<<=1; _nop_(); MAX541_SCLK=1; _nop_(); } } //将电压值转换为对应的16bits数字量 int VoltToData(float out_volt) { int temp; temp=(int)(out_volt*65536/2.497); return(temp&0xffff); } //设置MAX541输出函数 void SetMAX541(float volt) { int Data; Data = VoltToData(volt); MAX541_CS=0; MAX541_SPIWrite(Data); _nop_(); _nop_(); MAX541_CS=1; _nop_(); _nop_(); } //AD7705初始化 void AD7705_init() { AD7705_Write_Reg(0x20); //0,010,0,0,00 默认写0,时钟寄存器,写操作,正常工作模式,通道AIN1 AD7705_Write_Reg(0x0a); //000,0,0,000 默认写0,主时钟不禁止,2.4576时钟不分频,20Hz输出更新率、5.24Hz滤波器-3dB截止频率 AD7705_Write_Reg(0x10); //0,001,0,0,00 默认写0,设置寄存器,写操作,正常工作模式,通道AIN1 AD7705_Write_Reg(0x44); //01,000,1,0,0 自校准模式,1倍增益,单极性工作,片内缓冲器短路、调制器和滤波器开始处理数据 } //AD7705读16bits数据 AD7705_Read() { AD7705_Write_Reg(0x38); H_Data=AD7705_Read_Reg(); L_Data=AD7705_Read_Reg(); T_Voltage=(float)H_Data; T_Voltage=T_Voltage*256; T_Voltage=T_Voltage+(float)L_Data; return(T_Voltage); } //AD7705写寄存器 void AD7705_Write_Reg(uchar Data_byte) { uchar i; AD7705_CS=0; AD7705_CLK=1; _nop_(); _nop_(); for(i=0;i<8;i++) { AD7705_DATA=(bit)(Data_byte&0x80); AD7705_CLK=0; _nop_(); _nop_(); _nop_(); AD7705_CLK=1; Data_byte<<=1; } _nop_(); AD7705_CS = 1; } //AD7705读寄存器 uchar AD7705_Read_Reg() { uchar i,Data_read; AD7705_CS=0; AD7705_CLK=1; _nop_(); for(i=0;i<8;i++) { AD7705_CLK=0; _nop_(); _nop_(); Data_read<<= 1; Data_read|=(uchar)AD7705_DATA; _nop_(); _nop_(); AD7705_CLK=1; _nop_(); _nop_(); } _nop_(); AD7705_CS=1; AD7705_DRDY=1; return(Data_read); } //延时 void delay(uint k) { uint i,j; for(i=k;i>0;i--) for(j=110;j>0;j--); } //LCD初始化 void lcd_init() { lcden=0; lcd_write_com(0x38); //设置显示模式:16X2,5X7,8位数据接口 lcd_write_com(0x0c); //开显示,显示光标,光标闪烁 lcd_write_com(0x06); //读写一个字符后,地址指针及光标加一,且光标加一整屏显示不移动 lcd_write_com(0x01); //清屏 lcd_write_com(0x80); //设置光标指针 } //写命令 void lcd_write_com(uchar com) { lcdrs=0; //低电平写命令 P2=com; //写入命令 delay(3); //延时约3ms lcden=1; //LCD使能端置高电平 delay(3); //延时约3ms lcden=0; //LCD使能端拉低电平 } //写数据 void lcd_write_data(uchar dat) { lcdrs=1; //低电平写数据 P2=dat; //写入命令 delay(3); //延时约3ms lcden=1; //LCD使能端置高电平 delay(3); //延时约5ms lcden=0; //LCD使能端拉低电平 } //LCD显示 void lcd_disp(uchar a) { lcd_write_data(tab[a]); } //电流、电压设置 void i_set(float dianliu) { float dianya; dianya=10*dianliu; SetMAX541(dianya); } void main() { uint a,c,d,i; long b; float dianya; lcd_init(); MAX541_init(); AD7705_init(); for(i=0;i<11;i++) { i_set(10+i); delay(500); } while(1) { i_set(50); for(i=0;i<10;i++) { while(AD7705_DRDY); a=AD7705_Read(); d=a*2.497/65535; if(d==dianya) {dianya=dianya;} else {UpdatePID;} } while(AD7705_DRDY); a=AD7705_Read(); b=a*2.497*100000/65535; //结果与a、2.497、100000三个乘数的顺序相关,原因待查 x1= b/100000; x2=(b-x1*100000)/10000; x3=(b-x1*100000-x2*10000)/1000; x4=(b-x1*100000-x2*10000-x3*1000)/100; x5=(b-x1*100000-x2*10000-x3*1000-x4*100)/10; //6位数组时,b-x1*100000-x2*10000-x3*1000-x4*100-x5*10显示乱码,原因待查 x6=(b-x1*100000-x2*10000-x3*1000-x4*100-x5*10)%10; //6位数组时,SetMAX541(1.865),显示18xxyz,xx乱码,原因待查 tab_key[0]=x1; tab_key[1]=x2; tab_key[2]=x3; tab_key[3]=x4; tab_key[4]=x5; tab_key[5]=x6; lcd_write_com(0x80); for(i=0;i<6;i++) { c=tab_key[i]; lcd_disp(c); } delay(500); } }
评论
    相关推荐
    • 便携式脉冲激光测距仪的研制.rar
      主要由脉冲半导体激光二极管发射电路、光学元件、漫反射物体、接收系统、高精度时间转换芯片TDC.GP2、单片机构成,激光发射电路打出窄脉宽光脉冲,同时将发射脉冲输入到TDC.GP2的START端口,触发时差测量。
    • 仿真电路.rar
      常见蝶形封装激光器驱动电路仿真与分析,包含驱动芯片资料
    • LaserDrive_Test.rar
      激光器驱动控制,实现多路激光器控制与在线调试功能
    • arduino激光雕刻机
      基于arduino做的激光雕刻机,xy轴用光驱做的,包含相关教程绝对详细,还有代码,和相关开发工具、雕刻工具等
    • DS18B20_linux 2440驱动
      DS18B20_linux驱动,2440的,可以根据需要修改。
    • ROS驱动板.zip
      ROS机器人驱动板,平衡小车驱动板,大功率电机驱动板 ROS机器人驱动板,ROS机器人控制板,电机驱动板,板子是给大功率ros小车设计的,也可以用于平衡小车以及多种智能车的用途,引出了四个电机编码一体接口,减少...
    • 电路征集:【大赛作品】激光测距机器人设计全部资料,包括论文-电路方案
      步进电机驱动电路选用A4988驱动芯片,它是一款完全的微步电动机驱动,带有内置转换,易于操作。可在全、半、1/4、1/8 及 1/16 步进模式时操作双极步进电动机,输出驱动性能可达 35 V及 ±2A。A4988 包括一个固定...
    • 驱动步进电机移动的激光标线设计(程序、设计分析)-电路方案
      而标灯驱动行走部分则是由光电限位、信号组合电路、细分驱动器、步进电机、导轨、传送带、激光灯标、开关电源等组成。 其构成图1所示: 1、相关器件介绍 步进电机是一种依照时序脉冲来驱动的转动器件,其主要的指标...
    • 无线控制激光坦克,大战一触即发-电路方案
      SparkFun全桥电机驱动器Breakout - L298N× 1 在这个项目中,我正在制作一个安装在坦克底盘上的LASER炮塔,并使用PS2无线控制控制,我使用操纵杆移动坦克,另一个是用于在双轴上移动炮塔,然后一个按钮控制激光...
    • LT3756激光电源方案
      一个参考于地电压 FB 引脚用作多个 LED 保护功能电路的输入,而且还使转换能够起一个恒定电压源的作用。一个频率调节引脚允许用户在 100kHz 至 1MHz 的范围内设置频率,旨在优化效率、性能或外部元件尺寸。