stm32驱动三相无刷电机

时间: 2023-06-11 15:09:17 浏览: 170
驱动三相无刷电机可以采用电子调速的方式,常见的方法是使用PWM信号控制MOS管的导通,从而控制电机的转速和方向。下面是一个基本的步骤: 1. 确定电机的参数,如电压、电流、功率、转速等。 2. 选择合适的MOS管进行驱动,MOS管的参数要满足电机的需求,如承受电流、导通电阻等。 3. 编写控制程序,使用STM32的定时器模块产生PWM信号,控制MOS管的导通时间和间隔时间,从而控制电机的转速和方向。 4. 进行电机的实际测试,调整PWM信号的占空比和频率,使电机转速和方向符合要求,并且保证电机和MOS管的工作温度不超过规定范围。 需要注意的是,三相无刷电机的驱动较为复杂,需要对电机和MOS管的参数进行综合考虑,以及对控制程序进行精细调整,才能实现稳定可靠的电机驱动。
相关问题

写一段stm32控制三相无刷电机的驱动代码

以下是一个基本的STM32控制三相无刷电机的驱动代码示例。 ``` #include "stm32f4xx.h" // 定义PWM输出引脚 #define PWM_PIN_A GPIO_Pin_0 #define PWM_PIN_B GPIO_Pin_1 #define PWM_PIN_C GPIO_Pin_2 // 定义相电流采样引脚 #define CURRENT_PIN_A GPIO_Pin_3 #define CURRENT_PIN_B GPIO_Pin_4 #define CURRENT_PIN_C GPIO_Pin_5 // 定义PWM频率和占空比 #define PWM_FREQUENCY 20000 #define PWM_DUTY_CYCLE 50 // 定义电机转速和电压常数 #define MOTOR_SPEED_CONSTANT 10 #define MOTOR_VOLTAGE_CONSTANT 5 // 定义PID参数 #define KP 1.0 #define KI 0.0 #define KD 0.0 // 定义电机状态 typedef enum { MOTOR_STOPPED, MOTOR_STARTING, MOTOR_RUNNING } MotorState; // 初始化PWM输出引脚 void init_pwm_pins(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_Pin = PWM_PIN_A | PWM_PIN_B | PWM_PIN_C; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_TIM1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_TIM1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_TIM1); } // 初始化相电流采样引脚 void init_current_pins(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStruct.GPIO_Pin = CURRENT_PIN_A | CURRENT_PIN_B | CURRENT_PIN_C; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStruct); } // 初始化PWM定时器 void init_pwm_timer(void) { TIM_TimeBaseInitTypeDef TIM_InitStruct; TIM_OCInitTypeDef TIM_OC_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); TIM_InitStruct.TIM_Prescaler = ((SystemCoreClock / 2) / PWM_FREQUENCY) - 1; TIM_InitStruct.TIM_Period = (100 / PWM_DUTY_CYCLE) - 1; TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_InitStruct); TIM_OC_InitStruct.TIM_OCMode = TIM_OCMode_PWM1; TIM_OC_InitStruct.TIM_OutputState = TIM_OutputState_Enable; TIM_OC_InitStruct.TIM_Pulse = 0; TIM_OC_InitStruct.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM1, &TIM_OC_InitStruct); TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_OC_InitStruct.TIM_OCMode = TIM_OCMode_PWM1; TIM_OC_InitStruct.TIM_OutputState = TIM_OutputState_Enable; TIM_OC_InitStruct.TIM_Pulse = 0; TIM_OC_InitStruct.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM1, &TIM_OC_InitStruct); TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_OC_InitStruct.TIM_OCMode = TIM_OCMode_PWM1; TIM_OC_InitStruct.TIM_OutputState = TIM_OutputState_Enable; TIM_OC_InitStruct.TIM_Pulse = 0; TIM_OC_InitStruct.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC3Init(TIM1, &TIM_OC_InitStruct); TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_Cmd(TIM1, ENABLE); } // 初始化ADC采样器 void init_adc(void) { ADC_InitTypeDef ADC_InitStruct; ADC_CommonInitTypeDef ADC_CommonInitStruct; GPIO_InitTypeDef GPIO_InitStruct; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStruct.GPIO_Pin = CURRENT_PIN_A | CURRENT_PIN_B | CURRENT_PIN_C; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStruct); ADC_CommonInitStruct.ADC_Mode = ADC_Mode_Independent; ADC_CommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div4; ADC_CommonInitStruct.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; ADC_CommonInitStruct.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStruct); ADC_StructInit(&ADC_InitStruct); ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b; ADC_InitStruct.ADC_ScanConvMode = DISABLE; ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStruct.ADC_NbrOfConversion = 1; ADC_Init(ADC1, &ADC_InitStruct); ADC_Cmd(ADC1, ENABLE); } // 读取相电流值 uint16_t read_current(uint16_t pin) { ADC_RegularChannelConfig(ADC1, pin, 1, ADC_SampleTime_56Cycles); ADC_SoftwareStartConv(ADC1); while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); return ADC_GetConversionValue(ADC1); } // 计算电机转速 float calculate_speed(uint16_t current_a, uint16_t current_b, uint16_t current_c) { float total_current = (float)(current_a + current_b + current_c) / 3.0; return total_current * MOTOR_SPEED_CONSTANT; } // 计算电机电压 float calculate_voltage(float speed) { return speed * MOTOR_VOLTAGE_CONSTANT; } // 控制电机转速 void control_motor(float setpoint_speed) { static MotorState state = MOTOR_STOPPED; static float current_speed = 0.0; static float last_error = 0.0; static float integral = 0.0; uint16_t current_a = read_current(CURRENT_PIN_A); uint16_t current_b = read_current(CURRENT_PIN_B); uint16_t current_c = read_current(CURRENT_PIN_C); float actual_speed = calculate_speed(current_a, current_b, current_c); float error = setpoint_speed - actual_speed; integral += error; float derivative = error - last_error; last_error = error; float output = KP * error + KI * integral + KD * derivative; if (state == MOTOR_STOPPED) { if (setpoint_speed > 0.0) { state = MOTOR_STARTING; GPIO_ResetBits(GPIOA, PWM_PIN_A | PWM_PIN_B | PWM_PIN_C); TIM_SetCompare1(TIM1, PWM_DUTY_CYCLE); TIM_SetCompare2(TIM1, PWM_DUTY_CYCLE); TIM_SetCompare3(TIM1, PWM_DUTY_CYCLE); TIM_Cmd(TIM1, ENABLE); } } else if (state == MOTOR_STARTING) { if (actual_speed > 0.1) { state = MOTOR_RUNNING; } } else if (state == MOTOR_RUNNING) { if (setpoint_speed == 0.0) { state = MOTOR_STOPPED; GPIO_ResetBits(GPIOA, PWM_PIN_A | PWM_PIN_B | PWM_PIN_C); TIM_Cmd(TIM1, DISABLE); } else { float voltage = calculate_voltage(output); TIM_SetCompare1(TIM1, PWM_DUTY_CYCLE * voltage / 100.0); TIM_SetCompare2(TIM1, PWM_DUTY_CYCLE * voltage / 100.0); TIM_SetCompare3(TIM1, PWM_DUTY_CYCLE * voltage / 100.0); } } } int main(void) { init_pwm_pins(); init_current_pins(); init_pwm_timer(); init_adc(); while(1) { control_motor(100.0); } } ``` 该代码使用STM32的PWM输出引脚和ADC采样器控制三相无刷电机。代码中实现了PID控制,以控制电机的转速。控制电机的转速需要读取三相电流的值,并计算电机的转速和电压值。代码中还实现了电机的启动和停止功能。

stm32f103三相无刷电机按键调速最终

STM32F103是一款常用的微控制器,可以用来控制三相无刷电机的按键调速。按键调速是指通过按键来调节电机的转速。 首先,需要连接STM32F103和无刷电机的驱动模块。驱动模块通常由三个半桥驱动电路组成,用于控制电机的三个相位。我们需要根据无刷电机的类型和参数来选择合适的驱动模块。 接下来,我们需要编写控制程序。首先,使用STM32CubeMX进行初始化配置,包括GPIO引脚配置、定时器配置和中断配置等。然后,使用C语言编写控制逻辑。 在控制逻辑中,我们可以使用定时器来生成PWM信号,用于控制无刷电机的相位驱动。通过按键触发中断,可以改变PWM信号的占空比,从而调整电机的转速。 具体步骤如下: 1. 初始化GPIO引脚,将按键引脚配置为输入模式。 2. 初始化定时器,设置PWM的周期和分辨率。 3. 配置中断,使按键触发中断。 4. 在中断处理函数中,检测按键状态。如果按键按下,改变PWM的占空比;如果按键释放,恢复PWM的占空比为初始值。 5. 在主循环中,保持程序的运行,处理其他任务。 这样,我们就可以通过按键来实现对无刷电机的调速。当按键被按下时,电机的转速会增加;当按键被释放时,电机的转速会减慢。 在实际应用中,我们可以根据需要添加其他功能,例如加速度控制、保护机制等。 总之,通过STM32F103的按键调速程序,我们可以方便地控制三相无刷电机的转速,实现定速、调速等功能。
阅读全文

相关推荐

大家在看

recommend-type

chessClock:一个简单的Arduino Chess Clock,带有3个按钮和LCD 240X320屏幕

弗洛伊斯国际象棋时钟 一个带有3个按钮和240X320 LCD屏幕的简单Arduino国际象棋时钟 这是隔离期间开发的一个简单的棋钟项目。主要灵感来自@naldin的 。我更改了他的代码,所以我只能使用三个按钮(暂停,黑白)来选择国际象棋比赛中最常用的时间设置,并在LCD屏幕上显示小时数。该项目目前处于停滞状态,因为我使用的Arduino Nano已损坏,我找不到新的。尽管项目运行正常,但您只需要正确地将LCD屏幕连接到相应的SPI引脚,并将按钮连接到所需的任何数字引脚即可。另外,我仍然需要在时钟上打印3D框或找到一个3D框使其播放。很快,我将更新此页面。
recommend-type

学堂云《信息检索与科技写作》单元测试考核答案

学堂云《信息检索与科技写作》单元测试考核答案 【对应博文见链接:】https://blog.csdn.net/m0_61712829/article/details/135173767?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22135173767%22%2C%22source%22%3A%22m0_61712829%22%7D
recommend-type

【蒙特卡洛模拟】这个项目旨在通过强化学习和蒙特卡洛模拟的结合,解决银行购买股票的最优策略和预期利润折现率的问题KL.zip

【蒙特卡洛模拟】这个项目旨在通过强化学习和蒙特卡洛模拟的结合,解决银行购买股票的最优策略和预期利润折现率的问题【KL】.zip
recommend-type

码垛机器人说明书

对于随机货盘来说,码垛机器人是唯一的选择。尽管如此,机器人装载也面临比较多的问题,如果要以较高的速度进行生产,将更加困难重重。一个处理随机装载的机器人码垛机需要特殊的软件,通过软件,机器人码垛机与生产线的其他部分相连接,这是个巨大的进步。
recommend-type

《智能调度集中系统暂行技术条件》.pdf

智能调度

最新推荐

recommend-type

STM32驱动无刷电机的相关定时器配置

STM32驱动无刷电机的过程中,定时器配置是至关重要的环节。无刷电机通常采用三相六步控制,通过精确的时序切换控制电机的旋转。在这个过程中,STM32的定时器扮演着时间基准和脉宽调制(PWM)信号生成的角色。 首先...
recommend-type

STM32F103做主控自制无刷电机(BLDC)控制器 有感/无感.docx

标题中的“STM32F103做主控自制无刷电机(BLDC)控制器有感/无感”指的是使用STM32F103微控制器设计并制作一个无刷直流电机(BLDC)控制器,该控制器支持有霍尔传感器(有感)和无霍尔传感器(无感)两种工作模式。...
recommend-type

基于硬件FOC TMC4671的无刷直流电机驱动器设计

无刷直流电机(BLDC)驱动器在许多领域中广泛应用,但由于传统驱动器存在尺寸大、控制精度不足和稳定性差的问题,对驱动器的设计提出了新的挑战。本文针对这些问题,提出了一种基于硬件矢量控制(FOC)的无刷直流...
recommend-type

FOC电机控制详细理论解析.pdf

FOC是一种先进的无刷电机控制方法,它通过精确控制电机的磁场和转矩,实现了高效、高精度的电机运行。 首先,文档介绍了直流无刷电机(BLDC)和永磁同步电机(PMSM)的基本概念。两者都具有同步转矩和永磁体转子,...
recommend-type

免安装JDK 1.8.0_241:即刻配置环境运行

资源摘要信息:"JDK 1.8.0_241 是Java开发工具包(Java Development Kit)的版本号,代表了Java软件开发环境的一个特定发布。它由甲骨文公司(Oracle Corporation)维护,是Java SE(Java Platform, Standard Edition)的一部分,主要用于开发和部署桌面、服务器以及嵌入式环境中的Java应用程序。本版本是JDK 1.8的更新版本,其中的241代表在该版本系列中的具体更新编号。此版本附带了Java源码,方便开发者查看和学习Java内部实现机制。由于是免安装版本,因此不需要复杂的安装过程,解压缩即可使用。用户配置好环境变量之后,即可以开始运行和开发Java程序。" 知识点详细说明: 1. JDK(Java Development Kit):JDK是进行Java编程和开发时所必需的一组工具集合。它包含了Java运行时环境(JRE)、编译器(javac)、调试器以及其他工具,如Java文档生成器(javadoc)和打包工具(jar)。JDK允许开发者创建Java应用程序、小程序以及可以部署在任何平台上的Java组件。 2. Java SE(Java Platform, Standard Edition):Java SE是Java平台的标准版本,它定义了Java编程语言的核心功能和库。Java SE是构建Java EE(企业版)和Java ME(微型版)的基础。Java SE提供了多种Java类库和API,包括集合框架、Java虚拟机(JVM)、网络编程、多线程、IO、数据库连接(JDBC)等。 3. 免安装版:通常情况下,JDK需要进行安装才能使用。但免安装版JDK仅需要解压缩到磁盘上的某个目录,不需要进行安装程序中的任何步骤。用户只需要配置好环境变量(主要是PATH、JAVA_HOME等),就可以直接使用命令行工具来运行Java程序或编译代码。 4. 源码:在软件开发领域,源码指的是程序的原始代码,它是由程序员编写的可读文本,通常是高级编程语言如Java、C++等的代码。本压缩包附带的源码允许开发者阅读和研究Java类库是如何实现的,有助于深入理解Java语言的内部工作原理。源码对于学习、调试和扩展Java平台是非常有价值的资源。 5. 环境变量配置:环境变量是操作系统中用于控制程序执行环境的参数。在JDK中,常见的环境变量包括JAVA_HOME和PATH。JAVA_HOME是JDK安装目录的路径,配置此变量可以让操作系统识别到JDK的位置。PATH变量则用于指定系统命令查找的路径,将JDK的bin目录添加到PATH后,就可以在命令行中的任何目录下执行JDK中的命令,如javac和java。 在实际开发中,了解并正确配置JDK对于Java开发者来说是一个基础且重要的环节。掌握如何安装和配置JDK,以及如何理解JDK中的源码和各种工具,对于进行Java编程和解决问题至关重要。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

【提升效率与稳定性】:深入掌握单相整流器的控制策略

# 摘要 单相整流器作为电力电子技术的基础设备,广泛应用于电力系统和工业自动化领域。本文首先概述了单相整流器的基本概念,详细分析了其工作原理,包括电力电子器件的角色、数学模型以及控制策略。随后,针对控制技术进行了深入探讨,包括传统控制技术如PID控制和高级控制策略如模糊逻辑控制及自适应控制的应用。进一步地,本文提出了一系列提升单相整流器性能的方法,如效率提升策略、系统稳定性措施,以及性能评估与优化方案。最后,文章探讨了单相整流器在不同领域的应用案例,并对新兴技术与市场趋势进行了展望。 # 关键字 单相整流器;电力电子器件;数学模型;控制策略;性能提升;应用案例 参考资源链接:[单相PWM整
recommend-type

你看这是ashx映射的cs文件初始代码,你看这里边根本就没有写对action参数进行任何操作但你.ashx?action=submit这样去做他就能返回出数据这是为什么

在ASP.NET中,.ashx文件(也称为HTTP处理程序)用于处理HTTP请求并返回响应。即使在初始代码中没有对action参数进行任何操作,系统仍然可以通过默认的ProcessRequest方法处理请求并返回数据。 当你在URL中传递参数(如?action=submit)时,这些参数会被包含在请求的查询字符串中。虽然你的代码没有显式地处理这些参数,但默认的ProcessRequest方法会接收这些参数并执行一些默认操作。 以下是一个简单的.ashx文件示例: ```csharp <%@ WebHandler Language="C#" Class="MyHandler" %> us
recommend-type

机器学习预测葡萄酒评分:二值化品尝笔记的应用

资源摘要信息:"wine_reviewer:使用机器学习基于二值化的品尝笔记来预测葡萄酒评论分数" 在当今这个信息爆炸的时代,机器学习技术已经被广泛地应用于各个领域,其中包括食品和饮料行业的质量评估。在本案例中,将探讨一个名为wine_reviewer的项目,该项目的目标是利用机器学习模型,基于二值化的品尝笔记数据来预测葡萄酒评论的分数。这个项目不仅对于葡萄酒爱好者具有极大的吸引力,同时也为数据分析和机器学习的研究人员提供了实践案例。 首先,要理解的关键词是“机器学习”。机器学习是人工智能的一个分支,它让计算机系统能够通过经验自动地改进性能,而无需人类进行明确的编程。在葡萄酒评分预测的场景中,机器学习算法将从大量的葡萄酒品尝笔记数据中学习,发现笔记与葡萄酒最终评分之间的相关性,并利用这种相关性对新的品尝笔记进行评分预测。 接下来是“二值化”处理。在机器学习中,数据预处理是一个重要的步骤,它直接影响模型的性能。二值化是指将数值型数据转换为二进制形式(0和1)的过程,这通常用于简化模型的计算复杂度,或者是数据分类问题中的一种技术。在葡萄酒品尝笔记的上下文中,二值化可能涉及将每种口感、香气和外观等属性的存在与否标记为1(存在)或0(不存在)。这种方法有利于将文本数据转换为机器学习模型可以处理的格式。 葡萄酒评论分数是葡萄酒评估的量化指标,通常由品酒师根据酒的品质、口感、香气、外观等进行评分。在这个项目中,葡萄酒的品尝笔记将被用作特征,而品酒师给出的分数则是目标变量,模型的任务是找出两者之间的关系,并对新的品尝笔记进行分数预测。 在机器学习中,通常会使用多种算法来构建预测模型,如线性回归、决策树、随机森林、梯度提升机等。在wine_reviewer项目中,可能会尝试多种算法,并通过交叉验证等技术来评估模型的性能,最终选择最适合这个任务的模型。 对于这个项目来说,数据集的质量和特征工程将直接影响模型的准确性和可靠性。在准备数据时,可能需要进行数据清洗、缺失值处理、文本规范化、特征选择等步骤。数据集中的标签(目标变量)即为葡萄酒的评分,而特征则来自于品酒师的品尝笔记。 项目还提到了“kaggle”和“R”,这两个都是数据分析和机器学习领域中常见的元素。Kaggle是一个全球性的数据科学竞赛平台,提供各种机器学习挑战和数据集,吸引了来自全球的数据科学家和机器学习专家。通过参与Kaggle竞赛,可以提升个人技能,并有机会接触到最新的机器学习技术和数据处理方法。R是一种用于统计计算和图形的编程语言和软件环境,它在统计分析、数据挖掘、机器学习等领域有广泛的应用。使用R语言可以帮助研究人员进行数据处理、统计分析和模型建立。 至于“压缩包子文件的文件名称列表”,这里可能存在误解或打字错误。通常,这类名称应该表示存储项目相关文件的压缩包,例如“wine_reviewer-master.zip”。这个压缩包可能包含了项目的源代码、数据集、文档和其它相关资源。在开始项目前,研究人员需要解压这个文件包,并且仔细阅读项目文档,以便了解项目的具体要求和数据格式。 总之,wine_reviewer项目是一个结合了机器学习、数据处理和葡萄酒品鉴的有趣尝试,它不仅展示了机器学习在实际生活中的应用潜力,也为研究者提供了丰富的学习资源和实践机会。通过这种跨领域的合作,可以为葡萄酒行业带来更客观、一致的评价标准,并帮助消费者做出更加明智的选择。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依