library for movement of Servo 9g
Dependents: CAN_Simple_Publisher CAN_Pub_actuator
MS9g_move_sin.cpp
00001 #include "MS9g_move_sin.h" 00002 //class Servo_9g 00003 Servo_9g::Servo_9g(){} 00004 Servo_9g::Servo_9g (PinName Pin){ 00005 Servo = new PwmOut(Pin); 00006 Servo->period_ms(20); 00007 } 00008 00009 Servo_9g::~Servo_9g(){ 00010 delete Servo; 00011 } 00012 //end of class Servo_9g 00013 00014 //class Servo_9g_Move 00015 Servo_9g_Move::Servo_9g_Move():Servo_9g(){} 00016 Servo_9g_Move::Servo_9g_Move(PinName Pin):Servo_9g(Pin){} 00017 Servo_9g_Move::~Servo_9g_Move(){} 00018 00019 void Servo_9g_Move::Move (float a){ 00020 Servo_9g::Servo->write(a * val); // duty-cycle, perсents 0..1 00021 } 00022 00023 void Servo_9g_Move::NextSin(){ 00024 i += speed_inc; 00025 if (i > 2) i = 0; 00026 f = (sin(i * pi) + 1.0) / 2 + 1; //1..2 00027 } 00028 00029 void Servo_9g_Move::CalCnMove(){ 00030 Move((float)f); 00031 NextSin(); 00032 } 00033 00034 void Servo_9g_Move::StartMoveSin(){ 00035 timer.attach(this, &Servo_9g_Move::CalCnMove, val); //sine period, sec 00036 } 00037 //end of class Servo_9g_Move 00038 00039 //class Servo_9g_CAN 00040 Servo_9g_CAN::Servo_9g_CAN(PinName rd, PinName td) : 00041 Servo_9g_Move(), 00042 can(rd, td) 00043 { 00044 00045 } 00046 Servo_9g_CAN::Servo_9g_CAN(PinName rd, PinName td, int hz) : 00047 Servo_9g_Move(), 00048 can(rd, td, hz) 00049 { 00050 00051 } 00052 00053 Servo_9g_CAN::Servo_9g_CAN(PinName servo_pwm, PinName rd, PinName td) : 00054 Servo_9g_Move(servo_pwm), 00055 can(rd, td) 00056 { 00057 CANMessage msg; 00058 } 00059 00060 Servo_9g_CAN::Servo_9g_CAN(PinName servo_pwm, PinName rd, PinName td, int hz) : 00061 Servo_9g_Move(servo_pwm), 00062 can(rd, td, hz) 00063 { 00064 CANMessage msg; 00065 } 00066 00067 Servo_9g_CAN::~Servo_9g_CAN(){ 00068 00069 } 00070 00071 void Servo_9g_CAN::SendNextSin(){ 00072 NextSin(); 00073 float send = static_cast<float>(f); 00074 can.write(CANMessage(2, (char*)&send, sizeof(send))); 00075 } 00076 00077 bool Servo_9g_CAN::ReceiveServo(){ 00078 if(can.read(msg)){ 00079 if (msg.id == 2){ 00080 float rec; 00081 memcpy(&rec, msg.data, sizeof(rec)); 00082 Move(rec); 00083 return true; 00084 } 00085 } 00086 return false; 00087 } 00088 void Servo_9g_CAN::SendSin(){ 00089 timer.attach(this, &Servo_9g_CAN::SendNextSin, val); 00090 00091 } 00092 void Servo_9g_CAN::sendPosition(char id, float pos){ 00093 can.write(CANMessage(id, (char*)&pos, sizeof(pos))); 00094 } 00095 //end of class Servo_9g_CAN
Generated on Wed Aug 10 2022 09:29:03 by
1.7.2