Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: Encoder HIDScope MODSERIAL mbed-dsp mbed
Revision 1:82a5126adc56, committed 2014-10-14
- Comitter:
- DominiqueC
- Date:
- Tue Oct 14 13:11:03 2014 +0000
- Parent:
- 0:1d02168661ec
- Commit message:
- voor Daan
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 1d02168661ec -r 82a5126adc56 main.cpp
--- a/main.cpp Mon Oct 13 08:53:22 2014 +0000
+++ b/main.cpp Tue Oct 14 13:11:03 2014 +0000
@@ -12,30 +12,107 @@
#include "mbed.h"
#include "encoder.h"
#include "MODSERIAL.h"
-#include "HIDscope.h"
+#include "HIDScope.h"
+
+
+//MAXIMALE UITWIJKING BEPALEN
+/** keep_in_range -> float in, and keep_in_range if less than min, or larger than max **/
+void keep_in_range(float * in, float min, float max);
-//POSITIE EN SNELHEID UITLEZEN OP PC
-int main()
+/** variable to show when a new loop can be started*/
+/** volatile means that it can be changed in an */
+/** interrupt routine, and that that change is vis-*/
+/** ible in the main loop. */
+
+volatile bool looptimerflag;
+
+/** function called by Ticker "looptimer" */
+/** variable 'looptimerflag' is set to 'true' */
+/** each time the looptimer expires. */
+void setlooptimerflag(void)
{
-while(1) //Loop
- {
- /** Make encoder object.
- * First pin should be on PTAx or PTDx because those pins can be used as InterruptIn
- * Second pin can be any digital input
- */
+ looptimerflag = true;
+}
+
+int main() {
+ //LOCAL VARIABLES
+ /*Potmeter input*/
+ AnalogIn potmeter(PTC2);
+ /* Encoder, using my encoder library */
+ /* First pin should be PTDx or PTAx */
+ /* because those pins can be used as */
+ /* InterruptIn */
Encoder motor1(PTD0,PTC9);
- /*Use USB serial to send values*/
+ /* MODSERIAL to get non-blocking Serial*/
MODSERIAL pc(USBTX,USBRX);
- /*Set baud rate to 115200*/
- pc.baud(115200);
- while(1) { //Loop
- /**Wait to prevent buffer overflow, and to keep terminal readable (not scrolling too fast)*/
- wait(0.2);
- /** print position (integer) and speed (float) to the PC*/
- pc.printf("pos: %d, speed %f \r\n",motor1.getPosition(), motor1.getSpeed());
+ /* PWM control to motor */
+ PwmOut pwm_motor(PTA12);
+ /* Direction pin */
+ DigitalOut motordir(PTD3);
+ /* variable to store setpoint in */
+ float setpoint;
+ /* variable to store pwm value in*/
+ float pwm_to_motor;
+ //START OF CODE
+
+ /*Set the baudrate (use this number in RealTerm too! */
+ pc.baud(230400);
+
+ /*Create a ticker, and let it call the */
+ /*function 'setlooptimerflag' every 0.01s */
+ Ticker looptimer;
+ looptimer.attach(setlooptimerflag,0.01);
+
+ //INFINITE LOOP
+ while(1) {
+ /* Wait until looptimer flag is true. */
+ /* '!=' means not-is-equal */
+ while(looptimerflag != true);
+ /* Clear the looptimerflag, otherwise */
+ /* the program would simply continue */
+ /* without waitingin the next iteration*/
+ looptimerflag = false;
+
+ /* Read potmeter value, apply some math */
+ /* to get useful setpoint value */
+ setpoint = (potmeter.read()-0.5)*2000;
+
+ /* Print setpoint and current position to serial terminal*/
+ pc.printf("s: %f, %d \n\r", setpoint, motor1.getPosition());
+
+ /* This is a P-action! calculate error, multiply with gain, and store in pwm_to_motor */
+ pwm_to_motor = (setpoint - motor1.getPosition())*.001;
+ /* Coerce pwm value if outside range */
+ /* Not strictly needed here, but useful */
+ /* if doing other calculations with pwm value */
+ keep_in_range(&pwm_to_motor, -1,1);
+
+ /* Control the motor direction pin. based on */
+ /* the sign of your pwm value. If your */
+ /* motor keeps spinning when running this code */
+ /* you probably need to swap the motor wires, */
+ /* or swap the 'write(1)' and 'write(0)' below */
+ if(pwm_to_motor > 0)
+ motordir.write(1);
+ else
+ motordir.write(0);
+ //WRITE VALUE TO MOTOR
+ /* Take the absolute value of the PWM to send */
+ /* to the motor. */
+ pwm_motor.write(abs(pwm_to_motor));
}
}
+
+//coerces value 'in' to min or max when exceeding those values
+//if you'd like to understand the statement below take a google for
+//'ternary operators'.
+void keep_in_range(float * in, float min, float max)
+{
+ *in > min ? *in < max? : *in = max: *in = min;
+}
+
+
//AANSTUREN MOTOR (POSITIE EN SNELHEID)
#define TSAMP 0.01
#define K_P (0.1)
@@ -127,3 +204,25 @@
return out_p + out_i + out_d;
}
+
+//POSITIE EN SNELHEID UITLEZEN OP PC
+int main()
+{
+while(1) //Loop
+ {
+ /** Make encoder object.
+ * First pin should be on PTAx or PTDx because those pins can be used as InterruptIn
+ * Second pin can be any digital input
+ */
+ Encoder motor1(PTD0,PTC9);
+ /*Use USB serial to send values*/
+ MODSERIAL pc(USBTX,USBRX);
+ /*Set baud rate to 115200*/
+ pc.baud(115200);
+ while(1) { //Loop
+ /**Wait to prevent buffer overflow, and to keep terminal readable (not scrolling too fast)*/
+ wait(0.2);
+ /** print position (integer) and speed (float) to the PC*/
+ pc.printf("pos: %d, speed %f \r\n",motor1.getPosition(), motor1.getSpeed());
+ }
+}
\ No newline at end of file