Abner_ux47Y 发表于 2023-8-20 18:48:53

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

本帖最后由 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)                return (0xfffe);
      if(adc > p)      return (0xffff);
      
      min = 0;                //-40度
      max = 160;                //120度

      for(j=0; j<5; j++)      //对分查表
      {
                k = min / 2 + max / 2;
                if(adc <= p)      max = k;
                else                        min = k;
      }
               if(adc == p)      i = (uint)min * D_SCALE;
      else if(adc == p)      i = (uint)max * D_SCALE;
      else      // min < temp < max
      {
                while(min <= max)
                {
                        min++;
                        if(adc == p)      {i = (uint)min * D_SCALE;      break;}
                        else if(adc < p)      //线性插补
                        {
                              min--;
                              i = p;      //min
                              j = (adc - i) * D_SCALE / (p - i);
                              i = min;
                              i *= D_SCALE;
                              i += j;
                              break;
                        }
                }
      }
      return (i-400);
}PIDfloat 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++开发的上位机



页: [1]
查看完整版本: 【瑞萨RA MCU创意氛围赛】基于瑞萨启明6m5智能化疗防脱发...