STM32无刷电调ESC32原理图与源代码揭秘

4星 · 超过85%的资源 | 下载需积分: 44 | RAR格式 | 2.47MB | 更新于2025-05-30 | 50 浏览量 | 670 下载量 举报
29 收藏
标题“ESC32原理图和源代码”中的知识点主要涉及两个方面:一是ESC32(电子速度控制器)的原理图,二是与之配套的源代码。ESC32是一种应用于无刷电机的电子控制器,常见于遥控模型车、飞机和多旋翼无人机等场合。使用STM32微控制器作为核心处理单元,ESC32具备较好的性能和控制精度。 首先,原理图是电子工程师设计电路时必须的工作文档,它以图形的方式详细展示电子电路的构成和工作原理。对于ESC32而言,原理图将揭示以下几个关键部分的电路设计: 1. 控制核心:在本例中,STM32微控制器作为控制单元,其型号和电路设计会直接影响ESC32的性能表现。原理图上会详细标明微控制器的引脚分配、外部晶振、电源管理以及与其它电路模块的连接方式。 2. 电机驱动部分:这一部分通常由MOSFET(金属氧化物半导体场效应晶体管)或IGBT(绝缘栅双极晶体管)构成H桥电路,用于驱动无刷电机。原理图上会展示驱动电路的布局,包括功率管的选择、驱动信号的控制线路以及保护电路设计。 3. 信号处理电路:ESC32需要接收来自遥控器的信号,通常通过PWM(脉冲宽度调制)信号来控制。原理图需要展示接收信号的电路设计,如接收器接口、信号解码电路等。 4. 电源部分:包括ESC32所需电源电压的转换电路,如从锂聚合物电池直接供电到3.3V或5V的电源转换模块,确保微控制器等敏感元件得到稳定的电源供应。 5. 通信接口:包括调试接口(如SWD接口)和可能的通信接口(如UART、I2C、SPI等),用于微控制器与外部设备如编程器、传感器的通信。 其次,“源代码”则是指为STM32微控制器编写的程序代码,用于控制和管理ESC32的工作状态。源代码是实现电子控制器功能的核心,其知识点包含: 1. 控制算法:源代码中会实现针对无刷电机控制的算法,如六步换相算法(也称为电子换向算法),以及为优化电机运行性能而设计的PID控制算法(比例-积分-微分控制算法)。 2. PWM控制:编写用于调节电机转速的PWM信号输出代码,这部分代码将根据输入信号来调整PWM的占空比,从而控制电机转速。 3. 信号处理:实现接收遥控信号并将其转换为微控制器可识别的数据格式。这通常包括对输入PWM信号的捕捉和解码过程。 4. 安全保护功能:编写用于检测和响应过流、过压、欠压和过热等异常状况的程序代码,确保电调在异常情况下能够进行自我保护。 5. 用户接口:如果有,设计用户可操作的接口,如通过按钮调整电机参数,或通过蓝牙、WiFi模块实现远程控制。 6. 通信协议:编写与外部设备通信的代码,如通过无线通信模块接收控制命令,或通过串口读写传感器数据。 【压缩包子文件的文件名称列表】中提到的“ESC32”表明在提供的压缩文件中,包含了与ESC32相关的所有设计文件和代码资源,文件可能包括原理图PDF、源代码文件(.c, .h),以及可能的项目文件和文档说明。 需要注意的是,实际操作中需要对原理图进行仔细的解读,并结合源代码深入理解其工作原理和编程逻辑。同时,在进行开发和调试过程中,还需要考虑电路的实际布局、布线、元件选择等因素,以确保最终产品的稳定性和可靠性。对于学习和使用ESC32的开发者而言,深入理解这些知识点对于成功设计和实施控制系统至关重要。

相关推荐

filetype
/* This file is part of AutoQuad ESC32. AutoQuad ESC32 is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. AutoQuad ESC32 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with AutoQuad ESC32. If not, see . Copyright © 2011, 2012 Bill Nesbitt */ /* * pwm.c文件.此文件有2个功能,2个功能分别使用,不能同时使用 * 1、pwm in输入模式,pwm输入中断里,调用runNewInput函数 * 2、one wire通讯协议,pwm输入中断里,调用owEdgeDetect函数,来输入新的数据,调用owReset函数来复位1wire通讯 * */ #include "pwm.h" #include "timer.h" #include "run.h" #include "main.h" #include "ow.h" #include "stm32f10x_gpio.h" #include "stm32f10x_tim.h" #include "misc.h" static int16_t pwmMinPeriod; //timer1 ch1 pwm 输入最小周期 static int16_t pwmMaxPeriod; //timer1 ch1 pwm 输入最大周期 int16_t pwmMinValue; //timer1 ch2 pwm 输入最小周期 static int16_t pwmMaxValue; //timer1 ch2 pwm 输入最大周期 int16_t pwmLoValue; int16_t pwmHiValue; int16_t pwmMinStart; volatile uint32_t pwmValidMicros; //关闭输入捕获比较中断 1和2 void pwmIsrAllOff(void) { PWM_TIM->DIER &= (uint16_t)~(TIM_IT_CC1 | TIM_IT_CC2);//关闭中断 } //开启输入捕获比较中断 1和2 void pwmIsrAllOn(void) { PWM_TIM->CCR1; PWM_TIM->CCR2; PWM_TIM->DIER |= (TIM_IT_CC1 | TIM_IT_CC2);//允许捕获比较 1 2中断 } //开启捕获比较2中断 void pwmIsrRunOn(void) { uint16_t dier = PWM_TIM->DIER; dier &= (uint16_t)~(TIM_IT_CC1 | TIM_IT_CC2); dier |= TIM_IT_CC2;//允许捕获/比较2中断 PWM_TIM->CCR1; PWM_TIM->CCR2; PWM_TIM->DIER = dier; } //timer 1 void pwmInit(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; TIM_ICInitTypeDef TIM_ICInitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; pwmSetConstants(); // TIM1 channel 1 pin (PA.08) configuration GPIO_InitStructure.GPIO_Pin = PWM_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(PWM_PORT, &GPIO;_InitStructure); // Enable the TIM1 global Interrupt NVIC_InitStructure.NVIC_IRQChannel = PWM_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC;_InitStructure); TIM_TimeBaseStructInit(&TIM;_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = (PWM_CLK_DIVISOR-1); TIM_TimeBaseStructure.TIM_Period = 0xffff; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(PWM_TIM, &TIM;_TimeBaseStructure); TIM_ICInitStructure.TIM_Channel = PWM_CHANNEL; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0x0; TIM_PWMIConfig(PWM_TIM, &TIM;_ICInitStructure); // Select the TIM Input Trigger: TI1FP1 // 滤波后的定时器输入1(TI1FP1) TIM_SelectInputTrigger(PWM_TIM, TIM_TS_TI1FP1); // Select the slave Mode: Reset Mode TIM_SelectSlaveMode(PWM_TIM, TIM_SlaveMode_Reset);//复位模式 // Enable the Master/Slave Mode TIM_SelectMasterSlaveMode(PWM_TIM, TIM_MasterSlaveMode_Enable); // TIM enable counter TIM_Cmd(PWM_TIM, ENABLE); pwmIsrAllOn(); } //timer1 TIM1_CC_IRQHandler中断 void PWM_IRQ_HANDLER(void) { uint16_t pwmValue; uint16_t periodValue; uint8_t edge; edge = !(PWM_TIM->SR & TIM_IT_CC2); periodValue = PWM_TIM->CCR1; //IO 输入PA8 周期 pwmValue = PWM_TIM->CCR2; //IO 输入(但是没有看到配置了使用哪个IO做为输入了) 脉宽长度 // look for good RC PWM input if (inputMode == ESC_INPUT_PWM && //PWM输入模式 periodValue >= pwmMinPeriod && periodValue = pwmMinValue && pwmValue <= pwmMaxValue //脉宽长度 ) { if (edge == 0) { pwmValidMicros = timerMicros; runNewInput(pwmValue); //PWM正确.输入 } } } void pwmSetConstants(void) { float rpmScale = p[PWM_RPM_SCALE]; pwmMinPeriod = p[PWM_MIN_PERIOD] = (int)p[PWM_MIN_PERIOD];//PWM最小周期 timer1 ch1 pwmMaxPeriod = p[PWM_MAX_PERIOD] = (int)p[PWM_MAX_PERIOD];//PWM最大周期 timer1 ch1 pwmMinValue = p[PWM_MIN_VALUE] = (int)p[PWM_MIN_VALUE]; //PWM最小周期 timer1 ch2 pwmMaxValue = p[PWM_MAX_VALUE] = (int)p[PWM_MAX_VALUE]; //PWM最大周期 timer1 ch2 pwmLoValue = p[PWM_LO_VALUE] = (int)p[PWM_LO_VALUE]; pwmHiValue = p[PWM_HI_VALUE] = (int)p[PWM_HI_VALUE]; pwmMinStart = p[PWM_MIN_START] = (int)p[PWM_MIN_START]; if (rpmScale PWM_RPM_SCALE_MAX) rpmScale = PWM_RPM_SCALE_MAX; p[PWM_RPM_SCALE] = rpmScale; } ESC32开源电调 源码与原理图,此源码采用RTT操作系统,CAN PWM操作方式 ,本人已用PWM方式成功驱动起来,CAN 暂且还没做测试。 此资料是 啊嘉 开源出来的,好资料不敢独享,稍加整理放到这与大家共享。
jiangwujing
  • 粉丝: 14
上传资源 快速赚钱