基于单片机控制直流电机调速系统设计正文内容摘要:
子程序 、 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位数据自然输入一个常量 课程设计所要使用的是异步通信,在异步通信中,数据通常以字符或字节为单位组成字符帧传送。 字符帧由发送端一帧一帧地发送。 发送端和接收端可以由各自的时钟来控制数据的发送和接收,两个时钟源彼此独立,互不同步。 异步通信通过规定字符帧格式来协调发送端和接收端的数据发送和。基于单片机控制直流电机调速系统设计正文
相关推荐
特殊功能寄存器 实质上是一些具有特殊功能的片内 RAM 单元 ,字节地址范围为 21 个 ,离散的分布在该区域中 ,其中有些 SFR还可以进行位寻址。 并行 I/O 口 MCS51单片机共有 4个双向的 8 位并行 I/O 端口( Port),分别记作 P0P3,共 32 根口线。 各口的每一位均由锁存器、输出驱动器和输入缓冲器 组成。 实际上 P0P3 已被归入特殊功能寄存器。
平保持为高或者为低超过了定时的时间,就会产生复位信号。 CS 引脚上的一个下降沿将会复位看门狗定时器。 由于这是一个开漏型的输出引脚,所以使用时必须接上拉电阻。 8 VCC 正电源。 X5045 的状态寄存器描述 了 器件的当前状 态, 各位意义如 下 所 示。 表 24 X5045 状态寄存器各位定义 7 6 5 4 3 2 1 0 0 0 WD1 WD0 BL1 BL0 WEL WIP 其中
方案三:选用AT89S52单片机为控制核心。 AT89S52,它具有一个8KB的Flish程序存储器,比89C51多4K,1个512字节的RAM,4个8位的双向可位寻址I/O端口,3个16位的定时/计数器及1个串行口和6个向量二级中断结构。 电路设计简单、价格便宜,运行速度比89C51快,功能也相当齐全。 另外,AT89S52在工业上也有着广泛的应用, 编程技术及外围功能电路的配合使用都很成熟。
C0809的接口 ADC0809与 MCS51单片机的连接如图 图 8 ADC0809与 MCS51的连接 单片机部分 单片机选用的是 ATMEL 公司新推出的 AT89S51,AT89C51 是一个低电压,高性能 CMOS 8 位单片机,片内含 4k bytes的可反复擦写的 Flash 只读程序存储器和 128 bytes 的随机存取数据存储器( RAM),器件采用 ATMEL公司的高密度
vN O TOEOEP P 图 211 显示 电路和 38译码电路 图中通过单片机的 P0 端口向数码管送显示的数据,通过 、 三根地址线经过 38 译码器选择显示的位置。 其中最后一个 Y7 可以 作 为 P0 端口送数据到数码管还是从 AD0809 读取数据的选择信号。 辅助电路设计 辅助电路虽然比较简单,但却是每个系统中必不可少的部分。 有些时候
在 ST 端给出一个至少有 100ns 宽的正脉冲信号。 是否转换完毕,我们根据 EOC 信号来判断。 当 EOC 变为高电平时,这时给 OE 为高电平,转换的数据就输出给单片机。 ADC0809 工作原理 8 路模拟信号由 ADC0809 的 IN0~ IN7 端输入, AT89S51 单片机的 ALE 端口 输出的脉冲信号送 ADC0809 的 10 脚作为 ADC 的时钟信号( 产生