あーちゃん制御
Dependencies: FastPWM cal_PID mbed nucleo_rotary_encoder
omuni/speed_control/speed_control.cpp
- Committer:
- Akito914
- Date:
- 2017-09-25
- Revision:
- 1:d6e30aa7bc5b
- Parent:
- 0:4346c5764e83
File content as of revision 1:d6e30aa7bc5b:
#include "mbed.h" #include "speed_control.hpp" #include "rotary_encoder_ab_phase.hpp" speed_control::speed_control(TIM_TypeDef *timer_type, float _pulse_per_revol, float _cy_ms, bool rev) { e = new rotary_encoder_ab_phase(timer_type, _pulse_per_revol); pulse_per_revol = _pulse_per_revol; cy_ms = _cy_ms; f1 = f2 = 0; target_value = 0.0f; _rev = rev; e->start(); t.start(); } void speed_control::set_speed(float _target_value) { target_value = _target_value; } void speed_control::set_pid(float _kp, float _ki, float _kd) { kp = _kp; ki = _ki; kd = _kd; f1 = kp + ki / 2.0f + kd; f2 = -1.0f * kp + ki / 2.0f - 2.0f * kd; e->reset(); t.reset(); time_counter = 0; pre_counts = 0; } bool speed_control::check_get_speed() { if(t.read_ms() > time_counter) { time_counter += cy_ms; for(int i = 9; i > 0; i--) { e_value[i] = e_value[i-1]; } int32_t ec = e->get_counts(); e_value[0] = ec - pre_counts; if(ec > 20000 || ec < -20000) { e->reset(); pre_counts = pre_counts - ec; } else { pre_counts = ec; } int32_t esum = 0; for(int i = 0; i < 10; i++) { esum += e_value[i]; } sensor_value = esum / pulse_per_revol / (10.0f * cy_ms) * 1000; return true; } else { return false; } } char speed_control::get_duty() { if(t.read() > 1800) { t.reset(); time_counter = 0; } if(check_get_speed()) { diff[0] = sensor_value - target_value; dm = f1 * diff[0] + j; m = m + dm; int m_int = (int)m * -1; if(m_int <= -126) m_int = -126; if(m_int >= 126) m_int = 126; duty = m_int; j = f2 * diff[0] + kd * diff[1]; diff[1] = diff[0]; } if(_rev)duty *= -1; return duty; } float speed_control::get_speed() { return sensor_value; }