https://os.mbed.com/users/sayzyas
Dependencies: QEI TextLCD mbed
mcchk.cpp
- Committer:
- sayzyas
- Date:
- 2018-07-26
- Revision:
- 0:73dd48be5ca6
File content as of revision 0:73dd48be5ca6:
#include "mbed.h"
#include "common.h"
#include <math.h>
#include "mcchk.h"
// Motor current
AnalogIn mctr3_m2c(A5); // LB crawler
AnalogIn mctr3_m1c(A4); // RF crawler
AnalogIn mctr2_m2c(A3); // LB transform
AnalogIn mctr2_m1c(A2); // RF Transform
AnalogIn mctr1_m2c(A1); // Tilt
AnalogIn mctr1_m1c(A0); // B1: Pan, B2:Winch
mcchk::mcchk()
{
cnt_mclock_LBCRW_f = 0; // motor lock counter
cnt_mclock_LBCRW_r = 0; // motor lock counter
cnt_mclock_RFCRW_f = 0; // motor lock counter
cnt_mclock_RFCRW_r = 0; // motor lock counter
cnt_mclock_LBTFM_f = 0; // motor lock counter
cnt_mclock_LBTFM_r = 0; // motor lock counter
cnt_mclock_RFTFM_f = 0; // motor lock counter
cnt_mclock_RFTFM_r = 0; // motor lock counter
cnt_mclock_CMPAN_f = 0; // motor lock counter
cnt_mclock_CMPAN_r = 0; // motor lock counter
cnt_mclock_CTILT_f = 0; // motor lock counter
cnt_mclock_CTILT_r = 0; // motor lock counter
cnt_mclock_WINCH_f = 0; // motor lock counter
cnt_mclock_WINCH_r = 0; // motor lock counter
}
// --------------------------------------------------------------
// Motor Current Calibration Function
// Arg: Motor Number 1 - 3
// --------------------------------------------------------------
void mcchk::set_init_mc( int cnt )
{
m_LBCRW_center_value = 0;
m_RFCRW_center_value = 0;
m_LBTFM_center_value = 0;
m_RFTFM_center_value = 0;
m_WINCH_center_value = 0;
m_CMPAN_center_value = 0;
m_CTILT_center_value = 0;
for( int i = 0; i < cnt; i++ )
{
m_LBCRW_center_value += mctr3_m1c.read() * 100.0f;
m_RFCRW_center_value += mctr3_m2c.read() * 100.0f;
m_LBTFM_center_value += mctr2_m1c.read() * 100.0f;
m_RFTFM_center_value += mctr2_m2c.read() * 100.0f;
m_WINCH_center_value += mctr1_m1c.read() * 100.0f;
m_CMPAN_center_value += mctr1_m1c.read() * 100.0f;
m_CTILT_center_value += mctr1_m2c.read() * 100.0f;
}
m_LBCRW_center_value /= cnt;
m_RFCRW_center_value /= cnt;
m_LBTFM_center_value /= cnt;
m_RFTFM_center_value /= cnt;
m_WINCH_center_value /= cnt;
m_CMPAN_center_value /= cnt;
m_CTILT_center_value /= cnt;
}
float mcchk::rd_motorCurrent( int no )
{
if( no == 11 ) return mctr1_m1c.read()*100.0f;
else if( no == 12 ) return mctr1_m2c.read()*100.0f;
else if( no == 21 ) return mctr2_m1c.read()*100.0f;
else if( no == 22 ) return mctr2_m2c.read()*100.0f;
else if( no == 31 ) return mctr3_m1c.read()*100.0f;
else if( no == 32 ) return mctr3_m2c.read()*100.0f;
return 0;
}
bool mcchk::rdnchk_motorCurrent(
int8_t motor_number,
int8_t motor_dir,
int8_t motor_lock_chk_cnt
){
bool mcchk = false;
bool rts = false;
// Check RF-Crawler
if( motor_number == MOTOR_RFCRW )
{
if( motor_dir == MOTOR_DIR_FWD )
{
mcchk = chk_motor_lock( mctr3_m1c.read()*100.0f, m_RFCRW_center_value, mc_th_RFCRW_f);
if( mcchk == true )
{
cnt_mclock_RFCRW_f += 1;
}
else
{ if( cnt_mclock_RFCRW_f > 0 )
{
cnt_mclock_RFCRW_f -= 1;
}
else
{
cnt_mclock_RFCRW_f = 0;
}
}
if( cnt_mclock_RFCRW_f > motor_lock_chk_cnt )
{
flg_mclock_RFCRW = 1;
}
else
{
flg_mclock_RFCRW = 0;
rts = false; // NO LOCK
}
}
else
{
mcchk = chk_motor_lock( mctr3_m1c.read()*100.0f, m_RFCRW_center_value, mc_th_RFCRW_r);
if( mcchk == true )
{
cnt_mclock_RFCRW_r += 1;
}
else
{ if( cnt_mclock_RFCRW_r > 0 )
{
cnt_mclock_RFCRW_r -= 1;
}
else
{
cnt_mclock_RFCRW_r = 0;
}
}
if( cnt_mclock_RFCRW_r > motor_lock_chk_cnt )
{
flg_mclock_RFCRW = 1;
rts = true; // LOCK
}
else
{
flg_mclock_RFCRW = 0;
rts = false; // NO LOCK
}
}
}
// Check LB-Crawler
else if( motor_number == MOTOR_LBCRW )
{
if( motor_dir == MOTOR_DIR_FWD )
{
mcchk = chk_motor_lock( mctr3_m2c.read()*100.0f, m_LBCRW_center_value, mc_th_LBCRW_f);
if( mcchk == true )
{
cnt_mclock_LBCRW_f += 1;
}
else
{ if( cnt_mclock_LBCRW_f > 0 )
{
cnt_mclock_LBCRW_f -= 1;
}
else
{
cnt_mclock_LBCRW_f = 0;
}
}
if( cnt_mclock_LBCRW_f > motor_lock_chk_cnt )
{
flg_mclock_LBCRW = 1;
rts = true; // LOCK
}
else
{
flg_mclock_LBCRW = 0;
rts = false; // LOCK
}
}
else
{
mcchk = chk_motor_lock( mctr3_m2c.read()*100.0f, m_LBCRW_center_value, mc_th_LBCRW_r);
if( mcchk == true )
{
cnt_mclock_LBCRW_r += 1;
}
else
{ if( cnt_mclock_LBCRW_r > 0 )
{
cnt_mclock_LBCRW_r -= 1;
}
else
{
cnt_mclock_LBCRW_r= 0;
}
}
if( cnt_mclock_LBCRW_r > motor_lock_chk_cnt )
{
flg_mclock_LBCRW = 1;
rts = true; // LOCK
}
else
{
flg_mclock_LBCRW = 0;
rts = false; // LOCK
}
}
}
// Check RF-Crawler
else if( motor_number == MOTOR_RFTFM )
{
if( motor_dir == MOTOR_DIR_FWD )
{
mcchk = chk_motor_lock( mctr2_m1c.read()*100.0f, m_RFTFM_center_value, mc_th_RFTFM_f);
if( mcchk == true )
{
cnt_mclock_RFTFM_f += 1;
}
else
{ if( cnt_mclock_RFTFM_f > 0 )
{
cnt_mclock_RFTFM_f -= 1;
}
else
{
cnt_mclock_RFTFM_f = 0;
}
}
if( cnt_mclock_RFTFM_f > motor_lock_chk_cnt )
{
flg_mclock_RFTFM = 1;
rts = true; // LOCK
}
else
{
flg_mclock_RFTFM = 0;
rts = false; // LOCK
}
}
else
{
rts = chk_motor_lock( mctr2_m1c.read()*100.0f, m_RFTFM_center_value, mc_th_RFTFM_r);
if( rts == true )
{
cnt_mclock_RFTFM_r += 1;
}
else
{ if( cnt_mclock_RFTFM_r > 0 )
{
cnt_mclock_RFTFM_r -= 1;
}
else
{
cnt_mclock_RFTFM_r = 0;
}
}
if( cnt_mclock_RFTFM_r > motor_lock_chk_cnt )
{
flg_mclock_RFTFM = 1;
rts = true; // LOCK
}
else
{
flg_mclock_RFTFM = 0;
rts = false; // LOCK
}
}
}
// Check LB-Transform
else if( motor_number == MOTOR_LBTFM )
{
if( motor_dir == MOTOR_DIR_FWD )
{
mcchk = chk_motor_lock( mctr2_m2c.read()*100.0f, m_LBTFM_center_value, mc_th_LBTFM_f);
if( mcchk == true )
{
cnt_mclock_LBTFM_f += 1;
}
else
{ if( cnt_mclock_LBTFM_f > 0 )
{
cnt_mclock_LBTFM_f -= 1;
}
else
{
cnt_mclock_LBTFM_f = 0;
}
}
if( cnt_mclock_LBTFM_f > motor_lock_chk_cnt )
{
flg_mclock_LBTFM = 1;
rts = true; // LOCK
}
else
{
flg_mclock_LBTFM = 0;
rts = false; // LOCK
}
}
else
{
mcchk = chk_motor_lock( mctr2_m2c.read()*100.0f, m_LBTFM_center_value, mc_th_LBTFM_r);
if( mcchk == true )
{
cnt_mclock_LBTFM_r += 1;
}
else
{ if( cnt_mclock_LBTFM_r > 0 )
{
cnt_mclock_LBTFM_r -= 1;
}
else
{
cnt_mclock_LBTFM_r = 0;
}
}
if( cnt_mclock_LBTFM_r > motor_lock_chk_cnt )
{
flg_mclock_LBTFM = 1;
rts = true; // LOCK
}
else
{
flg_mclock_LBTFM = 0;
rts = false; // LOCK
}
}
}
// Check Winch
else if( motor_number == MOTOR_WINCH )
{
if( motor_dir == MOTOR_DIR_FWD )
{
mcchk= chk_motor_lock( mctr1_m1c.read()*100.0f, m_WINCH_center_value, mc_th_WINCH_f);
if( mcchk == true )
{
cnt_mclock_WINCH_f += 1;
}
else
{ if( cnt_mclock_WINCH_f > 0 )
{
cnt_mclock_WINCH_f -= 1;
}
else
{
cnt_mclock_WINCH_f = 0;
}
}
if( cnt_mclock_WINCH_f > motor_lock_chk_cnt )
{
flg_mclock_WINCH = 1;
rts = true; // LOCK
}
else
{
flg_mclock_WINCH = 0;
rts = false; // LOCK
}
}
else
{
mcchk = chk_motor_lock( mctr1_m1c.read()*100.0f, m_WINCH_center_value, mc_th_WINCH_r);
if( mcchk == true )
{
cnt_mclock_WINCH_r += 1;
}
else
{ if( cnt_mclock_WINCH_r > 0 )
{
cnt_mclock_WINCH_r -= 1;
}
else
{
cnt_mclock_WINCH_r = 0;
}
}
if( cnt_mclock_WINCH_r > motor_lock_chk_cnt )
{
flg_mclock_WINCH = 1;
rts = true; // LOCK
}
else
{
flg_mclock_WINCH = 0;
rts = false; // LOCK
}
}
}
// Check Tilt
else if( motor_number == MOTOR_CMPAN )
{
if( motor_dir == MOTOR_DIR_FWD )
{
mcchk = chk_motor_lock( mctr1_m1c.read()*100.0f, m_CMPAN_center_value, mc_th_CMPAN_f);
if( mcchk == true )
{
cnt_mclock_CMPAN_f += 1;
}
else
{ if( cnt_mclock_CMPAN_f > 0 )
{
cnt_mclock_CMPAN_f -= 1;
}
else
{
cnt_mclock_CMPAN_f = 0;
}
}
if( cnt_mclock_CMPAN_f > motor_lock_chk_cnt )
{
flg_mclock_CMPAN = 1;
rts = true; // LOCK
}
else
{
flg_mclock_CMPAN = 0;
rts = false; // LOCK
}
}
else
{
mcchk = chk_motor_lock( mctr1_m1c.read()*100.0f, m_CMPAN_center_value, mc_th_CMPAN_r);
if( mcchk == true )
{
cnt_mclock_CMPAN_r += 1;
}
else
{ if( cnt_mclock_CMPAN_r > 0 )
{
cnt_mclock_CMPAN_r -= 1;
}
else
{
cnt_mclock_CMPAN_r = 0;
}
}
if( cnt_mclock_CMPAN_r > motor_lock_chk_cnt )
{
flg_mclock_CMPAN = 1;
rts = true; // LOCK
}
else
{
flg_mclock_CMPAN = 0;
rts = false; // LOCK
}
}
}
// Check Tilt
else if( motor_number == MOTOR_CTILT )
{
if( motor_dir == MOTOR_DIR_FWD )
{
mcchk = chk_motor_lock( mctr1_m2c.read()*100.0f, m_CTILT_center_value, mc_th_CTILT_f);
if( mcchk == true )
{
cnt_mclock_CTILT_f += 1;
}
else
{ if( cnt_mclock_CTILT_f > 0 )
{
cnt_mclock_CTILT_f -= 1;
}
else
{
cnt_mclock_CTILT_f = 0;
}
}
if( cnt_mclock_CTILT_f > motor_lock_chk_cnt )
{
flg_mclock_CTILT = 1;
rts = true; // LOCK
}
else
{
flg_mclock_CTILT = 0;
rts = false; // LOCK
}
}
else
{
mcchk = chk_motor_lock( mctr1_m2c.read()*100.0f, m_CTILT_center_value, mc_th_CTILT_r);
if( mcchk == true )
{
cnt_mclock_CTILT_r += 1;
}
else
{ if( cnt_mclock_CTILT_r > 0 )
{
cnt_mclock_CTILT_r -= 1;
}
else
{
cnt_mclock_CTILT_r = 0;
}
}
if( cnt_mclock_CTILT_r > motor_lock_chk_cnt )
{
flg_mclock_CTILT = 1;
rts = true; // LOCK
}
else
{
flg_mclock_CTILT = 0;
rts = false; // LOCK
}
}
}
return rts;
}
bool mcchk::chk_motor_lock(
float motor_current, // motor current
float motor_center_value, // motor current center value
int mc_threshold // motor current threshold
){
// int32_t mc_abs_pct;
_cnt_now = motor_current;
_cnt_center = motor_center_value;
_cnt_th = mc_threshold;
mc_abs_pct = abs((int32_t)((motor_current - motor_center_value)*100.0f));
if( mc_abs_pct > mc_threshold )
{
return true; // Motor current is over threshold.
}
else
{
return false; // Motor current isn't over threshold.
}
}