利用FOC控制实现单摆平衡

STM32读取AS5600磁编码器(M创动工坊) 使用STM32,借用SimpleFOC库,读取AS5600磁编码器,基于PlatformIO,由M创动工坊提供。 阅读详情

硬件:

  1. 电机:2804直流无刷电机
  2. 编码器:AS5600
  3. 驱动器:simplefoc mini板
  4. MCU:esp32 lolin d32
  5. 陀螺仪:mpu6050

以上硬件可以在M创动工坊买到。

因为要PID调整,所以用手机安装蓝牙串口调试程序,更方便在线调整参数。

直接上代码:

#include "Arduino.h"

#include <MPU6050_tockn.h>//磁罗盘库

#include <Wire.h>//I2C库

#include "SimpleFOC.h"//电机库

#include "BluetoothSerial.h"


 

float Balance_Angle_raw=0;//机械平衡角度

const int leftMotorOffset = 1,rightMotorOffset = 1; //左右轮的启动扭矩值,pm到一定电压马达才开的转动.  kp:5.76   ki:0.00   kd:0.94

int g_turn_apd = 60; //转弯的幅度,通过两轮的差值来实现转向

float ENERGY=6; //前进后退倾角,控制进后退速度

float kp=0.01,ki=0.01,kd=0.01; //根据调试设置kp ki kd的默认值

float angle_kp=2;//根据调试设置kp ki kd的默认值

float Keep_Angle,bias,integrate;//保持角度,角度偏差,偏差积分变量

float AngleX, GyroX, GyroZ; //mpu6050输出的角度值为浮点数,两位有效小数

int vertical_PWM, angle_PWM, PWM,L_PWM,R_PWM;//各种PWM计算值

MagneticSensorI2C sensor0 = MagneticSensorI2C(AS5600_I2C);//初始化电机下的磁传感器

BLDCMotor motor_0 = BLDCMotor(7);//定义直流无刷电机,极对数为7

BLDCDriver3PWM driver_0 = BLDCDriver3PWM(25,32,33,12);//定义电机驱动PWM接的引脚和使能引脚12


 

//target variable

float target_angle = 0;//电机角度/速度/扭矩

char flag = 's';//控制左转右转的标签


 

BluetoothSerial SerialBT;//实例化蓝牙

MPU6050 mpu6050(Wire1);//实例化MPU对象


 

void serial_debug()//蓝牙串口调试函数,在线调试PID值

{

    if(SerialBT.available()>0)

    {

        char DATA = SerialBT.read();

        delay(5);

        switch(DATA)

        {

            case 'u':

              Keep_Angle +=0.1;

              break;

            case 'd':

              Keep_Angle -=0.01;

              break;

            case '0':

              kp -=0.01;

              break;

            case '1':

              kp +=0.01;

              break;

            case '2':

              ki -=0.01;

              break;

            case '3':

              ki +=0.01;

              break;

            case '4':

              kd -=0.01;

              break;

            case '5':

              kd +=0.01;

              break;

            case '6':

              angle_kp -=0.2;

              break;

            case '7':

              angle_kp +=0.2;

              break;

            // case 's':

            // // /*控制程序*/

            // //   flag = 's';

            // //   Keep_Angle = Balance_Angle_raw;

            // //   z_turn_spd = 0;

            // //   break; //调节物理平衡点为机械平衡角度值,原地平衡

            // // case 'a': //前进

            // //   flag = 'a';

            // //   Keep_Angle = Balance_Angle_raw + ENERGY;

            // //   z_turn_spd = 0;

            //   break;

        }

        if(kp<0) kp=0;

        if(ki<0) ki=0;

        if(kd<0) kd=0;

        SerialBT.print("Keep_Angle:");

        SerialBT.println(Keep_Angle);

        SerialBT.print("   kp:");

        SerialBT.print(kp);

        SerialBT.print("   ki:");

        SerialBT.print(ki);

        SerialBT.print("   kd:");

        SerialBT.println(kd);

        SerialBT.println("--------------------");

    }

}

void angle_pwm_clculation(){//转向的PWM

}

void verical_pwm_caculation(){

    AngleX = mpu6050.getAngleX();//陀螺仪获得X方向转动角度

    GyroX = mpu6050.getGyroX();//陀螺仪获得X方向角速度

    bias = AngleX - Keep_Angle;//计算角度偏差,bias为小车角度与结构静态平衡角度的差值

    integrate += bias;//偏差的积分,integrate为全局变量,一直积累

    integrate = constrain(integrate,-1000,1000);//限定误差积分的最大最小值

    vertical_PWM = kp*bias + ki*integrate + kd*GyroX;//得到PID调节后的值

    /*=-直立PID计算PWM--通过陀螺仪返回数据计算,前倾陀螺仪Y轴为正,后仰陀螺仪Y轴为负。前倾车前进,后仰车后退,保持直立。但可能为了直立,车会随时移动。*/

}

void setup() {

    Serial.begin(115200);

    SerialBT.begin("ESP32 car"); // Bluetooth device

    /*----陀螺仪初始化-------*/

    Wire1.begin(19,23,(uint32_t)400000);

    mpu6050.begin();

    mpu6050.calcGyroOffsets(true);

    //磁编码器

    Wire.setClock(400000);

    Wire.begin();//定义磁编码器连接引脚;

    sensor0.init();

    motor_0.linkSensor(&sensor0);

/*----电机初始化-----*/

    driver_0.voltage_power_supply = 12;

    driver_0.voltage_limit = 6;

    driver_0.init();

    motor_0.phase_resistance = 2.9; // 2.9 Ohms

    motor_0.torque_controller = TorqueControlType::voltage;

    motor_0.linkDriver(&driver_0);

    motor_0.foc_modulation = FOCModulationType::SpaceVectorPWM;

    motor_0.controller = MotionControlType::torque;//闭环扭矩控制

    motor_0.PID_velocity.P = 0.108;//速度P值,这个值不能填太大,否则容易抖动

    motor_0.PID_velocity.I = 0.01;

  // the lower the less filtered

    motor_0.LPF_velocity.Tf = 0.01f;  

  // angle P controller

    motor_0.P_angle.P = 30;  //位置PID的P值

    motor_0.velocity_limit = 30;

    motor_0.useMonitoring(Serial);

    motor_0.init();

    motor_0.initFOC();


 

/*--------------------------------------------------------*/

    Serial.begin(115200);

    Serial.println("Motor ready!");

    Keep_Angle = Balance_Angle_raw; //平衡度初始化为结构静态平衡时的陀螺仪角度。Keep Angle可以改变

    // motor(0,0);//机器启动时马达确保停止。

    delay(1000);

    Serial.println("BLE:ESP32 Car!");

}

void loop() {

    //串口PID调试

    serial_debug();

    //陀螺仪刷新

    mpu6050.update();

    //PWM计算

    // angle_pwm_clculation();

    verical_pwm_caculation();

    PWM = vertical_PWM;//电机扭矩值等于经PID计算后的值

    motor_0.loopFOC();

    // motor_1.loopFOC();

    if(PWM>0)

        PWM = PWM + leftMotorOffset;//加上电机死区扭矩

    if(PWM<0)

        PWM = PWM - leftMotorOffset;

    if(AngleX>60||AngleX<-60)//倾角过大,车子倒下,停止转动;

        motor_0.move(0);

    PWM = constrain(PWM,-60,60);//此时PWM还是角度值

//    float AngleX0 = mpu6050.getAngleX();

//    Serial.println(AngleX0);

    target_angle = static_cast<float>(PWM)/180*3.14;//把陀螺仪MPU6050获得的角度转换为弧度赋值给电机

    motor_0.move(target_angle);//实际这是扭矩值

    Serial.println(target_angle);

//    delay(5);

}

软件平台:arduino ide,或者 vscode+platform io

基于simplefoc库和ESP32实现双电机驱动 simplefoc,esp32,foc控制,双直流无刷电机 阅读详情

相关推荐

Mini FOC无刷平衡车 V2.0版本

采用分层模块化架构,结合HAL硬件抽象层、控制层和应用层,可以构建一个可靠、高效、可扩展的系统平台。项目中采用FOC电机控制、PID控制、姿态解算等成熟技术,并结合严格的软件工程方法,能够确保项目的成功交付和长期维护。这种架构将系统分解为多个独立的模块,每个模块负责特定的功能,模块之间通过清晰定义的接口进行交互。平衡控制是平衡车系统的核心功能。实际上,一个完整的嵌入式平衡车项目,尤其是在包含RTOS、复杂控制算法、图形界面、通信协议等功能的情况下。控制层是系统的核心,负责实现平衡车的各种控制功能。

lianmengde的博客 1217

基于FOC的无刷平衡车设计

(3)无刷平衡车小车机械结构设计:将无刷平衡车小车分解为车身结构、机械臂和车轮等若干部分,分别对各个结构的关键部件进行详细设计并校核,绘制无刷平衡车小车总装图和关键零部件图。(2)无刷平衡车小车总体设计:确定无刷平衡车小车的具体任务要求,根据任务初步拟定无刷平衡车小车的技术参数、运动形式、机械结构、驱动方案、传动方案、控制方案等。(4)传感和信息检测及信息传输:根据任务要求,完成相关信息检测、处理,并完成信息的正确传输。(3)实现蓝牙控制,可以通过手机软件控制小车的前进、后退、转弯以及机械臂的动作;

毕业作品网站 1866

SimpleFOC无刷电机平衡小车

基于SimpleFOC的ESP32无刷平衡小车

张竞豪的博客 1万+

利用手机蓝牙发送串口数据对直流无刷电机进行控制

利用simplefocfoc和手机蓝牙串口发送数据,实现直流无刷电机闭环控制。

macolin的专栏 1415

基于STM32f103简单自平衡小车项目总结

一. 项目基本信息 项目名称:基于STM32f103简单自平衡小车 项目完成时间:2018.9.20——2018.10.20 项目类别:自动控制类 项目总体概述:           这个项目是我在入门嵌入式做的第一个项目,是在看完原子哥的视频后,为了巩固和连接起来这些知识点做的,做的不是很好。此次项目主要涉及到嵌入式方面的的基础知识,如PWM输出,IIC通信时序,uart串口通信,定时...

weixin_42149196的博客 1万+

stm32两轮平衡小车项目详解

摘要 这个项目是在20年11月初开始的,当时的我很迷茫,本应该去实习的我在线上培训,觉得无聊,便有了自己一人做项目的想法。也没想到这个项目做了将近整整一个月,才差不多做了出来。也是准备做两个项目的,这是第一个而已。 项目所需物料清单 主控板用到了c8t6、小车底盘(这个硬件是这项目于最贵的物料了),可以用大鱼电子、或者平衡小车之家的。由于经费的原因,我买了两个带电机的车轮、加上了亚克力板,勉强搭成了小车底盘。为了布线方便,我用到了面包板。由于对焊接并不是很熟练,没用到洞洞板,这算是这个项目不大光彩的地方。用

weixin_42952472的博客 1万+

李亚普诺夫稳定性分析:从V函数到非线性系统控制实践

控制系统稳定性的判断是自动控制设计的基石,它决定被控对象能否在扰动后回到期望状态。李亚普诺夫稳定性理论提供了一套不依赖试错、适用于线性和非线性系统的通用分析方法。其核心在于构造一个正定的李亚普诺夫函数V(x),通过分析其沿系统轨迹的导数符号,严格判断系统是稳定、渐近稳定还是全局稳定。直接法与间接法各有适用场景,配合拉塞尔不变集原理,可解决工程中常见的半负定导数问题。在电机FOC、滑模控制等实际工程中,该方法被广泛用于验证控制器收敛性、整定控制参数和界定稳定边界。掌握V函数的构造技巧,以及处理离散化、参数不确

weixin_34238633的博客 160

simpleFOC控制无刷电机理论及实践

1.

qqliuzhitong的博客 1万+

Berkeley Humanoid Lite——开源、易获取且可定制的3D打印0.8m小人形:5000美刀成本下的模块化设计、摆线关节、可行走、可VR遥操

我司将于深圳设立具身机器人团队,依托本地硬件人才与供应链优势,推动低成本、模块化开源人形机器人BerkeleyHumanoidLite的落地应用。该平台采用3D打印摆线齿轮箱,整机成本低于5000美元,支持桌面级打印与广泛采购,实现易获取、可定制、全开源。项目已获江兄、kimi等开发者推荐,欢迎敢想敢干者加入,共同推进具身智能教育与研发。杭州办公室将延后建设。

结构之法 算法之道 1103

INA240三相无刷电机电流采样实例(arduino)

前言&&准备材料 我这里用的控制器是esp32,它的adc采集器分辨率是12位,工作电压是3.3V。因此我们读取到的模拟数值0~4096就是对应的0~3.3V。 这里我的ina240型号是I240A2。也就是说ina240的增益是50V/V。 我的驱动器型号是simplefoc v0.2。采用内置电流采样,具体电流采样电路如下图: 双向 参考链接: 1.【INA240】产品参数介绍、INA240数据手册、中英文PDF资料下载-TI资...

qqliuzhitong的博客 1万+

Allegro17.2 出gerber文件详细流程 - 干货

Allegro17.2 出gerber文件详细流程 - 干货

u010614434的博客 1万+

具身智能硬件落地的十大物理深坑与避坑指南

具身智能不是算法的独角戏,而是算法、机械、电子、热学与电磁环境深度耦合的系统工程。当大模型遇见真实世界,决定成败的往往不是参数量或算力,而是电机轴端的谐振频率、PCB铜箔在热循环下的疲劳裂纹、IMU在温升后的零偏漂移等物理层细节。这些‘硬件深坑’藏于规格书夹缝、调试日志边缘和故障照片背后,却直接导致定位失准、通信丢帧、控制抖动乃至整机瘫痪。本文聚焦工业巡检、仓储分拣、养老陪护等典型场景,从热失控、EMC串扰、机械回差到时间同步误差,系统拆解硬件选型与排障中必须直面的底层物理约束,为机器人本体开发、系统集成与

weixin_33896726的博客 443

最近爆火的 Ontology 本体是什么?一文看懂基础概念 + 落地实操

1993 Tom Gruber原版定义:本体是对领域概念化模型的显式形式化规范。1998 Studer完善通用定义:本体是共享、明确、形式化的领域概念模型规范。大白话翻译:本体就是机器能看懂的行业词典+业务规则手册。数据库只管存数据,本体只管定规则,知识图谱是规则+数据结合体。区别于普通开源本体工具,这款国产商用本体平台核心优势:业务沙盘推演、可控业务数据写回、全链路字段级数据血缘审计,适配企业生产级业务落地。

驽马不舍 367

电子设计竞赛控制组——完整旋转倒立摆程序

以前也想过要写博客,但是却一直没有付诸于实践,作为第一篇原创,我还是选择将以前电赛时的作品拿出来,毕竟当初可是花费了好多心血的,汗~ 旋转倒立摆是控制组校内赛练手的题目,需要对PID非常熟悉才能调好参数,以下代码是自己搭建好结构后调试出来的程序,其中的参数会根据不同的结构作出调整。 结构组成: K60开发板(带液晶屏和按键),角度编码器,直流减速电机(带编码器),12V的电机驱动,金属摆臂,...

bingo_xx的博客 8073

产品竞争策略方法论:构建“差异化 + 结构化 + 系统化”的竞争优势

本文系统探讨了IoT产品竞争策略,指出当前企业普遍存在硬件能力强但商业竞争能力不足的问题。文章构建了五层竞争模型(产品层、体验层、服务层、数据层、生态层),提出五大核心竞争策略(成本领先、差异化竞争、聚焦竞争、生态竞争、数据驱动竞争),并详细阐述了差异化设计方法。通过行业案例分析(小米、苹果、特斯拉)和五步落地方法,强调从硬件竞争向系统优势转变的重要性。文章指出IoT竞争胜负关键在后半场的数据运营和服务延伸,建议企业通过构建差异化能力、完善服务体系、建立数据体系、逐步构建生态来避免价格战陷阱,实现从跟随到领

专注智能硬件软硬件产品经理成长与实战,分享从需求定义到量产落地的真实日记。涵盖IoT趋势洞察、研发协作经验、产品方法论与工具箱,用轻松有趣的“汪式”视角,陪伴产品经理成长、避坑与升级。 360

ORCAD原理图关联封装时出现ERROR(ORCIS-6245)、ERROR(ORCIS-6013)问题

1、当你进行如下操作时: 系统先是提示你出现ERROR(ORCIS-6245)然后再确定后再出现ERROR(ORCIS-6013)问题 是由于你的数据库的路径不对。 具体操作方法如下:1、先找到你的CAPTURE.INI文件。 2、用记事本打开CAPTURE.INI。找到下图路径 3、在你的Orcad capture CIS原理图软件中点击 Options------>CIS con...

weixin_42304393的博客 2万+

Simple FOC

/(A的输出引脚,B相的输出引脚,C相的输出引脚,电机的A相使能引脚*,电机的b相使能引脚*,电机的c相使能引脚*)BLDCMotor motor = BLDCMotor(7);//(极对数,相电阻*)1. 电机极对数与相电阻**R - 电机相电阻(可选)- pp - 极对数。

weixin_47620224的博客 1298

AXI_Bus_Matrix_4x4 设计

Signal Source Width(bits) Description AWID Master AWID_WIDTH 写事务ID AWADDR Master

Starry__的博客 3769

基于STM32f103c8t6的两轮自平衡小车--2(实现自平衡)

实现自平衡才是整个工程的重点; 1:首先,要实现小车自平衡控制,必须先有一个检测小车姿态的传感器,在这里我使用的是Mpu6050六轴加速度陀螺仪传感器,使用的是IIC来传数据; 关于Mpu6050六轴加速度陀螺仪传感器的使用方法,可以去参考原子的教程,在这里说下我遇到的问题; 首先在程序开始的时候要保持Mpu在水平位置初始化,其次关于代码IIC的初始化必须放在DMP初始化的后面,不然会出问题; ...

qq_45906993的博客 3115

Handler相关面试题

常见面试题: Handler相关 一.谈一谈你对handler的认识,例如:机制和实现等。 handler机制图解: handler常见使用过程: ①.子线程向主线程发送消息: 在主线程中新建Handler实例,并重写handleMessage()方法用于处理子线程传过来的message; 通过Message.obtain()方法获取到消息msg,然后将需要传递给主线程的信息通过msg的what、obj等字段传递; 通过handler的sendMessage发送msg消息,然后在hand

龚礼鹏的博客 3171

SerDes系列之 SSC扩频时钟技术

扩频时钟,又称展频(SSC-Spread Spectrum Clocking),当前PCIE、DDR、USB等几乎所有的高速接口都支持SSC的功能。电子工程师在日常的电气测试中经常与之接触,在电磁传导和辐射发射验证过程中,经常需要使用到芯片的SSC功能,它的物理表现形式,就是信号的比特率会在一个很小的范围内浮动,多见于周期性变化的时钟信号。

一只豌豆象的博客 3443

平衡小车趟过的那些坑

最近在研究平衡小车,在TB上买了一个小车套件,源代码是用的stm32的3.5库,自己打算移植到hal库上面去,顺便深入了解一下平衡小车控制原理。下面就说说移植过程中趟过的坑,1.匿名科创地面站本是一款调试四轴的利器,但是拿来调试平衡车也相当棒,问题出在小车集成了一键下载功能(usb转口,利用DTR和RTS做复位和boot引脚拉低),匿名地面站应该是触发了boot,导致程序下载调试和运行都有问题,解...

ben392797097的专栏 3885

手把手教你学Simulink--复杂环境适应的四足机器人领域仿真建模实例:构建一个基于Simulink的四足机器人动态平衡保持仿真模型

通过上述步骤,你可以构建一个基本的基于Simulink的四足机器人动态平衡保持仿真模型。此模型不仅有助于理解四足机器人在复杂环境中的动态平衡控制原理,也为进一步优化提供了基础。随着技术的发展,还可以探索更多高级功能,如自适应步态调整、强化学习等,以提高机器人的智能性和适应性。

MHD0815的博客 238

自平衡小车控制(stc12+mpu6050程序)

自平衡小车控制(stc12+mpu6050程序) /*********************************************************************** // 两轮自平衡车最终版控制程序(6轴MPU6050+互补滤波+PWM电机) // 单片机STC12C5A60S2 // 晶振:20M //...

qq_18536597的博客 2511

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

小米类型平衡车分析

基于STM32或者GD32平台配合IMU6887陀螺仪智造的小米类型骑行平衡车 引言: 近些年来随着微传感器Sensor的进步,运用陀螺仪技术读取物体姿态的产品应用而生,搭配先进的ARM系列单片机,使得算法能及时跟踪物体变化的姿态,再驱动传动机构电机便能实现体感控制器。 陀螺仪: 其本身输出的是角速度和加速度数据,物理上我们可以通过公式运用这两个参数很容易的得到角度值,但物体静止时可以使用简单的公式便能得到角度,一旦物体运动时,得到的角度变差之毫厘谬以千里;因此我们有了常规的两种姿态解算算法即1.四元素法和

u010170861的博客 1475

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SimpleFOC图形上位机SimpleFOC Stuido的使用

1.前言 1.1.上位机安装 下载地址 根据github上的readme.md文件安装即可。其实需要做一件事,就是进如下载的文件夹,运行pip install -r "requirements.txt"命令,要安装的文件作者已经全部去写在里面了,意见安装即可。 1.2.注意事项 这个上位机是使用串口实时打印的,并且处于主循环中,其优先级与motor.loopFOC函数相同,所以会很大程度上影响电机的控制,控制应用中一定不能用,调参可以用。 2.SimpleFOC硬件端程序 以位置控制程序为例,程序实例如下:

qq_42731705的博客 8326

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: 利用手机蓝牙发送串口数据对直流无刷电机进行控制
下一篇: Platformio或arduino ide编译基于simplefoc库出现这类报错
M创动工坊
博客等级 码龄19年 72粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

M创动工坊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值