AT32F421驱动BLDC 配合上位机控制与调参

news2024/9/25 1:14:24

AT32F421驱动BLDC 配合上位机控制与调参


  • 🔧AT32 电机控制与调参上位机软件:ArteryMotorMonitorhttps://www.arterytek.com/cn/support/motor_control.jsp?index=0
  • 🌿测试电机参数:2204-12N14P,无感BLDC,极对数7
  • 📘测试工程:bldc_1shunt_sensorless(在上面页可以下载到AT32F421_MC_Library_Project_V2.1.2
    在这里插入图片描述

👉 个人也是初始使用该调参上位机软件,在探索使用过程中,遇到不少问题,例如状态不正常,电机不转等问题。建议初次使用先仔细阅读相关文档和原理图,如果使用官方提供的驱动板可以略过,直接参照文档测试即可,对于采用自制驱动板的需要参考官方的原理图进行连接,软件工程也需要做相对应修改。

  • 🍁官方提供的驱动原理图部分参考:AT-MOTOR-EVB-V2.0_SCH.pdf(个人采用的EG2133,和官方使用的驱动芯片功能一样,下桥臂低电平开启)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 🌿控制引脚:(参考AT-MOTOR-EVB-V2.0_SCH.pdf原理图)
    在这里插入图片描述
    在这里插入图片描述

==== 3相PWM控制 ====
U  	上桥臂 PA8
V   上桥臂 PA9
W   上桥臂 PA10
----------------
U  	下桥臂 PB13
V   下桥臂 PB14
W   下桥臂 PB15
BRK  刹车 PB12  PB8
------------
==== HALL ====
PB4
PB5
PB0
==== 比较器反电动势检测 ====
PA5
PA6
PA7
=== VBUS电压 ====
PA4
--- 温度 ---
PB1

🛠工程参数设定

  • 🔖电机主要参数在设置文件motor_control_drive_param.h中配置:
  • 🌿驱动电机参数:
/* choose sensor */
//#define HALL_SENSORS  //带霍尔传感器检测
#define SENSORLESS    //无传感器控制的模式(通用)
#define BLDC_SENSORLESS_ADC		//六步方波无传感器控制以 ADC 检测反电势的模式
//#define BLDC_SENSORLESS_COMP		//六步方波无传感器控制以比较器检测反电势的模式

.......

/* Motor parameters  */
#define RS_LL                        (1.89)           /* Stator resistance, ohm 电机线间电阻值(unit: Ω)*/
#define LS_LL                        (0.002387)       /* Stator inductance, H 电机线间电感值(unit: H)*/
#define POLE_PAIRS                   (14/2)              //电机极对数
#define KE                           (1.0)            /* Back EMF constant(line-to-line, peak voltage), V/rpm 电机 KE 值(unit: V/rpm)*/
#define NOMINAL_CURRENT              (1.7)	//电机额定电流 (unit: ampere)

  • 🌿反电势检测模式:(决定调参控制上位机软件控制界面)
/* choose how to start up */
//#define INIT_ANGLE_STARTUP	//无传感器之初始角度检测启动(通用)
#define ALIGN_AND_GO_STARTUP  //无传感器之对齐启动(通用)
//#define OPENLOOP_STARTUP    //无传感器之开环启动(通用)

在这里插入图片描述

📗启动步骤和条件

  • 以下内容和官方提供的AT32F421_MC_Library_Project中相关文档说明基本相同。
    在这里插入图片描述

在这里插入图片描述

    1. 加载工程配置
      在这里插入图片描述
      在这里插入图片描述
    1. 打开对应串口,连接目标板串口1引脚(PB6/Tx1,PB7/Rx1)
      在这里插入图片描述
    1. 按下播放键(4.)即可周期性更新 UI 接口的数据以及与目标板通过串口实时通信, 如发送启动/停止电机
      的命令、实时调速、调试电流 PID 参数以及监控参数绘制波形等。
      在这里插入图片描述
    1. 发波启动条件:ESC_STATE_SAFTY_READY
      在这里插入图片描述
  • 🌟如果不是使用的官方的驱动板,像我采用自制的驱动板,硬件参数不一样,可以在对应的驱动程序中,对相关参数。进行修改或检测内容进行屏蔽。(屏蔽位置:滴答定时器回调中SysTick_Handler
void SysTick_Handler(void)
{
  int16_t sp_value = 0;
  flag_status mode_switch1 = SET;

  sp_value = adc_in_tab[ADC_POTENTIO_IDX] - SP_OFFSET;
  mode_switch1 = gpio_input_data_bit_read(MODE1_BUTTON_PORT, MODE1_BUTTON_PIN);

  switch(esc_state_old)
  {
  case ESC_STATE_IDLE:
    if(ctrl_source == CTRL_SOURCE_EXTERNAL)
    {
      if((sp_value <= 0) && (param_initial_rdy == SET) && (curr_offset_rdy == SET))
      {
        esc_state = ESC_STATE_SAFETY_READY;
      }
      else
      {
        esc_state = ESC_STATE_IDLE;
      }
    }
    else
    {
      if((param_initial_rdy == SET) && (curr_offset_rdy == SET))
      {
        esc_state = ESC_STATE_SAFETY_READY;
      }
      else
      {
        esc_state = ESC_STATE_IDLE;
      }
    }

    break;

  case ESC_STATE_SAFETY_READY:
    if(ctrl_mode == ID_MANUAL_TUNE || ctrl_mode == IQ_MANUAL_TUNE)
    {
      if(start_stop_btn_flag == SET)
      {
        esc_state = ESC_STATE_I_TUNE;
      }
    }
    else if(ctrl_mode == SPEED_CTRL)
    {
      if(ctrl_source == CTRL_SOURCE_EXTERNAL)
      {
        if(sp_value >= SP_RUN_POINT)
        {
          if (mode_switch1 == SET)  /* CCW*/
          {
            hall_ccw_ctrl_para();
            rotor_speed.dir = CCW;
            current.volt_sign = -1;
          }
          else  /* CW*/
          {
            hall_cw_ctrl_para();
            rotor_speed.dir = CW;
            current.volt_sign = 1;
          }
          esc_state = ESC_STATE_ANGLE_INIT;
        }
        else
        {
          esc_state = ESC_STATE_SAFETY_READY;
        }
      }
      else if(ctrl_source == CTRL_SOURCE_SOFTWARE)
      {
        if((speed_ramp.cmd_final != 0) && (start_stop_btn_flag == SET))
        {
          if(speed_ramp.cmd_final > 0)        /* CW*/
          {
            hall_cw_ctrl_para();
            rotor_speed.dir = CW;
            current.volt_sign = 1;
          }
          else if(speed_ramp.cmd_final < 0)   /* CCW*/
          {
            hall_ccw_ctrl_para();
            rotor_speed.dir = CCW;
            current.volt_sign = -1;
          }
          esc_state = ESC_STATE_ANGLE_INIT;
        }
        else
        {
          esc_state = ESC_STATE_SAFETY_READY;
        }
      }
    }
    else if(ctrl_mode == TORQUE_CTRL)
    {
      if(ctrl_source == CTRL_SOURCE_EXTERNAL)
      {
        if(sp_value >= SP_RUN_POINT)
        {
          if (mode_switch1 == SET)   /* CCW*/
          {
            hall_ccw_ctrl_para();
            rotor_speed.dir = CCW;
            current.volt_sign = -1;
          }
          else  /* CW*/
          {
            hall_cw_ctrl_para();
            rotor_speed.dir = CW;
            current.volt_sign = 1;
          }
          esc_state = ESC_STATE_ANGLE_INIT;
        }
        else
        {
          esc_state = ESC_STATE_SAFETY_READY;
        }
      }
      else if(ctrl_source == CTRL_SOURCE_SOFTWARE)
      {
        if((current.Ibus.Iref != 0) && (start_stop_btn_flag == SET))
        {
          if(current.Ibus.Iref > 0)        /* CW*/
          {
            hall_cw_ctrl_para();
            rotor_speed.dir = CW;
            current.volt_sign = 1;
          }
          else if(current.Ibus.Iref < 0)   /* CCW*/
          {
            hall_ccw_ctrl_para();
            rotor_speed.dir = CCW;
            current.volt_sign = -1;
          }
          esc_state = ESC_STATE_ANGLE_INIT;
        }
        else
        {
          esc_state = ESC_STATE_SAFETY_READY;
        }
      }
    }
    else if(ctrl_mode == OPEN_LOOP_CTRL)
    {
      if(ctrl_source == CTRL_SOURCE_EXTERNAL)
      {
        if(sp_value >= SP_RUN_POINT)
        {
          openloop.period_ref = openloop.olc_init_period;
          openloop.volt_ref = openloop.olc_init_volt;
          esc_state = ESC_STATE_STARTING;
        }
        else
        {
          esc_state = ESC_STATE_SAFETY_READY;
        }
      }
      else if(ctrl_source == CTRL_SOURCE_SOFTWARE)
      {
        if(start_stop_btn_flag == SET)
        {
          openloop.period_ref = openloop.olc_init_period;
          openloop.volt_ref = openloop.olc_init_volt;
          esc_state = ESC_STATE_STARTING;
        }
        else
        {
          esc_state = ESC_STATE_SAFETY_READY;
        }
      }
    }

    if(I_auto_tune.state_flag == PROCESSING)
    {
      current_auto_tuning(&I_auto_tune);
      set_current_pid_param(&I_auto_tune, &pid_is);
      I_auto_tune.state_flag = SUCCEED;
    }

    break;

  case ESC_STATE_ANGLE_INIT:
    /* Determine the initial position at the beginning(BLDC sensor-less) */
    angle_init_func();

    /* Stop motor */
    if((ctrl_source == CTRL_SOURCE_SOFTWARE && start_stop_btn_flag == RESET) ||
        (ctrl_source == CTRL_SOURCE_EXTERNAL && sp_value <= SP_STOP_POINT))
    {
      esc_state = ESC_STATE_FREE_RUN;
    }

    break;

  case ESC_STATE_STARTING:
    if(ctrl_mode == OPEN_LOOP_CTRL)
    {
      esc_state = ESC_STATE_RUNNING;
    }
    else
    {
      if (sense_hall_steps < SENSE_HALL_TIMES)
      {
        sys_counter++;
        if (sys_counter >= REBOOT_PERIOD_MS)
        {
          esc_state = ESC_STATE_SAFETY_READY;
        }
      }
      else
      {
        esc_state = ESC_STATE_RUNNING;
        start_state = START_STATE_STABLE_RUN;
        sys_counter = 0;
        /* Set parameter for switching to closed-loop control */
        rdy_to_close_loop_param();
      }
    }

    /* Stop motor */
    if((ctrl_source == CTRL_SOURCE_SOFTWARE && start_stop_btn_flag == RESET) ||
        (ctrl_source == CTRL_SOURCE_EXTERNAL && sp_value <= SP_STOP_POINT))
    {
      esc_state = ESC_STATE_FREE_RUN;
    }

    break;

  case ESC_STATE_RUNNING:
    if(ctrl_mode == SPEED_CTRL)
    {
      if(ctrl_source == CTRL_SOURCE_EXTERNAL)
      {
        if (sp_value <= SP_STOP_POINT)
        {
          speed_ramp.cmd_final = 0;

          if(rotor_speed.filtered <= MIN_CONTROL_SPEED)
          {
            esc_state = ESC_STATE_FREE_RUN;
          }
        }
        else
        {
          if (mode_switch1 == SET)  /* CCW*/
          {
            if (sp_value >= SP_RUN_POINT)
            {
              speed_ramp.cmd_final = -MIN_CONTROL_SPEED - (((sp_value << 1) * SP_TO_SPD_CMD) >> 15);
            }
            else
            {
              speed_ramp.cmd_final = -MIN_CONTROL_SPEED;
            }
          }
          else                     /* CW*/
          {
            if (sp_value >= SP_RUN_POINT)
            {
              speed_ramp.cmd_final = MIN_CONTROL_SPEED + (((sp_value << 1) * SP_TO_SPD_CMD) >> 15);
            }
            else
            {
              speed_ramp.cmd_final = MIN_CONTROL_SPEED;
            }
          }
        }
        command_ramp(&speed_ramp);
#if defined WITHOUT_CURRENT_CTRL
        volt_cmd = pid_controller(&pid_spd_volt, (speed_ramp.command - rotor_speed.filtered));
#else
        current.Ibus.Iref = pid_controller(&pid_spd, (speed_ramp.command - rotor_speed.filtered));
#endif
      }
      else if(ctrl_source == CTRL_SOURCE_SOFTWARE)
      {
        if (start_stop_btn_flag == RESET)
        {
          esc_state = ESC_STATE_FREE_RUN;
        }
        else
        {
          if(abs(speed_ramp.cmd_final) < MIN_CONTROL_SPEED)
          {
            if(rotor_speed.dir == CW)
              speed_ramp.cmd_final = MIN_CONTROL_SPEED;
            else
              speed_ramp.cmd_final = -MIN_CONTROL_SPEED;
          }

          command_ramp(&speed_ramp);

#if defined WITHOUT_CURRENT_CTRL
          volt_cmd = pid_controller(&pid_spd_volt, (speed_ramp.command - rotor_speed.filtered));
#else
          current.Ibus.Iref = pid_controller(&pid_spd, (speed_ramp.command - rotor_speed.filtered));
#endif
        }
      }
    }
    else if(ctrl_mode == TORQUE_CTRL)
    {
      if(ctrl_source == CTRL_SOURCE_EXTERNAL)
      {
        if (sp_value <= SP_STOP_POINT)
        {
          current.Ibus.Iref = 0;

          if(rotor_speed.filtered <= MIN_CONTROL_SPEED)
          {
            esc_state = ESC_STATE_FREE_RUN;
          }
        }
        else if (sp_value >= SP_RUN_POINT)
        {
          if (mode_switch1 == SET)    /* CCW*/
          {
            current.Ibus.Iref = -(sp_value * SP_TO_I_CMD) >> 15;
          }
          else                        /* CW*/
          {
            current.Ibus.Iref = (sp_value * SP_TO_I_CMD) >> 15;
          }
        }
      }
      else if(ctrl_source == CTRL_SOURCE_SOFTWARE)
      {
        if (start_stop_btn_flag == RESET)
        {
          esc_state = ESC_STATE_FREE_RUN;
        }
        else
        {
          esc_state = ESC_STATE_RUNNING;
        }
      }
    }
    else if(ctrl_mode == OPEN_LOOP_CTRL)
    {
      if(ctrl_source == CTRL_SOURCE_EXTERNAL)
      {
        if(sp_value <= SP_STOP_POINT)
        {
          esc_state = ESC_STATE_FREE_RUN;
        }
        else
        {
          closeloop_rdy = RESET;

          /* 5 ms inc openloop volt & spd */
          open_loop_cmd_ramp(&openloop);
        }
      }
      else if(ctrl_source == CTRL_SOURCE_SOFTWARE)
      {
        if (start_stop_btn_flag == RESET)
        {
          esc_state = ESC_STATE_FREE_RUN;
        }
        else
        {
          closeloop_rdy = RESET;

          /* 5 ms inc openloop volt & spd */
          open_loop_cmd_ramp(&openloop);
        }
      }
    }

    break;

  case ESC_STATE_FREE_RUN:
    if (rotor_speed.filtered == 0)
    {
      esc_state = ESC_STATE_SAFETY_READY;
    }
    else
    {
      esc_state = ESC_STATE_FREE_RUN;
    }

    break;

  case ESC_STATE_BRAKING:
    break;

  case ESC_STATE_ERROR:
    if(error_code == MC_NO_ERROR)
    {
      esc_state = ESC_STATE_IDLE;
    }

    break;

  case ESC_STATE_ENC_ALIGN:
    break;

  case ESC_STATE_I_TUNE:
    if (start_stop_btn_flag == SET)
    {
      I_tune_manual();
    }
    else
    {
      current.Ibus.Iref = 0;
      esc_state = ESC_STATE_FREE_RUN;
    }

    break;

  case ESC_STATE_AUTO_LEARN:
    break;
#ifdef MOTOR_PARAM_IDENTIFY
  case ESC_STATE_WINDING_PARAM_ID:
    if (motor_param_ident.state_flag == PROCESSING)
    {
      param_id_process(&motor_param_ident);
    }
    else
    {
      if (motor_param_ident.Ls.f <= 0 || motor_param_ident.Rs.f <= 0)
      {
        motor_param_ident.state_flag = FAILED;
        error_code |= error_code_mask & MC_PARAM_IDENT_ERROR;
        motor_param_ident.Rs.f = motor_param_ident.Rs_Old.f;
        motor_param_ident.Ls.f = motor_param_ident.Ls_Old.f;
      }
      else
      {
        motor_param_ident.state_flag = SUCCEED;
        motor_param_ident.Rs_Old.f = motor_param_ident.Rs.f;
        motor_param_ident.Ls_Old.f = motor_param_ident.Ls.f;
      }
      tmr_output_enable(PWM_ADVANCE_TIMER, FALSE);
      disable_pwm_timer();
      tmr_pwm_init();
      adc_preempt_config();
      PWM_ADVANCE_TIMER->cval = 0;
      enable_pwm_timer();
      esc_state = ESC_STATE_FREE_RUN;
    }
    break;
#endif

  case ESC_STATE_NONE:
    break;
  }

  fMosTemperature = (((adc_in_tab[ADC_MOS_TEMP_IDX] * ADC_REFERENCE_VOLT / ADC_DIGITAL_SCALE_12BITS) - V0_V) / dV_dT) + T0_C;
  ui_wave_param.iMosTemperature_meas = (int16_t)(fMosTemperature * 100);
  ui_wave_param.iBusVoltage_meas = (int16_t)(adc_in_tab[ADC_BUS_VOLT_IDX]);
  ui_wave_param.speed_meas_filter_pu = (int16_t)(rotor_speed.filtered * RPM_TO_SPEED_PU >> 15);
  ui_wave_param.speed_reference_pu = (int16_t)(speed_ramp.command * RPM_TO_SPEED_PU >> 15);
  adc_sample.emf.emf_half_vdc_val = (int16_t)(adc_in_tab[ADC_BUS_VOLT_IDX] * EMF_HALF_VDC_GAIN);
  zcp_highspd_fall = (adc_sample.emf.emf_half_vdc_val) + (adc_sample.emf.emf_high_spd_offset_falling);
  zcp_highspd_rise = (adc_sample.emf.emf_half_vdc_val) + (adc_sample.emf.emf_high_spd_offset_rising);
#if 1
  /* Over/under voltage protection 屏蔽过电压*/
//  if (adc_in_tab[ADC_BUS_VOLT_IDX] < UNDERVOLTAGE_THRESHOLD_d)
//  {
//    error_code |= error_code_mask & MC_UNDER_VOLT_ERROR;
//  }
//  else if (adc_in_tab[ADC_BUS_VOLT_IDX] > OVERVOLTAGE_THRESHOLD_d)
//  {
//    error_code |= error_code_mask & MC_OVER_VOLT_ERROR;
//  }

  /* MOS Temperature protection 屏蔽温度*/
//  if (adc_in_tab[ADC_MOS_TEMP_IDX] > TEMPERATURE_THRESHOLD_d)
//  {
//    error_code |= error_code_mask & MC_OVER_TEMP_ERROR;
//  }
#endif
  /* Enter error state handler */
  if (error_code != MC_NO_ERROR)
  {
    esc_state = ESC_STATE_ERROR;
  }

}
  • 🌿AT32官方驱动板提供的母线电压采集电路:
    在这里插入图片描述
  • 🌿AT32官方MOS管温度采集电路:
    在这里插入图片描述

🛠调参步骤

在这里插入图片描述

开环控制模式下调参:(✨推荐配合可调电源,能直观的看到电机在运转时,电流大小。)

调参原则:先小,然后逐渐递增。

  • 🌿在电机能转动情况下,从初始速度开始调。
  • 🌿电机能平稳启动后,调节最终的速度 ,最快速度时,电机运转不卡顿为止。
  • 🌿调节循环周期,电机转动流畅,电流最小。
  • 📐将最终整定后的参数,修改到工程中:
    在这里插入图片描述
  • 👉需要注意,部分参数不是直接照抄,有偏置补偿的。(修改后,重新烧录程序,再连接上位机软件,可以查看到修改后的参数以及运行效果)
    在这里插入图片描述
  • 🌿其他运行模式,进行调参方式,类似操作即可。
📒其他相关控制电路
  • 官方提供的外部定位器调试电路:
    在这里插入图片描述
    在这里插入图片描述
AT32官方提供的例程并不适合新手移植,不管是从AT32提供的开源驱动硬件还是软件实现代码,都是比较复杂的。成本比较高。
  • 🌿驱动硬件,从驱动板原理图可以看出,设计的物料比较多和控制方法相对比较复杂。虽然可以针对不同mcu和驱动电机进行优化,但是按照现成的软件驱动实现的方案,成本还是高。
  • 🌿软件实现,不方便移植。如果想将这套代码移植到其他品牌单片机上,几乎是行不通的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1996139.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Summer School science communication project--Laptop Selection Suggestion

目录 Introduction Audiance Usage CPU What is a central processing unit (CPU) Notable makers of CPUs GPU Graphics Card: GPU The classifications of graphics cards The brands of graphics cards Dedicated Graphics Cards GeForce MX Series: GeForc…

渠道刷量怎么办?Xinstall来帮你一键识破!

在App推广的道路上&#xff0c;数据是我们最得力的助手&#xff0c;也是我们最头疼的难题。每日下载量、安装量、注册量……这些看似简单的数字&#xff0c;背后却隐藏着无数的故事。哪个渠道在默默发力&#xff1f;哪个渠道又在浑水摸鱼&#xff1f;这一切&#xff0c;都需要我…

【生信入门linux篇】如何安装一个linux虚拟机用于学习

一.虚拟机 虚拟机&#xff08;Virtual Machine&#xff0c;简称VM&#xff09;是一种软件实现的计算机系统&#xff0c;它能够在物理计算机上模拟出多个独立的计算机环境。每个虚拟机都可以运行自己的操作系统和应用程序&#xff0c;就像在独立的物理计算机上一样。虚拟机技术…

(十)Dockerfile详解及使用教程

一、Dockerfile是什么 1、简介 Dockerfile是用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本 官网地址&#xff1a;https://docs.docker.com/engine/reference/builder/ 构建步骤 编写Dockerfile文件docker build命令构建镜像docke…

基于Java+SpringBoot+Vue前后端分离药店/药品/药品采购/药品销售管理系统设计与实现(有视频讲解)

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

数据结构总体概述

参考&#xff1a; 【王道考研】王道数据结构与算法详细笔记&#xff08;全&#xff09;_王道数据结构笔记-CSDN博客 数据结构的三要素 一、数据的逻辑结构 逻辑结构是指数据元素之间的逻辑关系&#xff0c;即从逻辑关系上描述数据。 逻辑结构包括&#xff1a; 集合结构&#xf…

【数据结构】—— 内部排序算法详解

1、前言2、常见排序算法3、排序算法实现3.1 直接插入排序3.2 希尔排序3.3 选择排序3.4 堆排序3.5 冒泡排序3.6 快速排序3.6.1 单趟排序hoare法挖坑法双指针法 3.6.2 非递归实现3.6.3 常见问题基准值的选取小区间优化 3.7 归并排序3.7.1 递归实现3.7.2 非递归实现 3.8 计数排序 …

SAM2分割模型微调指南

SAM2&#xff08;Segment Anything 2&#xff09;是 Meta 推出的一款新模型&#xff0c;旨在对图像中的任何内容进行分割&#xff0c;而不局限于特定的类别或领域。该模型的独特之处在于其训练数据规模&#xff1a;1100 万张图像和 110 亿个掩码。这种广泛的训练使 SAM2 成为训…

AI大语言模型对消防工程知多少?

在过去2年的时间里&#xff0c;大语言模型受到前所未有的关注。ChatGPT的出现更是让人工智能对话风靡一时。我们不再把搜索引擎当作求解问题的唯一途径&#xff0c;AI聊天成为了当前最受欢迎的问题求助工具。 让ChatGPT用通俗的语言解释什么是ChatGPT 什么是大语言模型&#x…

SD微调 dreambooth Lora controlNet 持续更新中

微调&#xff1a;步骤 1 选择预训练模型 如ResNet VGG 2 准备新的数据集 3 构建模型 4 冻结部分模型 5 定义损失函数和优化器 6 微调模型 7 评估模型 8 微调的策略 https://www.zhangzhenhu.com/aigc/dreamBooth.html dreambooth (fix the object, then generate the same obje…

Android Media Framework(十五)ACodec - Ⅲ

这一篇我们一起来了解ACodec的Buffer分配流程。 1、initiateStart 首先对上一篇内容做一点补充&#xff0c;configureCodec执行完成后组件的状态没有变化&#xff0c;仍处在OMX_StateLoaded。因此&#xff0c;当我们调用initiateStart时&#xff0c;发出的消息将由ACodec::Loa…

SVN使用教程 - 快速上手

参考视频&#xff1a; SVN使用教程 - 快速上手 一、SVN简介 1、SVN的功能 &#xff08;1&#xff09;SVN是一种代码版本管理工具&#xff0c;它能记住程序员每次修改的内容&#xff0c;可以查看所有的历史修改记录&#xff0c;可以将代码恢复到任何历史版本&#xff0c;可以恢…

【Mysql】第十一章 事务-重点(原子性+持久性+隔离性+一致性)

文章目录 一、概念1.查看事务支持版本-show engines2.事务提交方式-show variables like autocommit3.事务常见操作方式1.将mysql的默认隔离级别设置成读未提交&#xff0c;方便看到实验现象2.需要重启终端&#xff0c;进行查看隔离级别3.创建一个银行用户表4.演示 - 证明事务的…

【Transformer】关于RNN以及transformer的相关介绍

文章目录 RNNTransformer是干什么的&#xff1f;什么是 Word Embedding &#xff1f;什么是 Word2vec &#xff1f;CBOW(Continuous Bag-of-Words Model)Skip-gram(Continuous Skip-gram Model)Word2vec 的优缺点 Transformer整体架构注意力机制self-attention&#xff08;自注…

生成式人工智能助力6G核心技术

崔曙光 加拿大皇家科学院 加拿大工程院双院院士 主要工作&#xff1a;适配改造人工智能算法&#xff0c;来满足通信网络性能 从基础LLM到专用LLM&#xff1a;四个必须面对的问题 如何选择合适的基础LLM规模如何让基础LLM读懂专用领域信息如何避免基础LLM的幻觉现象&#xf…

第9天 xxl-job

使用xxl-job需要建表 引入依赖 添加配置 Bean public XxlJobSpringExecutor xxlJobExecutor() {logger.info(">>>>>>>>>>> xxl-job config init.");XxlJobSpringExecutor xxlJobSpringExecutor new XxlJobSpringExecutor();xxlJo…

sql注入——sqlilabs16-26

文章目录 less-163.注入 less-172.数据库名2.1 floor报错注入数据库名 3.查到数据表3.1floor 报错注入数据表 4.查取列名4.1 floor报错注入 列名 5.查取内容 less-181.添加X-Forwarded-For测试2修改User-Agent测试3.查数据表名4.查数据列5.查取数据 less-192.查数据库3.查数据表…

医疗大健康解决方案HIS方案

本篇接上篇文章医疗大健康解决方案HIS方案-CSDN博客&#xff0c;介绍第二部分区域医疗解决方案。 依托腾讯云优势&#xff0c;联合合作伙伴&#xff0c;连接政府、医疗服务机构、医药研发与流通、康养等&#xff0c;构建医疗大健康产业云生态&#xff0c;助力数字化升级。 方…

小怡分享之数据结构基础知识准备

前言&#xff1a; &#x1f308;✨之前小怡给大家分享了JavaSE的知识&#xff0c;今天小怡要给大家分享一下数据结构基础知识。 一、初识集合框架 1.什么是集合框架 Java集合框架Java Collection Framework&#xff0c; 又称为容器container&#xff0c;是定义在Java.util 包…

Linux服务器基于NFS实现共享目录

NFS简介&#xff1a;NFS&#xff08;Network File System&#xff09;是一种分布式文件系统协议&#xff0c;允许用户通过网络访问远程计算机上的文件和目录&#xff0c;就像访问本地文件一样。NFS 最初由 Sun Microsystems 在 1984 年开发&#xff0c;现在已经成为类 Unix 系统…