生物室温控制系统设计毕业设计论文(编辑修改稿)内容摘要:

CMS240: 压缩比为 80: 按音质排序: A20xxS480S240 我们了解我经常对语音处理要分别进行为 A/D、编码处理、进行存储、解码处理以及 D/A 处理,而对麦克风输入的生成的 WAVE 文件,他占用的存储空间很多,比较占地方,这对相对存储空间较小的单片机有点多,而 SOCE061A 提出解决的方法,级 SACMLIB,它将 A/D、编码、解码、存储、 D/A 来做成相应的模块,每 个模块都有相应的应用程序接口 API,所以只要了解相应的模块程序的功能及接口参数,然后调用相 应的函数就可以实现相应的功能。 通过对从 SPCE061A 单片机 DAC 输出的信号放大,从 DAC 通道出来的是电流信号, DAC 输出通过 SPY0030,进行音频放大,放大进过滤波之后,得到的是平稳的电流信号,然后通过对外接滑动电阻进行调节,从而进行对放大器放大功率的调整,达到合适的效果目标,然后进过 SPY0030 放大,然后进过喇叭,进行播报的功能, 第三章 软件部分的设计 算法有两种: 直接算法就是当前需要的控制量。 公式: Pout = Kp * e(t) + Ki * Σ e(t) + Kd (e(t) – e(t1))。 增加量计算法就是在相对于标准算法的相邻两次运算之差,从而得到的结果是增加量,换个说法就是说在上一次控制量的基础上要增加的控制量。 公式: Pout(t1) = Kp*(e(t) – e(t1) + Ki e(t) + Kd(e(t) – 2*e(t1) + e(t2))。 基本偏差 :e(t) 表示的是当前测量值与设定的目标之差,设定目标为被减数,结果可以是正或负,正数表示的是还没有达到,负数表示的事已经超过了预期的设定值。 这是面向比例项用的变动数据。 累计偏差:Σ e(t)= e(t) + e(t1) + e(t2)+…… .+e(1),这是每一次测量到的偏差值的总和,即代数和,考虑到正负符号运算,即面向积分项用运的变动数据而已。 基本偏差和相对偏差: e(t) – e(t1),将本次的基偏差减去上次的基偏差,来考察当前控制量对象的发展趋势,这块作为快速反应的一个重要依据,即面向微分项的可变动的一个数据。 比例调节作用:这个是按比例反应的系统偏差,如果系统出现了偏差,比例调节系统立即便会产生调节作用,来减少偏差。 比例作用大,就可以加快调节的作用,这样减少误差,但是如果比例过大,这便使系统的稳定性能下降,甚至造成系统的不稳定。 积分调节作用:即使系统消除或减少稳态误差,来提高无差度的标准。 因为有误差,积分调节就在进行,直至到无差,如果积分调节停止,积分调节便会输出一常值。 积分作用的强弱在于与积分的时间常数 Ti,如果 Ti越小,积分作用便会就越强。 反过来 Ti大,积分作用就会弱,积分调节会使系统稳定性能下降,动态响应 变慢。 积分作用便与另外两种调节规律结合,来组成 PI调节器或者是 PID调节器。 微分调节作用:微分作用是反映系统偏差信号的变化情况,具有预见性,它能预测到偏差变化的趋势,这便能使系统产生预知的控制作用,即在偏差还没有成形之前,就已经被微分调节的作用消除了。 因此,在微分调节可以改变系统的动态性能。 如果微分时间在选择合适情况下,便可以减少超调的情况,减少调节时间。 加快率,但是微分调节的作用对噪声干扰有很大的作用,所以过强的加强微分调节,对系统抗干扰能力不利。 而且,微分反应即是变化率,对当输入没有变化时,微分作用 输出为 0;而且微分作用不能单独作用,需要和其他两种调节作用规律相结合,组成 PD 或者是 PID 控制器。 由图可知 PID 调节器是一种线性调节器,这种调节器是将设定值 w与实际输出值 y进行比较构成偏差 模拟 PID 控制 ywe  并将其比例、积分、微分通过线性组合构成控制量。 其动态方程为: dt tdeKdtteKteKtu dip )()()()(   ( 1) 其中 pK 为调节器的比例放大系数 iK 为积分时间常数 dK 为微分时间常数 PID 调节器的离散化表达式为 )]1()([)()()(  kekeTKkTeKkeKku dip 其增量表达形式为: )1()()(  kukuku )]2()1(2)([)()]1()([  kekekeTKkTeKkekeK dip 其中 T为采样周期。 可见温度 PID 调节器有三个可设定参数,即比例放大系数 pK 、积分时间常数 iK 、微分时间常数 dK。 程序流程图 开 始系 统 初 始 化读 取 键 值对 读 取 的 值 进 行 处 理是 否 有 采 样 数 据 处 理语 音 读 数进 行 P I D 数 据 处 理继 电 器 控 制 电 炉YN int main(void){ int iKeyValue。 status = system_temperature_set。 guifgSpeechPlay = 0。 System_Initial()。 PIDinit()。 while(1){ System_ServiceLoop()。 //键盘扫描、去抖动处理 iKeyValue = SP_GetCh()。 //取键值 key_value_process(iKeyValue)。 //键值处理 if(guifgSpeechPlay) temperature_speech_play( )。 //语音播放 if(status == system_temperature_control) display_speech_ADC_temperature()。 //测量温度显示、温度播报、 PID 计算 Clear_WatchDog()。 //清看门狗 System_ServiceLoop()。 //键盘扫描 if(fOut=0) turn_off_timerB()。 } } 程序刚开始进行系统的一个初始化,然后开始进行读取输入的值,对值进行转换,变成电脑能够识别的编码,然后同时对采集的数据进行转化 ,判断,如果达到一个设定的标准,就进行在 DAC 输出口输出数据,通过 SPY0030 进行放大,通过喇叭进行语音播报,同时进行数据处理与判断,通过改变电磁继电器的状态给电热炉加热或停止加热。 从主程序看,在进行一系列的程序调用之前对系统进行初始化,然后在对键盘的其他程序进行调试,看是否有所反应,从而判断是否有温度样本的采集,如果有就进行温度的 A/D 转换盒 PID 计算,然后用控制继电器。 SPCE061A 内置的看门狗监视器,其作用就是看是系统是否正常运行,其实就是一个计数器,每隔一段时间就被清除了,其中的清除时间为 ,不然的话,计数将溢出,是系统运行出现差错,导致系统复位,并开始执行程序,看门狗监视系统可以通过指令来设置火屏蔽。 看门狗清除寄存器 P_Watchdog_Clear在 SPCE061A 系统正常运行时,只要每隔 向 P_Watchdog_Clear 写入相应的清除程序便可对看门狗计数器进行清除,这样就不会反正看门狗计数发生溢出,在运行时就不会导致系统出现复位,保证了系统正常 的运行。 A/D 值转换处理 开 始是 否 有 温 度 采 集A D C 数 据 采 样 均 值 处理转 换 成 温 度十 进 制 转 换L E D 显 示 语 音 播 报 P I D 计 算结 束 void display_speech_ADC_temperature(void) { float fT,K。 int adc_data。 static int siTlast = 0。 if(G_ADC_flag){ //判断是否有温度采样 1,有 0,无 G_ADC_flag = 0。 adc_data = adc_data_cmp()。 adc_data /= SET_ADC_TIME。 //计算温度平均值 if(adc_data 0x0255) K =。 //确定温度系数 else K =。 fT = adc_data * K。 //换算成温度值 //将温度值转换成十进制用于 LED 显示 guiLED_Value[0] = (int)fT/10。 guiLED_Value[1] = (int)fT%10。 guiLED_Value[2] = (int)(fT*10)%10。 if((int)fT != siTlast){ //判断温度的整数值是否变化 temperature_speech_index(guiLED_Value)。 //温度整数值语音播放排序 SACM_A20xx_Initial(0)。 //非自动方式播放的初始化 SACM_A20xx_InitDecoder(DAC2)。 //开始对 A20xx的语音数据以非自动方式解码 SP_INT_IRQ6()。 iAddrSpeech = speech_start_address(iaSpeech_index[0])。 //语音播放始地址 guifgSpeechPlay = 1。 //设置语音为播放状态 siTlast = (int)fT。 } = 1。 // 设置 PID 比例值 =。 // 设置 PID 积分值 =。 // 设置 PID 微分值 fOut = 100*PIDCalc ( amp。 stPID,(int)(fT*10) )。 // PID计算 active()。 } } 当单片机收到温度数据采样时,对采集的温度进行均值处理,来防止在采样的过程中由外界干扰造成对采样数据的不准确。 然后来确定温度的系数,使得采样转换进行,得到电压信号进而转 换成温度值,并且进行十进制的转换,用于LED 显示、语音播报和 PID 计算。 其中均值处理处于很重要的地位,而 A/D 转换是必须进行的工作。 采样数据中断程序流程 其中继电器是与 61 单片机的 IOA4 口相连的,继电器的开断完全在于 IOA4口的输出结果,也就是 PID 计算的结果。 如果输出小于零则就表示设定的值小于输出值,这是就要表示关闭电炉,同时要关闭定时器 B 的计时状态。 定 时 器 1 0 秒 定 时 中 断看 时 间 是 否 到关 闭 继 电 器时 间 积 累清 理 中 断退 出N如果输出的值大于或等于设定值 2摄氏度时就对开电炉对水开始加热。 这样设定值与实际输出值差值在 2 摄氏度以内时,我们就调用中断程序来定时加热。 void active() { if(fOut=0){ turn_off_relay()。 //温度高于设定值,关闭电炉 turn_off_timerB()。 //停止计时 } else{ if(fOut30*) //温度低于设定值 2摄氏度 turn_on_relay()。 //开电炉加热 else { turn_on_relay()。 SP_INT_TIMEB()}。 //初始化定时器,开始定时加热 } } 上图是相关继电器控制程序的中断服务子程序流程图,它是用来控制继电器来定时加热。 它通过中断定时器 10ms 确定加热时间大小,当加热时间未到预定数时,则继续时间累积,如果加热时间到预定时,就调。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。