基于单片机控制直流电机调速系统设计正文内容摘要:

子程序 、 1个定时器子程序、 3个延时子程序和 2个显示子程序 组成。 主程序主程序是一个循环程序,其主要思路是由单片机 口生数据送到 PWM信号发生电路,然后用 PID 算法输出控制系数给 PWM 发生电路改变波形的占空比进而控制电机的转速。 主程序流程图如图 31所示: 图 31 智能仪器综合设计用纸 18 : void main() { P1=0x00。 SCON=0x40。 PCON=0x80。 TMOD=0x21。 TL1=0xfa。 TH1=0xfa。 TH0=0XFE。 TL0=0X33。 ES=0。 ET0=1。 EX0=1。 TR1=1。 TR0=1。 EA=1。 while(1) { while (key1==0||key2==0||key3==0||a==0) { if(key1==0amp。 amp。 key2==1amp。 amp。 key3==1) { while(key1==0)。 state_flag=~state_flag。 if(state_flag==1) { EX0=1。 TR0=1。 en =0。 en_1 =0。 en_2 =0。 un =0。 wide=150。 a=1。 //wide = set_count。 } if(state_flag==0) { PWM = 0。 EA=0。 TR0=0。 智能仪器综合设计用纸 19 run_count=0。 stop_count=0。 time=0。 t1=0。 t2=0。 display_num4(set_count)。 a=0。 } } if(key1==1amp。 amp。 key2==0amp。 amp。 key3==1amp。 amp。 state_flag==0) { while(key2==0)。 delay1(20)。 set_count+=1。 if(set_count300) set_count=100。 } if(key1==1amp。 amp。 key2==1amp。 amp。 key3==0amp。 amp。 state_flag==0) { while(key3==0)。 delay1(20)。 if(set_count100) set_count=1。 if(set_count==100) set_count=300。 } else display_num4(stop_count)。 } while(key1==1amp。 amp。 key2==1amp。 amp。 key3==1amp。 amp。 a==1) { if(time==400) { 智能仪器综合设计用纸 20 time=0。 stop_count=run_count/2。 run_count=0。 pid()。 } } } } 主程序主程序是一个循环程序,其主要思路是, 首先 判断系统的运行模式,如果 KEY1键按下 , 且 state_flag 为 1则系统处于运行模式,如果 state__flag 为 0则为设置模式。 如果系统处于设置模式,则关闭定时器中断和外部中断,同时初始化部分变量 , KEY2 为按键加 , KEY3 为按键减。 如果系统处于运行模式 , xcount 开始计时,当 xcount=82 时,即为 1s时,调用 串口中断子程序,单片机开始发送数据,模拟 I/O 口输出 PWM,此时 PWM 波的频率为 ,周期为 ,然后调用 PID 函数,计算出 PWM 波输出的占空比,最后上位机显示转速。 2. PID 控制算法子程序设计 : void pid(void) //PID 计算输出量 { en=set_countstop_count。 un=a0*ena1*en_1+a2*en_2。 //计算输出量 if(un 400)un = 400。 else if(un 400)un = 400。 en_2=en_1。 en_1=en。 //更新误差 wide += un/4。 //计算 wide,用于调节 PWM 的占空比,计算周期为 100ms if(wide900)wide=900。 //防止超限,确保计算饿 wide 值有效 else if(wide10)wide=10。 } 位置式 PID控制: 智能仪器综合设计用纸 21 增量式 PID控制: 从表达式我们可以得出以下结论: ( 1) 位置式 PID 控制的输出与整个过去的状态有关,用到了误差的累加值;而增量式 PID的输出只与当前拍和前两拍的误差有关,因此位置式 PID 控制的累积误差相对更大; ( 2) 增量式 PID 控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带 积分部件的对象,如步进电机等,而位置式 PID 适用于执行机构不带积分部件的对象,如电液伺服阀。 ( 3) 由于增量式 PID 输出的是控制量增量,如果计算机出现故障,误动作影响较小,而执行机构本身有记忆功能,可仍保持原位,不会严重影响系统的工作,而位置式的输出直接对应对象的输出,因此对系统影响较大。 ( 4) PID 调节器的参数整定方法有很多,但可归结为理论计算法和 试测 法两种。 用理论计算法设计调节器的前提是能获得被控对象准确的数学模型,这在工业过程中一般较难做到。 因此,实际用得较多的还是 试测 法。 这种方法最大优点就是整定参数时不依赖对 象的数学模型,简单易行。 当然,这是一种近似的方法,有时可能略嫌粗糙,但相当适用,可解决一般实际问题。 本文使用试测法。 : void delay(uint time) { uint i。 for(i=0。 itimeamp。 amp。 key1==1。 i++) display_num4(stop_count)。 } void delay1_ms(uint time) //1ms 延时函数 智能仪器综合设计用纸 22 { uint i,j。 for(i=0。 itime。 i++) for(j=0。 j123。 j++)。 } void delay1(uint num) { uint i。 for(i=0。 inum。 i++) display_num4(set_count)。 } : void display_num1(uint dat,uchar num1) //指定的位上显示 指定的一位数据 { P0=xianshi[dat]。 //段显 switch(num1) { case 1: P2=0x01。 break。 case 2: P2=0x02。 break。 case 3: P2=0x04。 break。 case 4: P2=0x08。 break。 default: break。 } delay1_ms(2)。 } void display_num4(uint num) //四位数据显示函数 { uint qian,bai,shi,ge。 qian=num/1000。 智能仪器综合设计用纸 23 if(qian==0)qian=11。 display_num1(qian,4)。 bai=(num%1000)/100。 if(qian==11amp。 amp。 bai==0)bai=11。 display_num1(bai,3)。 shi=(num%100)/10。 if(qian==11amp。 amp。 bai==11amp。 amp。 shi==0)shi=11。 display_num1(shi,2)。 ge=num%10。 display_num1(ge,1)。 } : void int0() interrupt 0 //外部中断 0 用于电机转速测量 { EX0=0。 run_count++。 EX0=1。 时器中断子程序: 关中断 开启计数器 T1 工作 计数器清零 调用子程序 dis_num() 将 TL1 中的十六进制数转换成十进制数 将 TL1 中的计数值赋给 count 开启定时器 T0 工作 定时器 T0 赋初值 计时值 ++ 0832 输入值减小/PWM 占 空比减小 8032 输入值增大/PWM 占空比增大 0832 数据口赋初值 TL1 计数值的十进制数赋值给 out 计时 1s 到。 输出值 键入值。 有值键入。 是 否 是 否 是 否 智能仪器综合设计用纸 24 void time0() interrupt 1 //定时器 0用于产生 PWM ,占空比通过 PID 计算获得 {// SBUF=39。 a39。 //while(TI) {TI=0。 } TR0=0。 time++。 TH0=0XFF。 TL0=0X9c。 //计数器 0 赋初值 100us if(low_flag==0)t1++。 //低电平时间计时 t2++。 if(t2==1000) //用于确定 PWM 的周期 , t2 乘以定时器的中断周期即为 PWM 的周期 {PWM=1。 t2=0。 low_flag=0。 } if(t1==wide)//wide 的值即为低电平的时间 {PWM=0。 t1=0。 low_flag=1。 } TR0=1。 /**/ } 智能仪器综合设计用纸 25 第五章 上位机设计 函数介绍 配置串口 此函数主要的作用是使 VISA 资源名称指定的串口按特定设置初始化。 在下位机的主函数中设置 SCON=0x40 及 PCON=0x80,所以串行口工作于方式 1 且波特率倍增位 SMOD=1,为波特率可变的 8位异步通信接口。 传送一帧信息总共 10 位,即 1位起始位( 0), 8位数据位(低位在前)和 1 位停止位( 1)。 波特率可变,取决于定时器 T1 或 2 的溢出率。 波特率= 2^SMOD/32 T1 溢出率。 T1 工作于模式 2,此时为初值自动加载的定时方式。 如果计数器的初始值为 X,则每过 256— X个机器周期 T1就产生溢出,溢出的周期为( 256— X)*12/fosc。 据此可计算溢出率和波特率。 下位机中 T1 设置的计数初值分别是 TL1=0xfa 和TH1=0xfa。 使用 的晶振,最后得出的波特率为 9600bit/s,在函数波特率选择端口可以加上条件结构予以选择,当然在这里我们要选择 9600bit/样,所以也需要使用条件结构,这里我们用的是 COM1 口。 数据位端口是输入数据的位数, 数据位的值介于 5和 8之间,默认值为 8,我们选择的也是 的每一帧使用的奇偶校验,本次课程设计中只需要从单片机向 PC 传输数据,选择方式 1,所以奇偶端口选择 . 清空 I/O 缓冲区 运用此函数来清除发送和接收的 I/O 接口的缓冲区。 读取 这个函数的作用是从 VISA 资源名称指定的设备或接口中读取指定数量的字节,并使数据 返回至读取缓冲区。 其中字节总数端口,我们接收 8位数据自然输入一个常量 课程设计所要使用的是异步通信,在异步通信中,数据通常以字符或字节为单位组成字符帧传送。 字符帧由发送端一帧一帧地发送。 发送端和接收端可以由各自的时钟来控制数据的发送和接收,两个时钟源彼此独立,互不同步。 异步通信通过规定字符帧格式来协调发送端和接收端的数据发送和。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。