Sho Yama
/
LV8548_ON_MD_Modlle_kit_DCMtr_And_STEPMtr
LV8548 Motor Driver Stepper Motor Dc MOtor
Diff: Main.cpp
- Revision:
- 0:82bafa3985c2
- Child:
- 1:f62c3257d673
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Main.cpp Fri Nov 16 16:49:36 2018 +0000 @@ -0,0 +1,431 @@ +#include "mbed.h" +#include "LV8548.h" + +#define DC_ID "LV8548DC_Ver.2.0.0\n" +#define STEP_ID "LV8548Step_Ver.2.0.0\n" + +//#define DEFAULT_BAUDRATE (9600) +#define DEFAULT_BAUDRATE (19200) +//#define DEFAULT_BAUDRATE (115200) + + +#define _USE_DEBUG_ (0) +enum DCSerialCommandType { + SRMES_GET_ID = 0x03, // 3 + SRMES_POLLING_ID = 0x04, // 4 +//// For Dc Motor Control //////// + SRMES_CTL_VOLTAGE = 'A', // 'A' + SRMES_ROTATION = 'D', // 'D' + SRMES_PWM_FREQSET = 'g', // 'g' + SRMES_START_FLAG = 'h', // 'h' +//// For Stepper Motor Control //////// + SRMES_STEP_ANGLE = 'i', // 'i' + SRMES_ROTATION_ANGLE = 'j', // 'j' + SRMES_ROTATION_TIME = 'k', // 'k' + SRMES_ROTATION_STEP = 'l', // 'l' + SRMES_ROTATION_STOP = 'n', // 'n' + SRMES_ROTATION_FREE = 'o', // 'o' +}; +//// For Dc Motor + + // Segment definition of serial message + typedef struct + { + uint8_t motorNo; + uint8_t duty; + } __attribute__ ((packed)) SrMesDivCtlVoltage; + + typedef struct + { + uint8_t motorNo; + DriverPwmOut select; + } __attribute__ ((packed)) SrMesDivStartFlag; + + typedef struct + { + uint8_t motorNo; + DriverPwmMode select; + } __attribute__ ((packed)) SrMesDivRotation; + + typedef struct + { + uint8_t hz; + } __attribute__ ((packed)) SrMesDivPwmFreqset; + + + +SrMesDivCtlVoltage DcMtrvoltValue ; +SrMesDivRotation DcMtrrotationValue; +SrMesDivStartFlag DcMtrstartFlag; +SrMesDivPwmFreqset DcMtrfreqValue; + +/// For Stepper Motor + typedef struct + { + uint16_t angle; + } __attribute__ ((packed)) SrMesDivSetStepAngle; + + typedef struct + { + uint16_t frequency; + uint16_t deg; + uint8_t rotation; + uint8_t exp; + } __attribute__ ((packed)) SrMesDivRotationDeg; + + typedef struct + { + uint16_t frequency; + uint16_t time; + uint8_t rotation; + uint8_t exp; + } __attribute__ ((packed)) SrMesDivRotationTime; + + typedef struct + { + uint16_t frequency; + uint16_t step; + uint8_t rotation; + uint8_t exp; + } __attribute__ ((packed)) SrMesDivRotationStep; + + + +SrMesDivSetStepAngle StepMtrAngleValue; +SrMesDivRotationDeg StepMtrDegValue; +SrMesDivRotationTime StepMtrTimeValue; +SrMesDivRotationStep StepMtrStepValue; + + + +/* pc の仮想ポートをwindows softで開ける */ +Serial pc(USBTX, USBRX); // tx, rx +#if _USE_DEBUG_ +Serial uart(D1, D0); // tx, rx +#endif +//#if _USE_DEBUG_ +//Serial uart(USBTX, USBRX); // tx, rx +//#endif +//Serial pc(D1, D0); // tx, rx + +DigitalOut myled(LED1); +#if USE_DC_MOTOR +LV8548 MOTORDriver( D3,D5,D10,D11,DCMOTOR); // SELECT DCMOTOR +#else +LV8548 MOTORDriver( D3,D5,D10,D11,STEPERMOTOR); // STEP MOTOR +#endif + +DigitalOut TEST(D12); +Ticker Timer500; +Ticker Timer1ms; +uint8_t LedImage; +uint8_t CommandTimer; + +#define SBUFMAX 64 +volatile uint8_t SerialBuffer[SBUFMAX]; +volatile uint8_t RingBuffer[256]; +volatile uint8_t RingReadpoint; +volatile uint8_t RingWritepoint; + +/*******************************************/ +/* AA */ +/* AAAA ii ii */ +/* AA AA sssss cccc */ +/* AAAAAA ss cc iii iii */ +/* AA AA ssss cc ii ii */ +/* AA AA ss cc ii ii */ +/* AA AA sssss cccc iiii iiii */ +/* */ +/*******************************************/ + +uint8_t Ascii(uint8_t Data) +{ + switch(Data & 0xf) + { + case 0: return('0'); + case 1: return('1'); + case 2: return('2'); + case 3: return('3'); + case 4: return('4'); + case 5: return('5'); + case 6: return('6'); + case 7: return('7'); + case 8: return('8'); + case 9: return('9'); + case 0xA: return('A'); + case 0xB: return('B'); + case 0xC: return('C'); + case 0xD: return('D'); + case 0xE: return('E'); + case 0xF: return('F'); + } + return (0); +} +/***************************************************************************************************************************/ +/* UU UU RRRRR IIII */ +/* UU UU tt RR RR ii II */ +/* UU UU aaaa rrrrr tttttt RR RR eeee cccc vv vv eeee II rrrrr qqqqq */ +/* UU UU aa rr rr tt RRRRR ee ee cc iii vv vv ee ee II rr rr qq qq */ +/* UU UU aaaaa rr tt RRRR eeeeee cc ii vv vv eeeeee II rr qq qq */ +/* UU UU aa aa rr tt RR RR ee cc ii vvvv ee II rr qqqqq */ +/* UUUU aaaaa rr ttt RR RR eeee cccc iiii vv eeee IIII rr qq */ +/* qq */ +/***************************************************************************************************************************/ +void Read_Rx(void) +{ + RingWritepoint++; + RingBuffer[RingWritepoint] = pc.getc(); + CommandTimer = 2; // 2(最小1)ms後にコマンド処理 +} +/***********************************************************************************************************/ +/* CCCC PPPPP */ +/* CC CC dd PP PP */ +/* CC oooo mm mm mm mm nnnnn aaaa dd PP PP aaaa rrrrr sssss eeee */ +/* CC oo oo mmmmmmm mmmmmmm nn nn aa ddddd PPPPP aa rr rr ss ee ee */ +/* CC oo oo mmmmmmm mmmmmmm nn nn aaaaa dd dd PP aaaaa rr ssss eeeeee */ +/* CC CC oo oo mm m mm mm m mm nn nn aa aa dd dd PP aa aa rr ss ee */ +/* CCCC oooo mm mm mm mm nn nn aaaaa ddddd PP aaaaa rr sssss eeee */ +/* */ +/***********************************************************************************************************/ +void SerialRead(void) +{ + int i = 0; + if(CommandTimer ) return; /* 1ms 以上データ無しが安定してから読む */ + + + SerialBuffer[0] = '\0'; + while( RingWritepoint != RingReadpoint) + { + RingReadpoint++; + SerialBuffer[i] = RingBuffer[RingReadpoint]; +#if _USE_DEBUG_ + uart.putc(Ascii(SerialBuffer[i] >> 4)) ; + uart.putc(Ascii(SerialBuffer[i] >> 0)) ; + uart.putc(0x20); +#endif + i++; + if(i >= (SBUFMAX-1)) + { +#if _USE_DEBUG_ + uart.printf("Max over\n"); +#endif + SerialBuffer[i] = '\0'; + + } + continue; + } + + switch( SerialBuffer[0] ) + { + case SRMES_GET_ID: // 3 + { +#if _USE_DEBUG_ + uart.printf("Send Id\n"); +#endif +#if USE_DC_MOTOR + pc.printf(DC_ID); +#else + pc.printf(STEP_ID); +#endif + } + break; + + case SRMES_POLLING_ID: // 4 + { +#if _USE_DEBUG_ + uart.printf("Polling\n"); +#endif + } + break; +/***************************************************************************************************/ +/* FFFFFF DDDD MM MM */ +/* FF DD DD MMM MMM tt */ +/* FF oooo rrrrr DD DD cccc MMMMMMM oooo tttttt oooo rrrrr */ +/* FFFF oo oo rr rr DD DD cc MM M MM oo oo tt oo oo rr rr */ +/* FF oo oo rr DD DD cc MM MM oo oo tt oo oo rr */ +/* FF oo oo rr DD DD cc MM MM oo oo tt oo oo rr */ +/* FF oooo rr DDDD cccc MM MM oooo ttt oooo rr */ +/* */ +/***************************************************************************************************/ + case SRMES_CTL_VOLTAGE: // 0x41 + { + DcMtrvoltValue = *(SrMesDivCtlVoltage *)SerialBuffer; +#if _USE_DEBUG_ + uart.printf("Voltage Commnad %2x %2x \n",DcMtrvoltValue.motorNo,DcMtrvoltValue.duty); +#endif + MOTORDriver.SetDcPwmDuty(DcMtrvoltValue.motorNo,(float)DcMtrvoltValue.duty/(float)100); + } + break; + + case SRMES_ROTATION: // 0x44 + { + DcMtrrotationValue = *(SrMesDivRotation *)&SerialBuffer[1]; +#if _USE_DEBUG_ + uart.printf("Roteationcommand %2x %2x \n",DcMtrrotationValue.motorNo,DcMtrrotationValue.select); +#endif + MOTORDriver.SetDcPwmMode(DcMtrrotationValue.motorNo,DcMtrrotationValue.select); + } + break; + + case SRMES_PWM_FREQSET: // 0x67 + { + DcMtrfreqValue = *(SrMesDivPwmFreqset *)&SerialBuffer[1]; +#if _USE_DEBUG_ + uart.printf("Freq Hz %2x \n",DcMtrfreqValue.hz); +#endif + switch(DcMtrfreqValue.hz) + { + case 0: MOTORDriver.SetDcPwmFreqency( MOTOR_A, 7813 ); + MOTORDriver.SetDcPwmFreqency( MOTOR_B, 7813 ); + break; + case 1: MOTORDriver.SetDcPwmFreqency( MOTOR_A,977 ); + MOTORDriver.SetDcPwmFreqency( MOTOR_B,977 ); + break; + case 2: MOTORDriver.SetDcPwmFreqency( MOTOR_A,244 ); + MOTORDriver.SetDcPwmFreqency( MOTOR_B,244 ); + break; + case 3: MOTORDriver.SetDcPwmFreqency( MOTOR_A,61 ); + MOTORDriver.SetDcPwmFreqency( MOTOR_B,61 ); + break; + default: break; + } + } + break; + + case SRMES_START_FLAG: // 0x68 + { + DcMtrstartFlag = *(SrMesDivStartFlag *)&SerialBuffer[1]; +#if _USE_DEBUG_ + uart.printf("StartFlag command %2x %2x \n",DcMtrstartFlag.motorNo,DcMtrstartFlag.select); +#endif + MOTORDriver.SetDcOutPut(DcMtrstartFlag.motorNo,DcMtrstartFlag.select); + } + break; +/*******************************************************************************************************************/ +/* FFFFFF SSSS MM MM */ +/* FF SS SS tt MMM MMM tt */ +/* FF oooo rrrrr SS tttttt eeee ppppp MMMMMMM oooo tttttt oooo rrrrr */ +/* FFFF oo oo rr rr SSSS tt ee ee pp pp MM M MM oo oo tt oo oo rr rr */ +/* FF oo oo rr SS tt eeeeee pp pp MM MM oo oo tt oo oo rr */ +/* FF oo oo rr SS SS tt ee ppppp MM MM oo oo tt oo oo rr */ +/* FF oooo rr SSSS ttt eeee pp MM MM oooo ttt oooo rr */ +/* pp */ +/*******************************************************************************************************************/ + case SRMES_STEP_ANGLE: + { + StepMtrAngleValue = *(SrMesDivSetStepAngle *)&SerialBuffer[1]; +#if _USE_DEBUG_ + uart.printf("Step Angle command %4x Req:% \n",StepMtrAngleValue.angle); +#endif + MOTORDriver.SetStepAngle(StepMtrAngleValue.angle/100); + } + break; + + case SRMES_ROTATION_ANGLE: + { + SrMesDivRotationDeg StepMtrDegValue = *(SrMesDivRotationDeg *)&SerialBuffer[1]; +#if _USE_DEBUG_ + uart.printf("Step Deg command \n"); +#endif + MOTORDriver.SetStepDeg(StepMtrDegValue.frequency/10, StepMtrDegValue.deg/100, StepMtrDegValue.rotation, StepMtrDegValue.exp); + } + break; + + case SRMES_ROTATION_TIME: + { + StepMtrTimeValue = *(SrMesDivRotationTime *)&SerialBuffer[1]; +#if _USE_DEBUG_ + uart.printf("Step Time command \n"); +#endif + MOTORDriver.SetStepTime(StepMtrTimeValue.frequency/10, StepMtrTimeValue.time/10, StepMtrTimeValue.rotation, StepMtrTimeValue.exp); + } + break; + + case SRMES_ROTATION_STEP: + { +#if _USE_DEBUG_ + uart.printf("Step Step command \n"); +#endif + StepMtrStepValue = *(SrMesDivRotationStep *)&SerialBuffer[1]; + MOTORDriver.SetStepStep(StepMtrStepValue.frequency/10, StepMtrStepValue.step/10, StepMtrStepValue.rotation,StepMtrStepValue.exp); + } + break; + + case SRMES_ROTATION_STOP: + { +#if _USE_DEBUG_ + uart.printf("Step Stop command \n"); +#endif + MOTORDriver.SetStepStop(); + } + break; + + case SRMES_ROTATION_FREE: + { +#if _USE_DEBUG_ + uart.printf("Step Free command \n"); +#endif + + MOTORDriver.SetStepFree(); + } + break; + + default: + { +#if _USE_DEBUG_ + // uart.printf("unknown command\n"); +#endif + } + break; + } +} +/***************************************************************************/ +/* TTTTTT PPPPP */ +/* TT ii PP PP */ +/* TT mm mm eeee rrrrr PP PP rrrrr oooo cccc */ +/* TT iii mmmmmmm ee ee rr rr PPPPP rr rr oo oo cc */ +/* TT ii mmmmmmm eeeeee rr PP rr oo oo cc */ +/* TT ii mm m mm ee rr PP rr oo oo cc */ +/* TT iiii mm mm eeee rr PP rr oooo cccc */ +/* */ +/***************************************************************************/ +void Eventtimer500(void) +{ + LedImage = !LedImage; +} + +void Eventtimer1ms(void) +{ + if(CommandTimer) CommandTimer --; +} + +/***********************************/ +/* MM MM */ +/* MMM MMM ii */ +/* MMMMMMM aaaa nnnnn */ +/* MM M MM aa iii nn nn */ +/* MM MM aaaaa ii nn nn */ +/* MM MM aa aa ii nn nn */ +/* MM MM aaaaa iiii nn nn */ +/* */ +/***********************************/ +int main() +{ + RingReadpoint = 0; + RingWritepoint = 0; + CommandTimer = 0; + pc .baud(DEFAULT_BAUDRATE); +#if _USE_DEBUG_ + uart.baud(115200);//DEFAULT_BAUDRATE); + pc.printf("Program Start!\n"); + uart.printf("Program deb Start!\n"); +#endif + Timer500.attach(&Eventtimer500, 0.5); + Timer1ms.attach(&Eventtimer1ms, 0.001); + pc.attach(Read_Rx, Serial::RxIrq); + while(1) { + SerialRead(); + myled = LedImage; // LED is ON + } + +}