Servo center adjustment from the PC.

Dependencies:   mbed

main.cpp

Committer:
TetsuyaKonno
Date:
2016-09-02
Revision:
0:665a5dc5ab89

File content as of revision 0:665a5dc5ab89:

//------------------------------------------------------------------//
//Supported MCU:   RZ/A1H
//File Contents:   Servo center adjustment from the PC
//                                 (GR-PEACH version on the Micon Car)
//Version number:  Ver.1.00
//Date:            2016.01.20
//Copyright:       Renesas Electronics Corporation
//------------------------------------------------------------------//
 
//This program supports the following boards:
//* GR-PEACH(E version)
//* Motor drive board Ver.5
//* Camera module (SC-310)
 
/*
This is a program to check the servo adjustment of the micon car using keys.
The action described takes place when one of the following keys is pressed.
 
Z key: servo offset value +1
X key: servo offset value -1
A key: servo offset value +10
S key: servo offset value -10
*/
 
//Include
//------------------------------------------------------------------//
#include "mbed.h"
#include "iodefine.h"
 
//Define
//------------------------------------------------------------------//
//Servo PWM cycle
#define     SERVO_PWM_CYCLE     33332   /* SERVO PWM period         */
                                        /* 16ms   P0φ/16 = 0.48us   */
#define     SERVO_CENTER        3124    /* 1.5ms / 0.48us - 1 = 3124*/
#define     HANDLE_STEP         18      /* 1 degree value           */
 
//Degrees
#define     DEGREEES_MAX        4791    /* Left  90° 2.3ms / 0.48us = 4791 */
#define     DEGREEES_MIN        1485    /* Right 90° 0.7ms / 0.48us = 1458 */
 
//LED Color on GR-PEACH
#define     LED_OFF             0x00
#define     LED_RED             0x01
#define     LED_GREEN           0x02
#define     LED_YELLOW          0x03
#define     LED_BLUE            0x04
#define     LED_PURPLE          0x05
#define     LED_SKYBLUE         0x06
#define     LED_WHITE           0x07
 
//Status
#define     RUN                 0x00
#define     STOP                0x01
#define     ERROR               0xff
 
//Constructor
//------------------------------------------------------------------//
Ticker      interrput;
Serial      pc(USBTX, USBRX);
DigitalOut  LED_R(P6_13);
DigitalOut  LED_G(P6_14);
DigitalOut  LED_B(P6_15);
 
//Prototype
//------------------------------------------------------------------//
void init_MTU2_PWM_Servo( void );       /* Initialize PWM functions */
void intTimer( void );                  /* Interrupt fanction       */
void timer( unsigned long timer_set );
void handle( int angle );
void led_status_process( int set );     /* Function for only interrupt */
void led_rgb(int led);
 
//Globle
//------------------------------------------------------------------//
volatile int            status;         /* Status                   */
volatile unsigned int   servo_offset;   /* servo offset             */
 
//Main
//------------------------------------------------------------------//
int main( void )
{
    int     i;
    char    c;
 
    /* Initialize MCU functions */
    init_MTU2_PWM_Servo();
    interrput.attach(&intTimer, 0.001);
    pc.baud(9600);
 
    /* Initialize Micon Car state */
    servo_offset = SERVO_CENTER;
 
    pc.printf(
        "Servo center adjustment from the PC\n\r"
        "(Micon Car on GR-PEACH version)\n\r"
        "\n\r"
        "'Z' key   : Center Value +1\n\r"
        "'X' key   : Center Value -1\n\r"
        "\n\r"
        "'A' key   : Center Value +10\n\r"
        "'S' key   : Center Value -10\n\r"
        "\n\r"
    );
 
    pc.printf( "%5d\r", servo_offset );
 
    while( 1 ) {
        status = RUN;
 
        MTU2TGRD_0 = servo_offset;
 
        i = pc.scanf( "%c", &c );
        if( i == 1 ) {
            switch( c ) {
            case 'Z':
            case 'z':
                servo_offset += 1;
                if( servo_offset > DEGREEES_MAX ) servo_offset = DEGREEES_MAX;
                pc.printf( "%5d\r", servo_offset );
                break;
 
            case 'A':
            case 'a':
                servo_offset += 10;
                if( servo_offset > DEGREEES_MAX ) servo_offset = DEGREEES_MAX;
                pc.printf( "%5d\r", servo_offset );
                break;
 
            case 'X':
            case 'x':
                servo_offset -= 1;
                if( servo_offset < DEGREEES_MIN ) servo_offset = DEGREEES_MIN;
                pc.printf( "%5d\r", servo_offset );
                break;
 
            case 'S':
            case 's':
                servo_offset -= 10;
                if( servo_offset < DEGREEES_MIN ) servo_offset = DEGREEES_MIN;
                pc.printf( "%5d\r", servo_offset );
                break;
 
            default:
                break;
            }
        }
    }
}
 
//Initialize MTU2 PWM functions
//------------------------------------------------------------------//
//MTU2_0
//PWM mode 1
//TIOC0A(P4_0) :Servo-motor
//------------------------------------------------------------------//
void init_MTU2_PWM_Servo( void )
{
    /* Port setting for S/W I/O Contorol */
    /* alternative mode     */
 
    /* MTU2_0 (P4_0)        */
    GPIOPBDC4   = 0x0000;               /* Bidirection mode disabled*/
    GPIOPFCAE4 &= 0xfffe;               /* The alternative function of a pin */
    GPIOPFCE4  &= 0xfffe;               /* The alternative function of a pin */
    GPIOPFC4   |= 0x0001;               /* The alternative function of a pin */
                                        /* 2nd alternative function/output   */
    GPIOP4     &= 0xfffe;               /*                          */
    GPIOPM4    &= 0xfffe;               /* p4_0:output              */
    GPIOPMC4   |= 0x0001;               /* P4_0:double              */
 
    /* Mosule stop 33(MTU2) canceling */
    CPGSTBCR3  &= 0xf7;
 
    /* MTU2_0 (Motor PWM) */
    MTU2TCR_0   = 0x22;                 /* TCNT Clear(TGRA), P0φ/16 */
    MTU2TIORH_0 = 0x52;                 /* TGRA L>H, TGRB H>L       */
    MTU2TMDR_0  = 0x32;                 /* TGRC and TGRD = Buff-mode*/
                                        /* PWM-mode1                */
    MTU2TCNT_0  = 0;                    /* TCNT0 Set 0              */
    MTU2TGRA_0  = MTU2TGRC_0 = SERVO_PWM_CYCLE;
                                        /* PWM-Cycle(16ms)          */
    MTU2TGRB_0  = MTU2TGRD_0 = 0;       /* Servo-motor(P4_0)        */
    MTU2TSTR   |= 0x01;                 /* TCNT_0 Start             */
}
 
//Interrupt Timer
//------------------------------------------------------------------//
void intTimer( void )
{
    led_status_process( status );
}
 
//LED_Status(on GR-PEACH board) Function for only interrupt
//------------------------------------------------------------------//
void led_status_process( int set )
{
    static unsigned long    led_timer;
    int                     led_set;
    int                     on_time;
    int                     off_time;
 
    /* setting */
    switch( set ){
    case RUN:
        led_set  = LED_GREEN;
        on_time  = 500;
        off_time = 500;
        break;
    case STOP:
        led_set  = LED_RED;
        on_time  = 500;
        off_time = 0;
        break;
    default:
        led_set  = LED_OFF;
        on_time  = 0;
        off_time = 1;
        break;
    }
 
    /* Display */
    led_timer++;
    if( led_timer < on_time ) led_rgb( led_set );
    else if( led_timer < ( on_time + off_time ) ) led_rgb( LED_OFF );
    else led_timer = 0;
}
 
//LED_RGB(on GR-PEACH board)
//------------------------------------------------------------------//
void led_rgb(int led)
{
    LED_R = led & 0x1;
    LED_G = (led >> 1 ) & 0x1;
    LED_B = (led >> 2 ) & 0x1;
}
 
//------------------------------------------------------------------//
// End of file
//------------------------------------------------------------------//