基于msp430单片机的温度pid算法设计毕业设计(论文)(编辑修改稿)内容摘要:

T3U17805GND1IN P U T2O U T P U T3U27905470uF , 16VC2470uF , 16VC10GND12V12V1 2P1H e a de r 212P6H e a de r 2R321KD 20D IP L E DGNDR331KD 21D IP L E DGND5V12P2H e a de r 1112P4H e a de r 1212P5H e a de r 135V 图 3 开关电源原理图 开关电源模块设计 基于 MSP430 单片机的温度 PID 算法设计 7 电源电路是整个系统中十分重要的一环,如何降低功耗成为工程师面临的急需解决的问题。 如果电源不稳定可能造成系统不能正常工作,严重的甚至烧坏芯片引发事故。 因此电源管理 越发显得重要。 电源管理是指如何将电源有效分配给系统的不同组件。 电源电路设计主要考虑用哪种类型的电源器件,输入输出电压,输出电流以及控制状态。 开关电源原理图如图 3 所示: 开关电源有功耗小,效率高、转换速度很快、功耗很小,电源的效率可以大幅度地提高,其效率可达到 80%;体积小,重量轻从开关电源的原理框图可以清楚地看到这里没有采用笨重的工频变压器;稳压范围宽,从开关电源的输出电压是由激励信号的占空比来调节的,输入信号电压的变化可以通过调频或调宽来进行补偿,这样,在工频电网电压变化较大时,它仍能够保证有较稳定的输 出电压。 此外,改变占空比的方法有脉宽调制型和频率调制型两种。 开关电源不仅具有稳压范围宽的优点,而且实现稳压的方法也较多,设计人员可以根据实际应用的要求,灵活地选用各种类型的开关电源; 滤波的效率大为提高,使滤波电容的容量和体积大为减少。 所以智能仪表的供电选择开关电源来供电。 前向模拟通道设计 由于计算机的工作速度远远快于被测参数的变化,因此一台计算机系统可供几十个检测回路使用,但计算机在某一时刻只能接收一个回路的信号。 所以,必须通过多路模拟开关实现多选一的操作,将多路输入信号依次地切换到后级。 本设计 采用 CD4051,结构原理图如下图所示。 CD4051 由电平转换、译码驱动及开关电路三部分组成。 当禁止端为“ 1”时前后级通道断开,即 S0— S7 端与 Sm 端不可能接通;当为“ 0”时,则通道可以被接通,通过改变控制输入端 C、 B、 A 的数值,就可以选通 8 个通道 S0— S7 中的一路。 模拟量采样通道流程图如图 4 所示: 图 4 模拟量采样通道流程图 基于 MSP430 单片机的温度 PID 算法设计 8 前置放大器 前置放大器的任务是将模拟输入小信号放大到 A/D 转换的的量程范围之内;对单纯的微弱信号,可用一个运算放大器进行单端同向放大或单端反向放大, OP07 芯片是一 种低噪声,非斩波稳零的双极性运算放大器集成电路。 由于 OP07 具有非常低的输入失调电压,所以 OP07 在很多应用场合不需要额外的调零措施。 OP07 同时具有输入偏置电流低和开环增益高的特点,这种低失调、高开环增益的特性使得 OP07 特别适用于高增益的测量设备和放大传感器的微弱信号等方面。 管脚分布如图 5 所示: 图 5 管脚分布 采样保持器 当某一通道进行 A/D 转换时,由于 A/D 转换需要一定的时间,如果输入信号变化较快,就会引起较大的转换误差。 为了保证 A/D 转换的精度,需要应用采样保持器,在 A/D通道中 ,采样保持器的采样和保持电平应与后级的 A/D 转换相配合,该电平信号既可以由其它控制电路产生,也可以由 A/D 转换器直接提供。 总之,保持器在采样期间,不启动 A/D 转换器,而一旦进入保持期间,则立即启动 A/D 转换器,从而保证 A/D 转换时的模拟输入电压恒定,以确保 A/D 转换精度。 输出驱动模块设计 锅炉的温度控制需要 PWM波控制接触器的开断来控制加热,实现达到设定值的目的。 但是 MSP430 不能直接驱动接触器。 所以用 MSP430 驱动继电器,通过控制继电器的开关,再用继电器控制接触器的开关,实现温度控制。 4 系统软件设计 软件开发平台 IAR Embedded Workbench 软件界面如图 7 所示: 基于 MSP430 单片机的温度 PID 算法设计 9 图 7 IAR Embedded Workbench 软件界面 IAR Embedded Workbench 是瑞典 IAR Systems 公司为微处理器开发的一个集成开发环境 (下面简称 IAR EW),支持 ARM、 AVR、 MPS430 等芯片内核平台。 EWARM 中包含一个全软件的模拟程序 (simulator)。 用户不需要任何硬件支持就可以模拟各种 ARM 内核、外部设备甚至中断的软件运行环境。 从中可以了 解和评估 IAR EWARM 的功能和使用方法 [9]。 IAR EWARM 的主要特点如下: 高度优化的 IAR ARM C/C++ Compiler IAR ARM Assembler 一个通用的 IAR XLINK Linker IAR XAR 和 XLIB 建库程序和 IAR DLIB C/C++运行库 功能强大的编辑器 项目管理器 命令行实用程序 IAR CSPY 调试器 (先进的高级语言调试器) 基于 MSP430 单片机的温度 PID 算法设计 10 温度控制程序设计 程序流程图如图 8 所示: 图 8 程序流程图 单片机将模拟量前向通道采集的模拟量数据进行 A/D 转换,进入 ADC 模块中断转换为数字量,利用 Modbus 通讯协议采用异步通讯的方式与上位机实现通讯,将当前温度反映到组态界面中,并通过比较当前温度与设定温度之间的关系进行 PID 运算,之后通过设定定时器 A 和定时器 B 输出 PWM 波实现控制功能 [10]。 主程序 MSP430 单片机内部分三种时钟信号即低速晶体振荡器、高速晶体振荡器、数字控制振荡器,高速晶体振荡器是用来进行快速大量的数据计算和快速的外部时间响应的,为基于 MSP430 单片机的温度 PID 算法设计 11 满足设计要求 [11], 本设计使用高速晶体振荡器,程序如下: BCSCTL1 amp。 = ~XT2OFF。 //打开 XT2 高频晶体振荡 do { IFG1 amp。 = ~OFIFG。 //清除晶振失败标志 for (i = 0xFF。 i 0。 i)。 //等待 8MHz 晶体起振 } while ((IFG1 amp。 OFIFG))。 //晶振失效标志仍然存在。 BCSCTL2 |= SELM_2 + SELS。 //MCLK 和 SMCLK 选择高频晶振 PID 算法程序 本 PID 算法程序采用位置式控制算式,由于在测试 过程中发现温度曲线波动较大且出现毛刺,所以在原有的完全微分的基础上改进为不完全微分,因为完全微分 PID 是一次微分作用,而不完全微分 PID 是分几次输出微分作用。 微分是一种重要的控制作用,可以较明显的改善闭环系统的控制性能。 假如偏差的阶跃幅值较大,在完全微分时,一次输出的微分作用幅值会很大,很可能会因输出限幅而丧失应有的微分作用。 而不完全微分,因为微分作用分几次输出,而每次输出幅值较小,所以能较好的保存应有的微分作用。 在开停工或大幅度升降设定值时,由于偏差累计较大,故在积分项的作用下会产生一个很大的超调,并产生 振荡,特别是对于温度、液面等变化缓慢的过程,这一现象更为严重。 为了改进控制性能可采用积分分离的方法,即在受控变量开始跟踪时,取消积分作用,偏差小于某一设定值时,才产生积分作用,程序如下: void PIDCalc(void) { float Rate。 //误差变化率 Current_Error = Set_Temp Pre_Temp。 // 当前误差计算 Sum_Error += Current_Error。 // 误差积分 Prev_Error = Last_Error。 // 存储误差更新 Last_Error = Current_Error。 // 存储误差更新 Rate = ( Current_Error Last_Error )*1000/ Ctrl_Period。 // 当前误差微分 if(Rate5)//对误差变化率进行限制 ,锅炉温度不可能变化太大 Rate=5。 if(Rate5) Rate=5。 P_OUT = P * Gain * Current_Error。 /*比例项 */ 基于 MSP430 单片机的温度 PID 算法设计 12 I_OUT = I * Gain * Sum_Error。 /*积分项 */ //积分限幅处理 if( I_OUTPID_I_MAX ) I_OUT = PID_I_MAX。 if( I_OUTPID_I_MIN ) I_OUT = PID_I_MIN。 if( ( Current_Error = ) amp。 amp。 ( Prev_Error =)) { I_OUT=I_OUT *。 } if( (Current_Error = ) amp。 amp。 ( Last_Error =55)) { I_OUT=I_OUT *。 } //因为锅炉只能加温不能降温所以一旦超过设定值令积分值为零 if( ( Current_Error = 0 ) amp。 amp。 ( Last_Error =0 )) { I_OUT=0。 } //微分延迟输出处理 D_OUT= ( D_OUT * Sdde_Para + D * Rate * (1Sdde_Para) )*Gain。 PID_OUT = P_OUT + I_OUT + D_OUT。 if ( PID_OUT = PWM_DATA_MAX ) PID_OUT = PWM_DATA_MAX。 if ( PID_OUT = PWM_DATA_MIN ) PID_OUT = PWM_DATA_MIN。 if( Set_Temp Pre_Temp =10) PID_OUT=16383。 } void main() { Device_Init( )。 while(1) { LED8_Rollback。 //系统运行指示灯 Parameter_Show( )。 } } 基于 MSP430 单片机的温度 PID 算法设计 13 ADC 模数转换程序 该段程序首先完成 ADC12 模块的通用程序框架, ADC12 模块的初始化函数,仅仅实现了多通道的单次和多次转换,单通道的可以用参数 ,多通道模式下设置一个通道 .ADC12 启动转换函数完成启动 ADC12,开始 A/D 转换。 中断程序必须自己添加处理函数 (根据实际使用的通道情况)。 这里选用的时钟 SMCLK,参考电压内部打开的是 ,每次当多个通道转换完成后,打开中断时,单片机会自动调用本函数,使用时需要自己添加处理逻辑 [12],程序如下: char ADC12Init(char n,char channels[],char rep) { if(n15) return 0。 ADC12CTL0 = ADC12ON + MSC + SHT0_0 + REFON + REF2_5V。 // 开启 ad,参考电压 ADC12CTL1 = SHP + ADC12SSEL_3。 //Use sampling timer, SMCLK for(int i = 0。 i n。 i++) { if(channels[i] = 0x80) return 0。 *(char*)(ADC12MCTL0_ + i) = channels[i]。 //每个 MCTL 设置 } *(char*)(ADC12MCTL0_ + n 1) |= EOS。 //序列结束 if(rep != 0)//多次转换 { ADC12CTL1 |= CONSEQ_3。 } else { ADC12CTL1 |= CONSEQ_1。 } ADC12IE = 1(n1)。 // Enable return 1。 } 定时器设置程 序 设定定时器 A控制寄存器使能中断,设置 CCR0 初值 ,及 100 毫秒中断一次,计数器基于 MSP430 单片机的温度 PID 算法设计 14 计数设置为加模式初始化定时器 B,函数设置 PWM 中断周期, PWM 低电平时间,设置 PWMIO口和 PWM 低电平时间。 void TA_Init(void) { TACTL=TASSEL0+TACLR。 //设定定时器 A 控制寄存器 CCTL0=CCIE。 //使能中断 CC。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。