INA240三相无刷电机电流采样实例(arduino)
生活随笔
收集整理的這篇文章主要介紹了
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)題。
- 上一篇: 艾永亮:苹果缺乏创新能力?打造超级产品是
- 下一篇: 2018届春招面试回顾(二)