基于单片机的直流电机转速pid控制系统设计(编辑修改稿)内容摘要:
6=P3^6。 uchar code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f }。 uchar code chose[]={0x01,0x02,0x04,0x08,0x10,0x20}。 uint shu[6]={1,2,3,4,5,6}。 uchar q=0,i=0,m=0,n=0。 uint count,miaoshu,sv,k=0,k2=0,sv1,sv2。 //定义计数值,实际温度值,设定的温度值 uchar sec,tt,flag,flag1。 int rk,yk,uk,uk_1=0,ek,ek_1=0,ek_2=0。 //PID 计算参数 signed char T=20,Kp=30,Td=8,Ti=100,q0,q1,q2。 //PID 参数其值经反复调试得来 uchar data buf[4]={0,1,1,1}。 //字型显示中间变量 /******************************************************************** 21 **************/ 延时子程序用来产生 1ms的延时,用于在程序中的等待 /**********************************************************************************/ //延时 1ms 子程序 void delay(uchar z) { uchar x,y。 for(x=z。 x0。 x) for(y=110。 y0。 y)。 } /**********************************************************************************/ 显示子程序用来在数码管中显示电机的设定转速或计算转速以及实际转速 /**********************************************************************************/ //显示子程序 void display(uint a,uint b) { char i。 shu[0]=a/100。 shu[1]=a%100/10。 shu[2]=a%10。 shu[3]=b/100。 shu[4]=b%100/10。 shu[5]=b%10。 for(i=0。 i6。 i++) { P2=chose[i]。 P0=table[shu[i]]。 delay(5)。 } } /**********************************************************************************/ 定时器中断子程序用来产生 秒的中断,以此来测量电机的转速 22 /**********************************************************************************/ // 定时器中断 0子程序 void t0(void) interrupt 1 using 0 //定时 T0 中断服务函数 { tt++。 //每过 250ust tt 加一 if(tt==40) //计满 40 次( 1/100 秒)时 { tt=0。 //重新再计 sec++。 if(sec==10) //定时 秒,在从零开始计时 { sec=0。 TH0=0x06。 //对 TH0 TL0 赋值 TL0=0x06。 miaoshu=count。 count=0。 } } } /**********************************************************************************/ 用来记录中断数,从而得到转速 /**********************************************************************************/ void sdf(void) interrupt 2 using 0 //外部中断服务函数 { count=count+1。 } /**********************************************************************************/ 接收来自另一个单片机的中断并放入一个数组中以便在显示函数中方便调用此数据,其中加了 容错程序,通过一个特殊字 符’ 11’ ,来区别哪一个是三位数的百位,十位,个位。 /**********************************************************************************/ 23 void jieshou()//接收子程序 {uchar g。 if(RI==1) {g=SBUF。 if(g==11) m=0。 buf[m]=g。 m++。 if(m==4) m=0。 RI=0。 //REN=1。 } } /**********************************************************************************/ 检测按键值计算对应的数值 /**********************************************************************************/ //左移一位 void yishu(uchar num) { uchar bai,shi,ge。 bai=sv1%100/10。 shi=sv1%10。 ge=num。 sv1=bai*100+shi*10+ge。 k2=sv1。 //xinjia } /**********************************************************************************/ 检测对应的按键 /**********************************************************************************/ //按键子 程序 void key() { uchar i,temp,lie,hang,shu。 for(i=0。 i4。 i++) //求出按键值 { P1=~chose[i]。 24 temp=P1。 temp=tempamp。 0xf0。 if(temp!=0xf0) { hang=i。 if(temp==0xe0) lie=1。 else if(temp==0xd0) lie=2。 else if(temp==0xb0) lie=3。 else if(temp==0x70) lie=4。 break。 } } shu=hang*4+lie。 //数为对应的按键 switch(shu) { case 1: if(!flag) yishu(0)。 break。 case 2: if(!flag) yishu(1)。 break。 case 3: if(!flag) yishu(2)。 break。 case 4: if(!flag) yishu(3)。 break。 case 5: if(!flag) yishu(4)。 break。 case 6: if(!flag) yishu(5)。 break。 case 7: if(!flag) yishu(6)。 break。 case 8: if(!flag) yishu(7)。 break。 case 9: if(!flag) yishu(8)。 break。 case 10: if(!flag) yishu(9)。 break。 case 11: flag++。 /*flag1++*/。 break。 case 12: sv1=0。 miaoshu=0。 flag=0。 flag1=0。 break。 case 13: flag1++。 break。 25 default: break。 } while(temp!=0xf0) //放键检测 { temp=P1。 temp=tempamp。 0xf0。 for(i=0。 i10。 i++) display(sv1,miaoshu)。 } } //按键检测程序 void keyscan() { uchar temp。 P1=0xf0。 temp=P1。 temp=tempamp。 0xf0。 if(temp!=0xf0) { delay(5)。 //消除抖动 P1=0xf0。 temp=P1。 temp=tempamp。 0xf0。 if(temp!=0xf0) key()。 } } /**********************************************************************************/ 进行 pid 的计算,用来在后面的程序中进行电机的闭环控制 /**********************************************************************************/ void pid(void) //PID 计算输出量 {sv2=100*buf[1]+10*buf[2]+buf[3]。 if(p26==0)//低。基于单片机的直流电机转速pid控制系统设计(编辑修改稿)
相关推荐
不同;白色物体最远,黑色物体最近)。 检测障碍物的距离可以根据要求通过尾部的电位器旋钮进行调节。 该传感器具有探测距离远、受可见光干扰小、价格便宜、易于装配、使用方便等特点,可以广泛应用于机器人避障、流水线计件等众多场合。 该红外传感器是个 NPN 型光电开关,其输出状态是 0,1,即数字电路中的高电平和低电平。 在检测到目标是低电平输出,正常 状态是高电平输出,输出时外加一个上拉电阻即可连接到
测温度场中,自由端恒定在某一温度。 热电偶是基于热电效应工作的,热电效应产生的热电势是由接触电势和温差电势两部分 组成的。 (2) MAX6675 单片热电偶数字转换器。 其工作原理如下: K 型热电偶产生的热电势,经过低噪声电压放大器 A1 和电压跟随器 A2放大、缓冲后,得到热电势信号 U1,再经过 S4 送至 ADC。 对于 K型热电偶,电压变化率为( 41μV/ ℃ )
正 正正正1 正 单 轴 晶 体 类 基 频 光 取 光 偏 振 态 , 倍 频 光 选 光 偏 振 态 要 求2222 () 21 ( )2eoo e o eooIIo o e mIImI I n no e ok k n ncckncn n ne
、廉价、实用等优点,给用户提供了一个较为理想的样机开发方式。 MSP430 系列单片机的应用领域 MSP430 型系列是一款超低功耗类型的微控制器,特别适合于手持设备和安全领域的应用。 MSP430 虽属微控制器,但在众多单片机系列中有独特的优势。 该 MSP430 系列将大量的外围模块整合到片内,也适合于设计片上系统,具有丰富的不同型号的器件可供选择 ,给设计者带来很大的灵活性。 其 原
将送 D/A数字量减 01H 相等 不等 大于送 D/A数字量。 是 否 将送 D/A数字量加 01H 1 基于单片机的数控电压源课程设计 图 19 键盘子程序框图框图 4. 1 步进步减子程序 图 20 步进,步减子程序框图 由步进,步减子程序框图可以看出,如果每次把 D/A的数字量加 01H,可以使步进量和步减量由。 如果采用更高位的 D/A转换器。 可以使步进量和步减量进一步的减小
图 31 双元件热释 电红外 传感器 图 32 单元件热释 电红 外 传感器 图 33 中,当 AT 接收到人体信号时,输出一个微弱的低频信号,其频率约为~ 3Hz。 经晶体管 VT1 和运算放大器 A1 组成的两级放大器将信号放大至 70~75dB。 由 A2 等组成的电压比较器,设定一个参考电压。 在无目标进入时,末级无输出;一旦有目标进入探测范围, AT 则有信号输出,经放大后