2018.08.03 1st commit of demo main res ctrl
P1_1Y_main.cpp
- Committer:
- sayzyas
- Date:
- 2018-08-03
- Revision:
- 1:85e8e2c8f283
- Parent:
- 0:f8373bf202a6
File content as of revision 1:85e8e2c8f283:
/**********************************************************
* Project: B2 (1F-1)
* Title: CrExp B2 Motor Ctrl Main
* Target: LPCXpresso824-Max
* Author: zinsor
* Date(Latest update) 2015.12.21(Mon)
* --------------------------------------------------------
* Article
* Notification: Moving and Fix Winch rotation direction
* is opposit.
*
* --------------------------------------------------------
*
* LPCXpresso 824-MAX
* +---------USB---------+
* | |
* | |
* | |
* | |
* | | SCL P0_10 D15 -> IIC SCL
* | ## ### ## | SDA P0_11 D14 -> IIC SDA
* | # # # # # # | AVDD
* N/A | # # # # # | GND
* +3V3 | ## # # # | SCK P0_24 D13
* NRST | # # # # # | MISO P0_25 D12
* +3V3 | # # # # ###### | MOSI P0_26 D11 -> Resolver B
* +5V | ## ##### # | SSEL P0_15 D10 -> Resolver A
* GND | | P0_27 D9
* GND | | P0_13 D8
* N/A | | P0_17 D7
* | | P0_16 D6
* A0 P0_6 | | PWM P0_28 D5
* A1 P0_14 | | PWM P0_18 D4
* A2 P0_23 | | PWM P0_12 D3
* A3 P0_22 | | PWM P0_19 D2
* A4 P0_21 | | TX P0_4 D1
* A5 P0_20 | | RX P0_0 D0
* +---------------------+
*
***************************************/
#include "mbed.h"
//#include "rtos.h"
#include "QEI.h"
#include "common.h"
#include <math.h>
#include "mcchk.h"
// Hardware setting
Serial pc(USBTX, USBRX); // tx, rx
#ifdef FFWinchPhaseSetting // For Fix Fallong Winch
QEI wheel( P0_26, P0_15, NC, ROTATE_PER_RESOLUTION, QEI::X2_ENCODING );
#else //For Falling Position Moving Winch
QEI wheel( P0_15, P0_26, NC, ROTATE_PER_RESOLUTION, QEI::X2_ENCODING );
#endif // FFWinchPhaseSetting
/*
Dram r = 60mm
Cable fai = 3
(60+3)*3.14 = 197.82mm ==> 2^12*4 = 4096 * 4 = 16384 pulse
1(mm) = 82.82(pulse)
0.01208(mm) = 1(pulse)
*/
DigitalOut led1(LED1); // Red
DigitalOut led2(LED2); // Green
DigitalOut led3(LED3); // Blue
I2CSlave slave(P0_11, P0_10); //I2C SDA SCL
void led_demo(){
int i;
for( i = 0; i < 20; i++ ) {
led1 = LED_ON;
led2 = LED_OFF;
led3 = LED_OFF;
wait_ms(20);
led1 = LED_OFF;
led2 = LED_OFF;
led3 = LED_OFF;
wait_ms(20);
led1 = LED_OFF;
led2 = LED_ON;
led3 = LED_OFF;
wait_ms(20);
led1 = LED_OFF;
led2 = LED_OFF;
led3 = LED_OFF;
wait_ms(20);
led1 = LED_OFF;
led2 = LED_OFF;
led3 = LED_ON;
wait_ms(20);
led1 = LED_OFF;
led2 = LED_OFF;
led3 = LED_OFF;
wait_ms(20);
}
// wait_ms(3000);
}
// ========================================================================
// Main Function
// ========================================================================
int main() {
char buf[12]; // command buffer
char msg[9];
int pulse;
double distance_d = 0.0f;
int16_t distance;
int16_t position_offset = 0;;
uint16_t dram_diameter;
uint16_t dis_correct_value;
uint8_t rresolution;
int tmp;
mcchk mcc;
pc.baud(115200);
slave.address(I2C_ADDRESS_RESOLVER);
led_demo();
DEBUG_PRINT_L0("\r\n");
DEBUG_PRINT_L0("Bd4> +--------------------------------------\r\n");
DEBUG_PRINT_L0("Bd4> | B2 CrExp Resolver Pulse Counter Main \r\n");
DEBUG_PRINT_L0("Bd4> | Letest update: %s\r\n", LatestUpDate);
DEBUG_PRINT_L0("Bd4> | Program Revision: %s\r\n", ProgramRevision);
DEBUG_PRINT_L0("Bd4> | Author: %s\r\n", Author);
DEBUG_PRINT_L0("Bd4> | Copyright(C) 2015 %s Allright Reserved\r\n", Company);
DEBUG_PRINT_L0("Bd4> +--------------------------------------\r\n");
wheel.reset();
while(1){
led2 = LED_OFF;
led3 = LED_OFF;
int i = slave.receive();
slave.read(buf, NumberOfI2CCommand);
switch (i) {
case I2CSlave::NoData:
// DEBUG_PRINT_L1("the slave has not been addressed\r\n");
// read_motor_current(2);
break;
//
// Slave(this) <== Master
//
//-----------------------------------------------------------------
// Master is reading data from client
//-----------------------------------------------------------------
case I2CSlave::ReadAddressed:
/* Master is reading winch current position here */
pulse = wheel.getPulses();
/* Distance calculation */
distance_d = ( pulse * ( (double)( ((double)dram_diameter/(double)100) * (double)PAI / (pow(2.0, (double)rresolution)*4 ) ) ) );
distance = (int16_t)(distance_d * (double)((double)dis_correct_value/(double)10000));
distance += position_offset;
DEBUG_PRINT_L2("Bd4> PULSE: %07d, ", pulse);
DEBUG_PRINT_L2("DISTANCE(OFFSET): %04d(%4d) mm", distance, position_offset);
msg[0] = 0x12; // Dummy data for data check
msg[1] = distance & 0xFF;
msg[2] = (distance >> 8)&0xFF;
// msg[3] = ... : was set by get the command "G".
msg[8] = 0x34; // Dummy data
slave.write(msg, 9); // Includes null char
tmp = (msg[2] < 8)&0xFF00 | msg[1]&0xFF;
DEBUG_PRINT_L2("\tSend data : %04d(%02x,%02x)\r\n", tmp, msg[1], msg[0]);
led3 = LED_ON;
break;
case I2CSlave::WriteGeneral:
DEBUG_PRINT_L1("Bd4> the master is writing to all slave\r\n");
slave.read(buf, NumberOfI2CCommand);
DEBUG_PRINT_L1("Bd4> Read G: %s\r\n", buf);
break;
//
// Master ==> Slave(this)
//
//-----------------------------------------------------------------
// Master is writing data to client
//-----------------------------------------------------------------
case I2CSlave::WriteAddressed:
// *******************************************
// Command list
// ------------
// Z: Wheel reset
// S: Preset current winch position
// R: Set resolver calculation base data
// G: Get specified motor current and stor
// T: Set all motor current thresold
// *******************************************
if( buf[I2C_CP_COMMAND] == 'G' ){ // Get motor current
DEBUG_PRINT_L1("Bd4> i2c Get motor current\r\n");
if ( mcc.rdnchk_motorCurrent( buf[I2C_CP_MOTORNO], buf[I2C_CP_M_DIR], 5 ) == true )
{
msg[3] = 1;
//DEBUG_PRINT_L1("Bd4> Motor LC: pct=%03d, now=%f, center=%f, th=%d ###LOCK###\r\n", mcc.mc_abs_pct, mcc._cnt_now, mcc._cnt_center, mcc._cnt_th);
DEBUG_PRINT_L1("Bd4> Motor LC: pct=%03d, now=%f, center=%f, th=%d, %d, %d, %d, %d ###LOCK###\r\n", mcc.mc_abs_pct, mcc._cnt_now, mcc._cnt_center, mcc._cnt_th,
mcc.cnt_mclock_LBTFM_f,
mcc.cnt_mclock_LBTFM_r,
mcc.cnt_mclock_RFTFM_f,
mcc.cnt_mclock_RFTFM_r
);
}
else
{
msg[3] = 0;
// DEBUG_PRINT_L1("Bd4> Motor LC: pct=%03d, now=%f, center=%f, th=%d\r\n", mcc.mc_abs_pct, mcc._cnt_now, mcc._cnt_center, mcc._cnt_th);
DEBUG_PRINT_L1("Bd4> Motor LC: pct=%03d, now=%f, center=%f, th=%d, %d, %d, %d, %d\r\n", mcc.mc_abs_pct, mcc._cnt_now, mcc._cnt_center, mcc._cnt_th,
mcc.cnt_mclock_LBTFM_f,
mcc.cnt_mclock_LBTFM_r,
mcc.cnt_mclock_RFTFM_f,
mcc.cnt_mclock_RFTFM_r
);
}
}
else if( buf[I2C_CP_COMMAND] == 'T' ){ // Set motor threshold
DEBUG_PRINT_L1("Bd4> i2c Set motor threshold\r\n");
// LB CRW
if( buf[I2C_CP_MOTORNO] == MOTOR_LBCRW )
{
if( buf[I2C_CP_M_DIR] == MOTOR_DIR_FWD )
{
mcc.mc_th_LBCRW_f = ( buf[I2C_CP_M_CNTTH_U] ) << 8 | buf[I2C_CP_M_CNTTH_L];
DEBUG_PRINT_L1("Bd4> motor th (LBCRW F) : %d\r\n", mcc.mc_th_LBCRW_f);
}
else
{
mcc.mc_th_LBCRW_r = ( buf[I2C_CP_M_CNTTH_U] ) << 8 | buf[I2C_CP_M_CNTTH_L];
DEBUG_PRINT_L1("Bd4> motor th (LBCRW R) : %d\r\n", mcc.mc_th_LBCRW_r);
}
}
// RF CRW
else if( buf[I2C_CP_MOTORNO] == MOTOR_RFCRW )
{
if( buf[I2C_CP_M_DIR] == MOTOR_DIR_FWD )
{
mcc.mc_th_RFCRW_f = ( buf[I2C_CP_M_CNTTH_U] ) << 8 | buf[I2C_CP_M_CNTTH_L];
DEBUG_PRINT_L1("Bd4> motor th (RFCRW F) : %d\r\n", mcc.mc_th_RFCRW_f);
}
else
{
mcc.mc_th_RFCRW_r = ( buf[I2C_CP_M_CNTTH_U] ) << 8 | buf[I2C_CP_M_CNTTH_L];
DEBUG_PRINT_L1("Bd4> motor th (RFCRW R) : %d\r\n", mcc.mc_th_RFCRW_r);
}
}
// LB TFM
else if( buf[I2C_CP_MOTORNO] == MOTOR_LBTFM )
{
if( buf[I2C_CP_M_DIR] == MOTOR_DIR_FWD )
{
mcc.mc_th_LBTFM_f = ( buf[I2C_CP_M_CNTTH_U] ) << 8 | buf[I2C_CP_M_CNTTH_L];
DEBUG_PRINT_L1("Bd4> motor th (LBTFM F) : %d\r\n", mcc.mc_th_LBTFM_f);
}
else
{
mcc.mc_th_LBTFM_r = ( buf[I2C_CP_M_CNTTH_U] ) << 8 | buf[I2C_CP_M_CNTTH_L];
DEBUG_PRINT_L1("Bd4> motor th (LBTFM R) : %d\r\n", mcc.mc_th_LBTFM_r);
}
}
// RF TFM
else if( buf[I2C_CP_MOTORNO] == MOTOR_RFTFM )
{
if( buf[I2C_CP_M_DIR] == MOTOR_DIR_FWD )
{
mcc.mc_th_RFTFM_f = ( buf[I2C_CP_M_CNTTH_U] ) << 8 | buf[I2C_CP_M_CNTTH_L];
DEBUG_PRINT_L1("Bd4> motor th (RFTFM F) : %d\r\n", mcc.mc_th_RFTFM_f);
}
else
{
mcc.mc_th_RFTFM_r = ( buf[I2C_CP_M_CNTTH_U] ) << 8 | buf[I2C_CP_M_CNTTH_L];
DEBUG_PRINT_L1("Bd4> motor th (RFTFM R) : %d\r\n", mcc.mc_th_RFTFM_r);
}
}
// WINCH
else if( buf[I2C_CP_MOTORNO] == MOTOR_WINCH )
{
if( buf[I2C_CP_M_DIR] == MOTOR_DIR_FWD )
{
mcc.mc_th_WINCH_f = ( buf[I2C_CP_M_CNTTH_U] ) << 8 | buf[I2C_CP_M_CNTTH_L];
DEBUG_PRINT_L1("Bd4> motor th (WINCH F) : %d\r\n", mcc.mc_th_WINCH_f);
}
else
{
mcc.mc_th_WINCH_r = ( buf[I2C_CP_M_CNTTH_U] ) << 8 | buf[I2C_CP_M_CNTTH_L];
DEBUG_PRINT_L1("Bd4> motor th (WINCH R) : %d\r\n", mcc.mc_th_WINCH_r);
}
}
// PAN
else if( buf[I2C_CP_MOTORNO] == MOTOR_CMPAN )
{
if( buf[I2C_CP_M_DIR] == MOTOR_DIR_FWD )
{
mcc.mc_th_CMPAN_f = ( buf[I2C_CP_M_CNTTH_U] ) << 8 | buf[I2C_CP_M_CNTTH_L];
DEBUG_PRINT_L1("Bd4> motor th (CPAN F) : %d\r\n", mcc.mc_th_CMPAN_f);
}
else
{
mcc.mc_th_CMPAN_r = ( buf[I2C_CP_M_CNTTH_U] ) << 8 | buf[I2C_CP_M_CNTTH_L];
DEBUG_PRINT_L1("Bd4> motor th (CPAN R) : %d\r\n", mcc.mc_th_CMPAN_r);
}
}
// TILT
else if( buf[I2C_CP_MOTORNO] == MOTOR_CTILT )
{
if( buf[I2C_CP_M_DIR] == MOTOR_DIR_FWD )
{
mcc.mc_th_CTILT_f = ( buf[I2C_CP_M_CNTTH_U] ) << 8 | buf[I2C_CP_M_CNTTH_L];
DEBUG_PRINT_L1("Bd4> motor th (CTILT F) : %d\r\n", mcc.mc_th_CTILT_f);
}
else
{
mcc.mc_th_CTILT_r = ( buf[I2C_CP_M_CNTTH_U] ) << 8 | buf[I2C_CP_M_CNTTH_L];
DEBUG_PRINT_L1("Bd4> motor th (CTILT R) : %d\r\n", mcc.mc_th_CTILT_r);
}
}
}
else if( buf[I2C_CP_COMMAND] == 0x4f ){ // Clear motor current over counters
DEBUG_PRINT_L1("Bd4> i2c Clear motor current over counters\r\n");
mcc.cnt_mclock_LBCRW_f = 0; // motor lock counter
mcc.cnt_mclock_LBCRW_r = 0; // motor lock counter
mcc.cnt_mclock_RFCRW_f = 0; // motor lock counter
mcc.cnt_mclock_RFCRW_r = 0; // motor lock counter
mcc.cnt_mclock_LBTFM_f = 0; // motor lock counter
mcc.cnt_mclock_LBTFM_r = 0; // motor lock counter
mcc.cnt_mclock_RFTFM_f = 0; // motor lock counter
mcc.cnt_mclock_RFTFM_r = 0; // motor lock counter
mcc.cnt_mclock_CMPAN_f = 0; // motor lock counter
mcc.cnt_mclock_CMPAN_r = 0; // motor lock counter
mcc.cnt_mclock_CTILT_f = 0; // motor lock counter
mcc.cnt_mclock_CTILT_r = 0; // motor lock counter
mcc.cnt_mclock_WINCH_f = 0; // motor lock counter
mcc.cnt_mclock_WINCH_r = 0; // motor lock counter
}
else if( buf[I2C_CP_COMMAND] == 0x43 ){ // 'C': Set motor current base
DEBUG_PRINT_L1("Bd4> i2c Set motor current base value\r\n");
mcc.set_init_mc( 300 );
}
else if( buf[I2C_CP_COMMAND] == 'Z'){ // Position reset
DEBUG_PRINT_L1("Bd4> i2c Winch Position reset\r\n");
wheel.reset();
position_offset = 0;
}
// New command 2016.11.17 for customer request
else if( buf[I2C_CP_COMMAND] == 'S'){ // Preset winch pisition <--- B2Demo isn't use this.
DEBUG_PRINT_L1("Bd4> i2c Winch Position preset\r\n");
wheel.reset();
position_offset = 0;
for( int j = 0; j < NumberOfI2CCommand; j++)
pc.printf("%02x ", buf[j]);
pc.printf( "\r\n" );
position_offset = ( buf[ I2C_CP_PRESET_CPOS_UPPER] << 8 );
position_offset |= buf[I2C_CP_PRESET_CPOS_LOWER];
pc.printf("POSITION OFFSET = %d\r\n", position_offset);
}
else if( buf[I2C_CP_COMMAND] == 'R'){ // Set resolver calculation base parameter.
DEBUG_PRINT_L1("Bd4> i2c Set resolver calc base data\r\n");
for( int j = 0; j < NumberOfI2CCommand; j++)
{
pc.printf("%02x ", buf[j]);
}
pc.printf( "\r\n" );
dram_diameter = ( buf[I2C_CP_WDRAM_DIA_UPPER] << 8 );
dram_diameter |= buf[I2C_CP_WDRAM_DIA_LOWER];
dis_correct_value = ( buf[I2C_CP_CCABLE_DIA_UPPER] << 8 );
dis_correct_value |= buf[I2C_CP_CCABLE_DIA_LOWER];
rresolution = buf[I2C_CP_RESOLVER_RESO];
DEBUG_PRINT_L1("Bd4> ===========================================\r\n");
DEBUG_PRINT_L1("Bd4> Dram Diameter : %d\t(mm)\r\n", dram_diameter);
DEBUG_PRINT_L1("Bd4> CCable Diameter : %d\t(mm)\r\n", dis_correct_value);
DEBUG_PRINT_L1("Bd4> Resolver Resolution : %d\t(bit)\r\n", rresolution);
DEBUG_PRINT_L1("Bd4> -------------------------------------------\r\n", rresolution);
DEBUG_PRINT_L1("Bd4> Real Diameter : %d\t(mm)\r\n", (dram_diameter+dis_correct_value));
DEBUG_PRINT_L1("Bd4> Rotation Pulse / 1round : %d\t(pulse)\r\n", (int)(pow(2.0, (double)rresolution)*4));
DEBUG_PRINT_L1("Bd4> Distance / 1pulse : %lf\t(mm)\r\n", (double)( ((dram_diameter+dis_correct_value)/100) * PAI / (pow(2.0, (double)rresolution)*4 ) ) );
DEBUG_PRINT_L1("Bd4> ===========================================\r\n");
pulse = wheel.getPulses();
//pulse += 1;
DEBUG_PRINT_L1("Bd4> PULSE: %07d, ", pulse);
DEBUG_PRINT_L1("DISTANCE: %04d (mm)\r\n", (int)( pulse * ( (double)( ((dram_diameter+dis_correct_value)/100) * PAI / (pow(2.0, (double)rresolution)*4 ) ) ) ) );
DEBUG_PRINT_L1("Bd4> ---------------------------------------\r\n");
led2 = LED_ON;
}
break;
}
// Following instruction should do on thread, because this time of operation is lottle longer. !!!
/*
DEBUG_PRINT_L0("Bd4> %05f", mcc.rd_motorCurrent(11)); DEBUG_PRINT_L0("\t");
DEBUG_PRINT_L0("%05f", mcc.rd_motorCurrent(12)); DEBUG_PRINT_L0("\t");
DEBUG_PRINT_L0("%05f", mcc.rd_motorCurrent(21)); DEBUG_PRINT_L0("\t");
DEBUG_PRINT_L0("%05f", mcc.rd_motorCurrent(22)); DEBUG_PRINT_L0("\t");
DEBUG_PRINT_L0("%05f", mcc.rd_motorCurrent(31)); DEBUG_PRINT_L0("\t");
DEBUG_PRINT_L0("%05f", mcc.rd_motorCurrent(32)); DEBUG_PRINT_L0("\r\n");
*/
//Thread::wait(1);
wait_ms(1);
}
}