INA240三相无刷电机电流采样实例(arduino)
生活随笔
收集整理的這篇文章主要介紹了
INA240三相无刷电机电流采样实例(arduino)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
前言&&準備材料
arduino程序
參考鏈接:
前言&&準備材料
我這里用的控制器是esp32,它的adc采集器分辨率是12位,工作電壓是3.3V。因此我們讀取到的模擬數值0~4096就是對應的0~3.3V。
這里我的ina240型號是I240A2。也就是說ina240的增益是50V/V。
我的驅動器型號是simplefoc v0.2。采用內置電流采樣,具體電流采樣電路如下圖:
?雙向
arduino程序
/**使用電壓控制回路的扭矩控制示例。大多數低端無刷電機驅動器沒有電流測量功能,因此SimpleFOC為您提供了一種通過設置電機電壓而不是電流來控制電機扭矩的方法。這使無刷直流電機有效地成為直流電機,您可以以相同的方式使用它。 */ // 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);//低通濾波器時間常量~LowPassFilte() = default;float operator() (float x);float Tf; //!< 低通濾波器時間常量protected:unsigned long timestamp_prev; //!< 上次執行時間戳float y_prev; //!< 經過上次執行后過濾到的值 };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);//原始數據濾波器 LowPassFilte LF_b(0.01);//A相電流濾波器 LowPassFilte LF_c(0.01);//C相電流濾波器//AS5600編碼器支持spi,iic和模擬量三種數據傳輸方式,這里用iic(同時也是最常用的方式) // 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的測試代碼
/**使用電壓控制回路的扭矩控制示例。大多數低端無刷電機驅動器沒有電流測量功能,因此SimpleFOC為您提供了一種通過設置電機電壓而不是電流來控制電機扭矩的方法。這使無刷直流電機有效地成為直流電機,您可以以相同的方式使用它。 */ // 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);//低通濾波器時間常量~LowPassFilte() = default;float operator() (float x);float Tf; //!< 低通濾波器時間常量protected:unsigned long timestamp_prev; //!< 上次執行時間戳float y_prev; //!< 經過上次執行后過濾到的值 };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);//原始數據濾波器 LowPassFilte LF_b(0.01);//A相電流濾波器 LowPassFilte LF_c(0.01);//C相電流濾波器//AS5600編碼器支持spi,iic和模擬量三種數據傳輸方式,這里用iic(同時也是最常用的方式) // 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】產品參數介紹、INA240數據手冊、中英文PDF資料下載-TI資料-電子發燒友
2.?
總結
以上是生活随笔為你收集整理的INA240三相无刷电机电流采样实例(arduino)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 艾永亮:苹果缺乏创新能力?打造超级产品是
- 下一篇: 2018届春招面试回顾(二)