本帖最后由 Abner_ux47Y 于 2023-8-20 18:50 编辑
1. 系统开发背景: 癌症病人比如:淋巴瘤、白血病、乳腺癌、肉瘤患者经过放疗或者化疗容易出现脱发,大家在电视或媒体中常见到的完全脱发的恶性肿瘤患者。因为这些肿瘤的化疗方案经常强度比较高,并且使用的化疗药物,比如紫杉类药物和蒽环类化疗药物容易引起脱发。紫杉类药物包括:紫杉醇、多西紫杉醇、紫杉醇白蛋白结合型等,蒽环类药物包括阿霉素、表阿霉素、多柔比星脂质体等。手术,化疗,放疗等是被人们经常提起的治疗癌症最主要的手段,而化疗更是经常被妖魔化,大部分人能接受手术切除器官,而不能接受化疗引起的副作用,比如,化疗引起的头发,眉毛脱落,以及化疗呕吐等。化疗后为什么会掉头发许多药物都会损头发,免疫抑制剂,化疗药物,砷剂等药物可导致脱发。化疗药物在癌细胞生长的不同时期,都可阻止癌细胞的增值,浸润,转移,直至最终杀灭癌细胞,但是目前的化疗药物还不是太理想。 化疗药物在杀死癌细胞的同时,任何与癌细胞相似的生长比较迅速的快速分裂的细胞,都会被化疗药物伤害,头皮细胞就是这样的情况,约有九成的头发会因此脱落。当化疗停止后就会长出来。主导毛发生长的毛囊细胞受损伤后,头皮,面部,四肢,腋下和阴部等,导致不同部位的毛发不同程度的脱落。
2. 系统原理 脱发是有很好的预防措施,如附图所示。这是一种明确的可以减少脱发的方法,冰帽,顾名思义,就是用冰制作的帽子戴在头上。2015年ASCO的文献报导,冰帽缓解脱发的有效率在60-80%以上。原理是低温使得头皮血管收缩,减少头皮血流量,于是降低了到达头皮的化疗药物总量, 水在水箱与制冷系统之间通过一水泵循环;当水温降到设定温度时,设备发出声光信号,操作人员介入,人员做完准备工作后按下“运行开关”;另一水泵将水在水箱与冰帽/手套间循环,开始对头部/手部进行控温。 控温原理: 设备采用PID控制进行调温,通过温度传感器反馈的信号,对Pvar、Ivar、Dvar(比例、积分、微分)三个参数进行整定与优化,调整水箱水温,以此来实现对头部或手部的精确控温。并且低温使得头皮的毛囊细胞代谢水平减低,降低了对化疗药物的敏感性。 3. 系统设计框架 RA6M5开发板MCU功能强大包括12位逐次逼近模数转换器(ADC12)单元。在单元0中,最多可选择13个模拟输入通道。在单元1中,最多可以选择16个模拟输入通道、温度传感器输出、内部参考电压进行相应单元的转换。AD转换精度可从12位、10位、8位转换中选择,从而可以在生成数字值时优化速度和分辨率之间的权衡。
系统包含N个温度传感器,SPI DMA 控制的4.3寸 LVGL GUI显示屏,AT WiFi 4G模块。IO控制继电器等,开发板有的IO被占,正在设计主板,开发项目难啊,实战项目。
4.软件设计 基于 e2 studio开发
- int get_temperature(uint adc)
- {
- uint code *p;
- uint i;
- uchar j,k;
- uchar min,max; //查表序号, 0对应-40度, 160对应120度
-
- // adc = 4096 - adc; //Rt接地
- p = temp_table;
- if(adc < p[0]) return (0xfffe);
- if(adc > p[160]) return (0xffff);
-
- min = 0; //-40度
- max = 160; //120度
- for(j=0; j<5; j++) //对分查表
- {
- k = min / 2 + max / 2;
- if(adc <= p[k]) max = k;
- else min = k;
- }
- if(adc == p[min]) i = (uint)min * D_SCALE;
- else if(adc == p[max]) i = (uint)max * D_SCALE;
- else // min < temp < max
- {
- while(min <= max)
- {
- min++;
- if(adc == p[min]) {i = (uint)min * D_SCALE; break;}
- else if(adc < p[min]) //线性插补
- {
- min--;
- i = p[min]; //min
- j = (adc - i) * D_SCALE / (p[min+1] - i);
- i = min;
- i *= D_SCALE;
- i += j;
- break;
- }
- }
- }
- return (i-400);
- }
复制代码PID - float temp = 0.0f; //传感器温度,全局变量
- void PidTempControl(void)
- {
- float ee;
- float TempSet = 45.0f; //目标温度
- float PidE0 = 0.0f;
- float PidKp = 0.0f,PidKi = 0.0f,PidKd = 0.0f;
- float PidOut = 0.0f;
- float PidSum = 0.0f,I_out = 0.0f;
- static float PidE1 = 0.0f;
- PidKp = 15.0f;
- PidKi = 25.0f;
- PidKd = 0.0f; //初始化参数
-
- PidE0 = TempSet - temp; //本次偏差
- ee = (PidE0 - PidE1); //计算一阶偏差
- if(ee > 2.0f) ee = 2.0f;
- else if(ee < -2.0f) ee = -2.0f;
- PidSum += PidE0; //偏差之和
- if(PidSum > 5.0f) PidSum = 5.0f;
- else if(PidSum < -3.0f) PidSum = -3.0f;
- PidOut = PidKp * PidE0 + PidKd * ee; //计算PID的比例和微分输出
- if(fabs(PidE0) < 3.0f) //如果温度相差小于3度则计入PID积分输出
- {
- if(PidSum > 5.0f) PidSum = 5.0f;
- else if(PidSum < -2.0f) PidSum = -2.0f;
- I_out = PidKi * PidSum; //积分输出
- if(fabs(PidE0) < -1.0f) //当前温度高于设定温度0.5度时,累计积分限制
- {
- if(PidSum > 5.5f) PidSum = 5.5f;
- if(PidSum > 0) I_out -= 1; //当前温度高于设定温度0.5度时,消弱积分正输出
- }
- PidOut += I_out;
- }
- else
- {
- PidSum = 0.0f;
- }
- PidOut *= 500; //与控制量的比例系数
- if(PidOut > 2500) PidOut = 2500;
- if(PidOut < 0) PidOut = 400;
- if(PidE0 > 5.0f) PidOut = 2500;
- if(PidE0 < -2) PidOut =0;
- HeaterSet(PidOut); //输出控制量
- PidE1 = PidE0;
- }
复制代码4. 成果展示: 单片机GUI界面 基于C++开发的上位机
|