Test Program
Dependencies: Classic_PID iC_MU mbed-rtos mbed
Revision 1:1ad84260ff59, committed 2015-05-18
- Comitter:
- ms523
- Date:
- Mon May 18 09:06:07 2015 +0000
- Parent:
- 0:7ce0bc67f60f
- Child:
- 2:dc684c402296
- Commit message:
- current latest code - not revision controlled
Changed in this revision
| ServiceKeyboard.cpp | Show annotated file Show diff for this revision Revisions of this file |
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/ServiceKeyboard.cpp Thu Apr 02 07:35:39 2015 +0000
+++ b/ServiceKeyboard.cpp Mon May 18 09:06:07 2015 +0000
@@ -12,9 +12,6 @@
// Returns the new set point entered via the keyboard
int ServiceKeyboard ()
{
- return(1);
-}
- /*
int key; // The keypress by the user
int value = 0; // The variable to return
@@ -23,9 +20,12 @@
if (key == 'j') {
joystick = !joystick;
if(joystick) {
- pc.printf("\n\rJoystick");
+ pc.printf("\n\r Under Joystick Control");
} else {
- pc.printf("\n\rPC");
+ // Stop both axes
+ PanVelocityPID.setSetPoint(0);
+ TiltVelocityPID.setSetPoint(0);
+ pc.printf("\n\r Under PC Control");
}
}
// Set Velocity for Pan and Tilt here...
@@ -95,4 +95,4 @@
}
}
return(1);
-}*/
\ No newline at end of file
+}
\ No newline at end of file
--- a/main.cpp Thu Apr 02 07:35:39 2015 +0000
+++ b/main.cpp Mon May 18 09:06:07 2015 +0000
@@ -13,22 +13,24 @@
iC_MU TiltPos(p5,p6,p7,p11);
iC_MU pan_ic_mu(p5,p6,p7,p12);
iC_MU PanPos(p5,p6,p7,p13);
-/*
+
+#ifdef TARGET_LPC4088
// Tilt Motor
PwmOut Tilt_Motor_PWM(p27); // Purple wire
DigitalOut Tilt_Motor_Direction(p28); // Yellow wire
-
// Pan Motor
PwmOut Pan_Motor_PWM(p25); // Purple wire
DigitalOut Pan_Motor_Direction(p26); // Yellow wire
-*/
+#endif
+
+#ifdef TARGET_LPC1768
// Tilt Motor
PwmOut Tilt_Motor_PWM(p23); // Purple wire
DigitalOut Tilt_Motor_Direction(p24); // Yellow wire
-
// Pan Motor
PwmOut Pan_Motor_PWM(p21); // Purple wire
DigitalOut Pan_Motor_Direction(p22); // Yellow wire
+#endif
// Joystick stuff
AnalogIn Pan_Joystick(p16);
@@ -39,7 +41,14 @@
// Camera Stuff
Serial Camera(p9,p10);
InterruptIn Switch(p14);
+#ifdef TARGET_LPC4088
+DigitalOut led4(LED1),led2(LED2), led3(LED3), led1(LED4);
+#endif
+#ifdef TARGET_LPC1768
DigitalOut led1(LED1),led2(LED2), led3(LED3), led4(LED4);
+#endif
+
+
#define AUTO 1
#define MANUAL 0
@@ -48,7 +57,7 @@
Classic_PID TiltVelocityPID(0.00018, 0.000006, 0.0, 0.0001); //Kp, ki, kd, kvelff
// Globals
-int ZoomPos = 0;
+int ZoomPos = 10248; // Strat off at max Zoom position to avoid jerks on startup
bool AutofocusFlag = true;
bool ManualfocusFlag = false;
bool Mode = AUTO;
@@ -56,37 +65,13 @@
extern int LastPanPosition;
extern int LastTiltPosition;
-float Pan_JoyStickDem = 0.0;
-float Tilt_JoyStickDem = 0.0;
+float Pan_JoyStickDem = 0.5;
+float Tilt_JoyStickDem = 0.5;
void PanVelocityLoop(void const *args);
void TiltVelocityLoop(void const *args);
-//int ServiceKeyboard();
+int ServiceKeyboard();
void UpdateCamera(float, float);
-/*
-// Code for interrupt on Rx from Camera
-extern "C" void MyUart3Handler(void)
-{
- static int index = 0;
- static char msg[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
-
- // Read the byte and put it into the next available element of the array
- msg[index] = Camera.getc();
-
- // Check to see if that is the end of the message
- if(msg[index] == 0xFF) {
- // Check to see if the response is zoom data i.e. 7 bytes long and starts with 0x90, 0x50...
- if(index == 6 && msg[0] == 0x90 && msg[1] == 0x50) {
- ZoomPos = (msg[2] & 0x0F) << 12;
- ZoomPos += (msg[3] & 0x0F) << 8;
- ZoomPos += (msg[4] & 0x0F) << 4;
- ZoomPos += (msg[5] & 0x0F);
- }
- index = 0;
- } else {
- index++;
- }
-}
void isr_Switch(void)
{
@@ -102,7 +87,7 @@
}
}
}
-}*/
+}
void Anti_Lock(void const *args)
{
@@ -113,15 +98,43 @@
Tilt_Motor_Direction = !Tilt_Motor_Direction.read();
}
+
+// IRQ for Rx camera interrupt
+void UART3_rxInterrupt(void)
+{
+ // Create an array to read the whole message
+ static int index = 0;
+ static char msg[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
+
+ NVIC_DisableIRQ(UART3_IRQn); // Disable the interrupt
+ uint32_t IRR3 = LPC_UART3->IIR;
+ msg[index] = LPC_UART3->RBR; // Read the byte and put it into the next available element of the array
+
+ // Check to see if that is the end of the message
+ if(msg[index] == 0xFF) {
+ // Check to see if the response is zoom data i.e. 7 bytes long and starts with 0x90, 0x50...
+ if(index == 6 && msg[0] == 0x90 && msg[1] == 0x50) {
+ ZoomPos = (msg[2] & 0x0F) << 12;
+ ZoomPos += (msg[3] & 0x0F) << 8;
+ ZoomPos += (msg[4] & 0x0F) << 4;
+ ZoomPos += (msg[5] & 0x0F);
+ }
+ index = 0;
+ } else {
+ index++;
+ }
+
+ led3 = !led3; // Flash the LED
+ NVIC_EnableIRQ(UART3_IRQn); // Enable the interrupt again
+}
+
int main()
{
// Increase the Camera baud rate
Camera.baud(38400);
-/*
- // Set up the Camera Rx Interrupt & enable it
- NVIC_SetVector(UART3_IRQn, (uint32_t)MyUart3Handler);
- NVIC_EnableIRQ(UART3_IRQn);
- LPC_UART3->IER = 0x01;
+
+ // Set up the Camera Rx Interrupt
+ Camera.attach(&UART3_rxInterrupt,Serial::RxIrq);
// Set up the switch to toggle autofocus
Switch.mode(PullDown); //Set the internal pull down resistor
@@ -130,7 +143,7 @@
led1 = 1; // Turn all other LEDs off
led2 = 1;
led3 = 0;
-*/
+
// Set up the Pan motor
Pan_Motor_PWM.period_us(50); // Set PWM to 20 kHz
Pan_Motor_PWM = 1; // Start with motor static
@@ -160,37 +173,63 @@
// Initalise Anti-Lock RtosTimer thread
RtosTimer Anti_Lock_timer(Anti_Lock, osTimerPeriodic);
Anti_Lock_timer.start(1000); // Run at 1Hz
-
+
+ int tiltPosition;
+
while(1) {
- Thread::wait(100);
+ // Check to see if a key has been pressed
+ if(pc.readable()) {
+ ServiceKeyboard();
+ }
+
+ Thread::wait(50);
// Update the Zoom and Focus Demands
UpdateCamera(Zoom_Joystick.read(),Focus_Pot.read());
- Thread::wait(100);
+ //pc.printf("\n\r %d ",tiltPosition);
+ Thread::wait(50);
+
if(joystick) {
- Pan_JoyStickDem = Pan_Joystick.read() - 0.5;
- Tilt_JoyStickDem = Tilt_Joystick.read() - 0.5;
- Pan_JoyStickDem *= 80;
- Tilt_JoyStickDem *= -80;
- // Square the demand for pan joystick profile
- if(Pan_JoyStickDem > 0) {
- Pan_JoyStickDem = Pan_JoyStickDem * Pan_JoyStickDem;
- } else {
- Pan_JoyStickDem = Pan_JoyStickDem * Pan_JoyStickDem * -1;
- }
- // Square the demand for tilt joystick profile
- if(Tilt_JoyStickDem > 0) {
- Tilt_JoyStickDem = Tilt_JoyStickDem * Tilt_JoyStickDem;
- } else {
- Tilt_JoyStickDem = Tilt_JoyStickDem * Tilt_JoyStickDem * -1;
- }
- PanVelocityPID.setSetPoint((int)Pan_JoyStickDem); // Read the joystick and apply the gain
- TiltVelocityPID.setSetPoint((int)Tilt_JoyStickDem); // Read the joystick and apply the gain
- }
-/*
+ // Apply Offset
+ Pan_JoyStickDem = Pan_Joystick.read() - 0.5;
+ Tilt_JoyStickDem = Tilt_Joystick.read() - 0.5;
+ // Square the demand for pan joystick profile & check if neg
+ if(Pan_JoyStickDem > 0) {
+ Pan_JoyStickDem = Pan_JoyStickDem * Pan_JoyStickDem;
+ } else {
+ Pan_JoyStickDem = Pan_JoyStickDem * Pan_JoyStickDem * -1;
+ }
+ // Square the demand for tilt joystick profile & check if neg
+ tiltPosition = TiltPos.ReadPOSITION();
+ if(Tilt_JoyStickDem < 0) {
+ // Check the tilt angle to see if it is within softlimits
+ if(tiltPosition < 170000) {
+ Tilt_JoyStickDem = Tilt_JoyStickDem * Tilt_JoyStickDem;
+ } else {
+ Tilt_JoyStickDem = 0.0;
+ }
+ } else {
+ // Check the tilt angle to see if it is within softlimits
+ if(tiltPosition > 25000) {
+ Tilt_JoyStickDem = Tilt_JoyStickDem * Tilt_JoyStickDem * -1;
+ } else {
+ Tilt_JoyStickDem = 0.0;
+ }
+ }
+ // Apply scalefactor
+ Pan_JoyStickDem *= 20000; // Apply scalefactor
+ Tilt_JoyStickDem *= 20000; // Apply scalefactor
+ // Apply Zoom %
+ Pan_JoyStickDem /= (ZoomPos >> 9) + 1; // Catch divide by zeros
+ Tilt_JoyStickDem /= (ZoomPos >> 9) + 1; // Catch divide by zeros
+
+ PanVelocityPID.setSetPoint((int)Pan_JoyStickDem); // Read the joystick and apply the gain
+ TiltVelocityPID.setSetPoint((int)Tilt_JoyStickDem); // Read the joystick and apply the gain
+ }
+
if(AutofocusFlag) {
// Turn on the autofocus
- led4 = 1; // Turn the LED on to show we are in auto-focus mode
+ led1 = 1; // Turn the LED on to show we are in auto-focus mode
Camera.putc(0x81); // Camera
Camera.putc(0x01); // Turn on auto-focus cmd
Camera.putc(0x04);
@@ -202,7 +241,7 @@
}
if(ManualfocusFlag) {
// Turn on Manual focus
- led4 = 0; // Turn the LED off to show we are in manual-focus mode
+ led1 = 0; // Turn the LED off to show we are in manual-focus mode
Camera.putc(0x81); // Camera
Camera.putc(0x01); // Turn on manual-focus cmd
Camera.putc(0x04);
@@ -211,27 +250,23 @@
Camera.putc(0xFF); // Terminator
ManualfocusFlag = false;
Mode = MANUAL;
- }*/
+ }
}
}
- /*
- // Increase the serial baud rate
- // pc.baud(921600);
+/*
+ // Increase the serial baud rate
+ // pc.baud(921600);
- while(1) {
- Thread::wait(100);
+ while(1) {
+ Thread::wait(100);
- if(pc.readable()) {
- ServiceKeyboard();
- }
- if(Capture) {
- // Print to terminal the current motor encoder positions
- pc.printf("\n\r %d %d ",pan_ic_mu.ReadPOSITION(),tilt_ic_mu.ReadPOSITION());
- }
-
- if(Demand) {
- pc.printf("\n\r %0.3f ",PanVelocityPID.getSetPoint());
- }
- }
+ if(pc.readable()) {
+ ServiceKeyboard();
+ }
+
+ if(Demand) {
+ pc.printf("\n\r %0.3f ",PanVelocityPID.getSetPoint());
+ }
+ }
}*/