野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 666|回复: 0

【瑞萨RA MCU创意氛围赛】基于瑞萨启明6m5智能化疗防脱发...

[复制链接]
发表于 2023-8-20 18:48:53 | 显示全部楼层 |阅读模式
本帖最后由 Abner_ux47Y 于 2023-8-20 18:50 编辑

1. 系统开发背景:
     癌症病人比如:淋巴瘤、白血病、乳腺癌、肉瘤患者经过放疗或者化疗容易出现脱发,大家在电视或媒体中常见到的完全脱发的恶性肿瘤患者。因为这些肿瘤的化疗方案经常强度比较高,并且使用的化疗药物,比如紫杉类药物和蒽环类化疗药物容易引起脱发。紫杉类药物包括:紫杉醇、多西紫杉醇、紫杉醇白蛋白结合型等,蒽环类药物包括阿霉素、表阿霉素、多柔比星脂质体等。手术,化疗,放疗等是被人们经常提起的治疗癌症最主要的手段,而化疗更是经常被妖魔化,大部分人能接受手术切除器官,而不能接受化疗引起的副作用,比如,化疗引起的头发,眉毛脱落,以及化疗呕吐等。化疗后为什么会掉头发许多药物都会损头发,免疫抑制剂,化疗药物,砷剂等药物可导致脱发。化疗药物在癌细胞生长的不同时期,都可阻止癌细胞的增值,浸润,转移,直至最终杀灭癌细胞,但是目前的化疗药物还不是太理想。
化疗药物在杀死癌细胞的同时,任何与癌细胞相似的生长比较迅速的快速分裂的细胞,都会被化疗药物伤害,头皮细胞就是这样的情况,约有九成的头发会因此脱落。当化疗停止后就会长出来。主导毛发生长的毛囊细胞受损伤后,头皮,面部,四肢,腋下和阴部等,导致不同部位的毛发不同程度的脱落。

2. 系统原理
脱发是有很好的预防措施,如附图所示。这是一种明确的可以减少脱发的方法,冰帽,顾名思义,就是用冰制作的帽子戴在头上。2015ASCO的文献报导,冰帽缓解脱发的有效率在60-80%以上。原理是低温使得头皮血管收缩,减少头皮血流量,于是降低了到达头皮的化疗药物总量,
水在水箱与制冷系统之间通过一水泵循环;当水温降到设定温度时,设备发出声光信号,操作人员介入,人员做完准备工作后按下“运行开关”;另一水泵将水在水箱与冰帽/手套间循环,开始对头部/手部进行控温。
控温原理:
设备采用PID控制进行调温,通过温度传感器反馈的信号,对PvarIvarDvar(比例、积分、微分)三个参数进行整定与优化,调整水箱水温,以此来实现对头部或手部的精确控温。并且低温使得头皮的毛囊细胞代谢水平减低,降低了对化疗药物的敏感性。
3. 系统设计框架
    RA6M5开发板MCU功能强大包括12位逐次逼近模数转换器(ADC12)单元。在单元0中,最多可选择13个模拟输入通道。在单元1中,最多可以选择16个模拟输入通道、温度传感器输出、内部参考电压进行相应单元的转换。AD转换精度可从12位、10位、8位转换中选择,从而可以在生成数字值时优化速度和分辨率之间的权衡。
  

1.jpg
2.jpg
系统包含N个温度传感器,SPI DMA 控制的4.3寸 LVGL GUI显示屏,AT WiFi 4G模块。IO控制继电器等,开发板有的IO被占,正在设计主板,开发项目难啊,实战项目。
3.jpg

4.软件设计
   基于 e2 studio开发

33.jpg
4.jpg


  1. int        get_temperature(uint adc)
  2. {
  3.         uint        code *p;
  4.         uint        i;
  5.         uchar        j,k;
  6.         uchar        min,max;        //查表序号, 0对应-40度, 160对应120度
  7.         
  8. //        adc = 4096 - adc;        //Rt接地
  9.         p = temp_table;
  10.         if(adc < p[0])                return (0xfffe);
  11.         if(adc > p[160])        return (0xffff);
  12.         
  13.         min = 0;                //-40度
  14.         max = 160;                //120度

  15.         for(j=0; j<5; j++)        //对分查表
  16.         {
  17.                 k = min / 2 + max / 2;
  18.                 if(adc <= p[k])        max = k;
  19.                 else                        min = k;
  20.         }
  21.                  if(adc == p[min])        i = (uint)min * D_SCALE;
  22.         else if(adc == p[max])        i = (uint)max * D_SCALE;
  23.         else        // min < temp < max
  24.         {
  25.                 while(min <= max)
  26.                 {
  27.                         min++;
  28.                         if(adc == p[min])        {i = (uint)min * D_SCALE;        break;}
  29.                         else if(adc < p[min])        //线性插补
  30.                         {
  31.                                 min--;
  32.                                 i = p[min];        //min
  33.                                 j = (adc - i) * D_SCALE / (p[min+1] - i);
  34.                                 i = min;
  35.                                 i *= D_SCALE;
  36.                                 i += j;
  37.                                 break;
  38.                         }
  39.                 }
  40.         }
  41.         return (i-400);
  42. }
复制代码
PID
  1. float temp = 0.0f;                   //传感器温度,全局变量
  2. void PidTempControl(void)
  3. {
  4.     float ee;
  5.     float TempSet = 45.0f;           //目标温度

  6.     float PidE0 = 0.0f;
  7.     float PidKp = 0.0f,PidKi = 0.0f,PidKd = 0.0f;
  8.     float PidOut = 0.0f;
  9.     float PidSum = 0.0f,I_out = 0.0f;
  10.     static float PidE1 = 0.0f;               

  11.     PidKp = 15.0f;
  12.     PidKi = 25.0f;
  13.     PidKd = 0.0f;                         //初始化参数
  14.   
  15.     PidE0 = TempSet - temp;       //本次偏差
  16.     ee = (PidE0 - PidE1);        //计算一阶偏差

  17.     if(ee > 2.0f) ee = 2.0f;
  18.     else if(ee < -2.0f) ee = -2.0f;

  19.     PidSum += PidE0;                               //偏差之和

  20.     if(PidSum > 5.0f) PidSum = 5.0f;
  21.     else if(PidSum < -3.0f) PidSum = -3.0f;

  22.     PidOut = PidKp * PidE0 + PidKd * ee;       //计算PID的比例和微分输出

  23.     if(fabs(PidE0) < 3.0f)                     //如果温度相差小于3度则计入PID积分输出
  24.     {
  25.         if(PidSum > 5.0f) PidSum = 5.0f;
  26.         else if(PidSum < -2.0f) PidSum = -2.0f;

  27.         I_out = PidKi * PidSum;                      //积分输出


  28.         if(fabs(PidE0) < -1.0f)                       //当前温度高于设定温度0.5度时,累计积分限制
  29.         {
  30.             if(PidSum > 5.5f) PidSum = 5.5f;
  31.             if(PidSum > 0)    I_out  -= 1;               //当前温度高于设定温度0.5度时,消弱积分正输出
  32.         }

  33.         PidOut += I_out;
  34.     }
  35.     else
  36.     {
  37.         PidSum = 0.0f;
  38.     }

  39.     PidOut *= 500;                                                 //与控制量的比例系数
  40.     if(PidOut > 2500) PidOut = 2500;
  41.     if(PidOut < 0)    PidOut = 400;
  42.     if(PidE0 > 5.0f) PidOut = 2500;
  43.     if(PidE0 < -2) PidOut =0;

  44.     HeaterSet(PidOut);                              //输出控制量
  45.     PidE1 = PidE0;   
  46. }
复制代码
4. 成果展示:
单片机GUI界面
5.jpg
  基于C++开发的上位机
7.jpg

TT台99.jpg



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-2 15:15 , Processed in 0.034598 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表