日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2024/1/8 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 INA240三相无刷电机电流采样实例(arduino) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

前言&&準(zhǔn)備材料

arduino程序

參考鏈接:


前言&&準(zhǔn)備材料

我這里用的控制器是esp32,它的adc采集器分辨率是12位,工作電壓是3.3V。因此我們讀取到的模擬數(shù)值0~4096就是對(duì)應(yīng)的0~3.3V。

這里我的ina240型號(hào)是I240A2。也就是說(shuō)ina240的增益是50V/V。

我的驅(qū)動(dòng)器型號(hào)是simplefoc v0.2。采用內(nèi)置電流采樣,具體電流采樣電路如下圖:

?雙向

arduino程序

/**使用電壓控制回路的扭矩控制示例。大多數(shù)低端無(wú)刷電機(jī)驅(qū)動(dòng)器沒(méi)有電流測(cè)量功能,因此SimpleFOC為您提供了一種通過(guò)設(shè)置電機(jī)電壓而不是電流來(lái)控制電機(jī)扭矩的方法。這使無(wú)刷直流電機(jī)有效地成為直流電機(jī),您可以以相同的方式使用它。 */ // IN1 pwm1 9 27 // IN2 pwm2 6 26 // IN3 pwm3 5 25 // INH1 enable1 8 12 // INH2 enable2 7 13 // INH3 enable3 4 14 //in-line current sense - phase 1/A 35 //in-line current sense - phase 1/C 34#include <SimpleFOC.h>class LowPassFilte {public:LowPassFilte(float Tf);//低通濾波器時(shí)間常量~LowPassFilte() = default;float operator() (float x);float Tf; //!< 低通濾波器時(shí)間常量protected:unsigned long timestamp_prev; //!< 上次執(zhí)行時(shí)間戳float y_prev; //!< 經(jīng)過(guò)上次執(zhí)行后過(guò)濾到的值 };LowPassFilte::LowPassFilte(float time_constant): Tf(time_constant), y_prev(0.0f) {timestamp_prev = micros(); }float LowPassFilte::operator() (float x) {unsigned long timestamp = micros();float dt = (timestamp - timestamp_prev) * 1e-6f;if (dt < 0.0f || dt > 0.5f)dt = 1e-3f;float alpha = Tf / (Tf + dt);float y = alpha * y_prev + (1.0f - alpha) * x;y_prev = y;timestamp_prev = timestamp;return y; }LowPassFilte LF_a(0.01);//原始數(shù)據(jù)濾波器 LowPassFilte LF_b(0.01);//A相電流濾波器 LowPassFilte LF_c(0.01);//C相電流濾波器//AS5600編碼器支持spi,iic和模擬量三種數(shù)據(jù)傳輸方式,這里用iic(同時(shí)也是最常用的方式) // magnetic sensor instance - I2C MagneticSensorI2C sensor = MagneticSensorI2C(AS5600_I2C); TwoWire I2Cone = TwoWire(0);// BLDC motor & driver instance BLDCMotor motor = BLDCMotor(11); BLDCDriver3PWM driver = BLDCDriver3PWM(27, 26, 25, 12, 13, 14);InlineCurrentSense Cs_motor(0.001, 50.0, 35, 36, 34);// voltage set point variable float target_voltage = 5.0; // instantiate the commander Commander command = Commander(Serial); void doTarget(char* cmd) {command.scalar(&target_voltage, cmd); }void setup() {// initialise magnetic sensor hardwareI2Cone.begin(18, 5, 400000);sensor.init(&I2Cone);// link the motor to the sensormotor.linkSensor(&sensor);// power supply voltagedriver.voltage_power_supply = 12;driver.init();motor.linkDriver(&driver);// aligning voltagemotor.voltage_sensor_align = 5;// choose FOC modulation (optional)motor.foc_modulation = FOCModulationType::SpaceVectorPWM;// set motion control loop to be usedmotor.controller = MotionControlType::torque;// use monitoring with serialSerial.begin(115200);// comment out if not neededmotor.useMonitoring(Serial);// initialize motormotor.init();// align sensor and start FOCmotor.initFOC();// add target command Tcommand.add('T', doTarget, "target voltage");Serial.println(F("Motor ready."));Serial.println(F("Set the target voltage using serial terminal:"));_delay(1000);Cs_motor.init(); }void loop() {// main FOC algorithm function// the faster you run this function the better// Arduino UNO loop ~1kHz// Bluepill loop ~10kHzmotor.loopFOC();// Motion control function// velocity, position or voltage (defined in motor.controller)// this function can be run at much lower frequency than loopFOC() function// You can also use motor.move() and set the motor.target in the codemotor.move(target_voltage);// Cs_motor.getPhaseCurrents();Serial.print(LF_b((Cs_motor.getPhaseCurrents()).a));Serial.print(",");Serial.println(LF_c((Cs_motor.getPhaseCurrents()).c));// Serial.print(LF_a(analogRead(35))); // Serial.print(","); // Serial.print(LF_b((3.3 * ((float)analogRead(35) - 1930) / 4096.0) * 20.0)); // Serial.print(","); // Serial.println(LF_c((-3.3 * ((float)analogRead(34) - 1930) / 4096.0) * 20.0));// user communicationcommand.run(); }

串口打印效果:

用Baize_Foc的測(cè)試代碼

/**使用電壓控制回路的扭矩控制示例。大多數(shù)低端無(wú)刷電機(jī)驅(qū)動(dòng)器沒(méi)有電流測(cè)量功能,因此SimpleFOC為您提供了一種通過(guò)設(shè)置電機(jī)電壓而不是電流來(lái)控制電機(jī)扭矩的方法。這使無(wú)刷直流電機(jī)有效地成為直流電機(jī),您可以以相同的方式使用它。 */ // IN1 pwm1 9 27 // IN2 pwm2 6 26 // IN3 pwm3 5 25 // INH1 enable1 8 12 // INH2 enable2 7 13 // INH3 enable3 4 14 //in-line current sense - phase 1/A 35 //in-line current sense - phase 1/C 34#include <SimpleFOC.h>class LowPassFilte {public:LowPassFilte(float Tf);//低通濾波器時(shí)間常量~LowPassFilte() = default;float operator() (float x);float Tf; //!< 低通濾波器時(shí)間常量protected:unsigned long timestamp_prev; //!< 上次執(zhí)行時(shí)間戳float y_prev; //!< 經(jīng)過(guò)上次執(zhí)行后過(guò)濾到的值 };LowPassFilte::LowPassFilte(float time_constant): Tf(time_constant), y_prev(0.0f) {timestamp_prev = micros(); }float LowPassFilte::operator() (float x) {unsigned long timestamp = micros();float dt = (timestamp - timestamp_prev) * 1e-6f;if (dt < 0.0f || dt > 0.5f)dt = 1e-3f;float alpha = Tf / (Tf + dt);float y = alpha * y_prev + (1.0f - alpha) * x;y_prev = y;timestamp_prev = timestamp;return y; }LowPassFilte LF_a(0.01);//原始數(shù)據(jù)濾波器 LowPassFilte LF_b(0.01);//A相電流濾波器 LowPassFilte LF_c(0.01);//C相電流濾波器//AS5600編碼器支持spi,iic和模擬量三種數(shù)據(jù)傳輸方式,這里用iic(同時(shí)也是最常用的方式) // magnetic sensor instance - I2C MagneticSensorI2C sensor = MagneticSensorI2C(AS5600_I2C); TwoWire I2Cone = TwoWire(0);// BLDC motor & driver instance BLDCMotor motor = BLDCMotor(11); BLDCDriver3PWM driver = BLDCDriver3PWM(17, 18, 19, 21, 22, 23);InlineCurrentSense Cs_motor(0.001, 50.0, 34, 35);// voltage set point variable float target_voltage = 5.0; // instantiate the commander Commander command = Commander(Serial); void doTarget(char* cmd) {command.scalar(&target_voltage, cmd); }void setup() {// initialise magnetic sensor hardwareI2Cone.begin(26, 25, 400000);sensor.init(&I2Cone);// link the motor to the sensormotor.linkSensor(&sensor);// power supply voltagedriver.voltage_power_supply = 12;driver.init();motor.linkDriver(&driver);// aligning voltagemotor.voltage_sensor_align = 5;// choose FOC modulation (optional)motor.foc_modulation = FOCModulationType::SpaceVectorPWM;// set motion control loop to be usedmotor.controller = MotionControlType::torque;// use monitoring with serialSerial.begin(115200);// comment out if not neededmotor.useMonitoring(Serial);// initialize motormotor.init();// align sensor and start FOCmotor.initFOC();// add target command Tcommand.add('T', doTarget, "target voltage");Serial.println(F("Motor ready."));Serial.println(F("Set the target voltage using serial terminal:"));_delay(1000);Cs_motor.init(); }void loop() {// main FOC algorithm function// the faster you run this function the better// Arduino UNO loop ~1kHz// Bluepill loop ~10kHzmotor.loopFOC();// Motion control function// velocity, position or voltage (defined in motor.controller)// this function can be run at much lower frequency than loopFOC() function// You can also use motor.move() and set the motor.target in the codemotor.move(target_voltage);// Cs_motor.getPhaseCurrents(); // Serial.print(LF_b((Cs_motor.getPhaseCurrents()).a)); // Serial.print(","); // Serial.println(LF_c((Cs_motor.getPhaseCurrents()).c));// Serial.print(LF_a(analogRead(35))); // Serial.print(",");Serial.print(LF_b((3.3 * ((float)analogRead(35) - 1930) / 4096.0) * 20.0));Serial.print(",");Serial.println(LF_c((-3.3 * ((float)analogRead(34) - 1930) / 4096.0) * 20.0));// user communicationcommand.run(); }

參考鏈接:

1.【INA240】產(chǎn)品參數(shù)介紹、INA240數(shù)據(jù)手冊(cè)、中英文PDF資料下載-TI資料-電子發(fā)燒友

2.?

總結(jié)

以上是生活随笔為你收集整理的INA240三相无刷电机电流采样实例(arduino)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。