性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

  • 回復
  • 收藏
  • 點贊
  • 分享
  • 發(fā)新帖

【 DigiKey DIY原創(chuàng)大賽】自平衡萊羅三角形(四)- 程序結構及邏輯

本項目是在Arduino2.3.3下開發(fā)的,需要安裝esp32_package_1.0.6.exe庫環(huán)境。還需要安裝電機的驅動代碼庫我使用的是Arduino-FOC-2.2.1“SimpleFOC.h”。

萊羅三角形涉及到的技術比較復雜。主要有電機的速度控制、整機的平衡控制PID算法、卡爾曼濾波 "Kalman.h"等等。

電機的控制FOC(Field-Oriented Control)是一種用于電機控制的方法,廣泛應用于現(xiàn)代交流電機驅動系統(tǒng)中。流程包括初始化系統(tǒng):包括硬件初始化、變量初始化等。讀取傳感器數據:從編碼器或其他傳感器讀取轉子位置信息。計算轉子位置:通過讀取的傳感器數據計算出轉子的實際位置。計算d-q軸電流:將三相電流轉換為d-q軸系下的電流。計算轉矩和磁通:根據d-q軸電流計算電機的電磁轉矩和磁通。計算電壓指令:根據FOC算法計算出所需的電壓指令。生成PWM信號:將電壓指令轉化為PWM信號。輸出PWM信號:將生成的PWM信號發(fā)送給逆變器,以驅動電機。循環(huán)等待下一個周期:等待下一個控制周期開始,重復上述過程。 

對電機的操作代碼如下

//連接motor對象與傳感器對象
  motor.linkSensor(&sensor);
  //供電電壓設置 [V]
  driver.voltage_power_supply = 12;
  driver.init();
  //連接電機和driver對象
  motor.linkDriver(&driver);
  //FOC模型選擇
  motor.foc_modulation = FOCModulationType::SpaceVectorPWM;
  //運動控制模式設置
  motor.controller = MotionControlType::torque;
    //速度PI環(huán)設置
  motor.PID_velocity.P = v_p_1;
  motor.PID_velocity.I = v_i_1;
  //最大電機限制電機
  motor.voltage_limit = 12;
  //速度低通濾波時間常數
  motor.LPF_velocity.Tf = 0.01;
  //設置最大速度限制
  motor.velocity_limit = 40;
  motor.useMonitoring(Serial);
讀取MPU6050數據
while(i2cRead(0x3B, i2cData, 14));
    accX = (int16_t)((i2cData[0] << 8) | i2cData[1]);
    accY = (int16_t)((i2cData[2] << 8) | i2cData[3]);
    accZ = (int16_t)((i2cData[4] << 8) | i2cData[5]);
//    tempRaw = (int16_t)((i2cData[6] << 8) | i2cData[7]);
    gyroX = (int16_t)((i2cData[8] << 8) | i2cData[9]);
    gyroY = (int16_t)((i2cData[10] << 8) | i2cData[11]);
    gyroZ = (int16_t)((i2cData[12] << 8) | i2cData[13]);
double dt = (double)(micros() - timer) / 1000000; // Calculate delta time
    timer = micros();
double pitch = acc2rotation(accX, accY);
double gyroZrate = gyroZ / 131.0; // Convert to deg/s
    kalAngleZ = kalmanZ.getAngle(pitch, gyroZrate + gyroZ_OFF, dt);
    gyroZangle += (gyroZrate + gyroZ_OFF) * dt;
    compAngleZ = 0.93 * (compAngleZ + (gyroZrate + gyroZ_OFF) * dt) + 0.07 * pitch;
angle當前角度與期望角度差值,在差值大的時候進行搖擺,差值小的時候LQR控制電機保持平衡
if(test_flag == 0)//正常控制
{
if(abs(pendulum_angle) < swing_up_angle) // if angle small enough stabilize 0.5~30°,1.5~90°
{
     target_velocity = controllerLQR(pendulum_angle, gyroZrate, motor.shaft_velocity);
if(abs(target_velocity) > 120)
        target_velocity = _sign(target_velocity) * 120;
motor.controller = MotionControlType::velocity;
motor.move(target_velocity);
}
else // else do swing-up
{    // sets swing_up_voltage to the motor in order to swing up
motor.controller = MotionControlType::torque;
          target_voltage = -_sign(gyroZrate) * swing_up_voltage;
motor.move(target_voltage);
}
}
使用esp32串口實現(xiàn)下載程序,下載軟件是flash_download_tool_3.9.2

選擇正確串口就可以下載。

整機成品入下圖

以下為視頻演示:

總結:

經歷這個項目,開始了無鋼網焊接之旅。上手了ESP32,學習了FOC,AS5600,MPU6050,EG2133,卡爾曼濾波,PID算法等等等等。

致謝!

感謝電源網和DigiKey

感謝45roll和每一個幫助過任何人的人

全部回復(0)
正序查看
倒序查看
現(xiàn)在還沒有回復呢,說說你的想法
發(fā)