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: Motor PID eeprom mbed
Fork of Tanginamo by
Revision 5:4168693bfb80, committed 2015-12-09
- Comitter:
- ParinyaT
- Date:
- Wed Dec 09 00:01:34 2015 +0000
- Parent:
- 4:6e29193d7f95
- Commit message:
- Fra 221 B14 (43,46)
Changed in this revision
| eeprom.lib | 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/eeprom.lib Mon Dec 07 21:32:46 2015 +0000 +++ b/eeprom.lib Wed Dec 09 00:01:34 2015 +0000 @@ -1,1 +1,1 @@ -https://developer.mbed.org/teams/FRA221_2015/code/eeprom/#c648c5e93d5e +https://developer.mbed.org/teams/FRA221_2015/code/eeprom/#df82ebf4be54
--- a/main.cpp Mon Dec 07 21:32:46 2015 +0000
+++ b/main.cpp Wed Dec 09 00:01:34 2015 +0000
@@ -7,39 +7,32 @@
#include "eeprom.h"
//*****************************************************/
-// Defines //
-#define Rate 0.01
-#define Kc -2.6
-#define Ti 0.0
-#define Td 0.0
-
+// PID parameter //
+float Rate = 0.001;
+float Kc = 0.4;
+float Ti = 0.15;
+float Td = 0.0;
+float Ki;
+float Kd;
//*****************************************************/
// Global //
//-- pc monitor --
Serial PC(D1,D0);
//-- encoder --
int Position;
-int data;
-
-
-//*******************************************************
-
-
-//write encoder
-EEPROM memory(I2C_SDA,I2C_SCL,0);
-int8_t out,write;
-int mod;
-int FromSerial;
-
-
-//*******************************************************
+int ENdata;
SPI device(Emosi, Emiso, Esck);
DigitalOut Encoder(EncoderA);
//-- Motor --
+int dir;
Motor LeftUpper(PWM_LU,A_LU,B_LU);
+//-- Memory --
+EEPROM memory(PB_4,PA_8,0);
//-- PID --
int SetPoint;
-PID LU_PID(Kc, Ti, Td, Rate);//Kp,Ki,Kd,Rate
+//-- Packet --
+int Start1,Start2,ID,Lenght,inst,GOAL,Pos;
+int8_t Check,Checksum;
//*****************************************************/
void Read_Encoder()
{
@@ -53,7 +46,7 @@
wait_us(50);
device.write(0x09);
wait_us(50);
- data = device.write(0x00);
+ ENdata = device.write(0x00);
wait_us(50);
Encoder = 1;
@@ -83,37 +76,37 @@
//******************************************************************************************
void eewrite()
{
- write = Position;
- memory.write(0xFF,write);
- PC.printf("%x\n",write);
- //PC.printf("write %x Complete",write);
-
+ memory.write(0x11,Kc);
+ wait_ms(10);
+ memory.write(0x22,Ki);
+ wait_ms(10);
+ memory.write(0x33,Kd);
+
wait_ms(10);
}
//******************************************************************************************
void eeread()
{
- memory.read(0xFF,out);
- PC.printf("%x\n",out);
- //PC.printf("Read %x Complete",out);
+ memory.read(0x11,Kc);
+ wait_ms(10);
+ memory.read(0x22,Ki);
+ wait_ms(10);
+ memory.read(0x33,Kd);
wait_ms(10);
}
//******************************************************************************************
void StartWriteRead(int mod)
{
-
- if(mod==1)
- {
- eewrite();
- wait_ms(10);
- }
- else if(mod==0)
- {
- eeread();
- wait_ms(10);
- }
-
+
+ if(mod==1) {
+ eewrite();
+ wait_ms(10);
+ } else if(mod==0) {
+ eeread();
+ wait_ms(10);
+ }
+
}
//*****************************************************/
int main()
@@ -129,9 +122,9 @@
while(1) {
if(state_show == 0) {
PC.printf("Menu\n");
- PC.printf("1.Mode Write Or Read \n");
- PC.printf("2.Mode POP\n");
- PC.printf("3.Mode Set Encode\n");
+ PC.printf("1.Set PID Parameter \n");
+ PC.printf("2.Set Position \n");
+ PC.printf("3.PID Test \n");
state_show =1;
}
if(PC.readable()) {
@@ -143,11 +136,15 @@
switch(data) {
case '1':
do {
+
if(state_menu == 0) {
- PC.printf("Mode Write Or Read\n");
- PC.printf("a.Mode Write \n");
- PC.printf("d.Mode Read \n");
- PC.printf("s.Stop \n");
+ PC.printf("Set PID Parameter\n");
+ PC.printf("Kp : %f\n", Kc);
+ PC.printf("Ki : %f\n", Kc*Ti);
+ PC.printf("Kd : %f\n", Kc*Td);
+ PC.printf("1.New setting\n");
+ PC.printf("2.Load setting\n");
+ PC.printf("3.Exit\n");
state_menu = 1;
}
if(PC.readable()) {
@@ -157,116 +154,129 @@
switch(data) {
- case 'a':
- StartWriteRead(1);
- break;
-
- case 's':
- state_exit = 1;
-
+ case '1':
+ PC.printf("Set Kp : ");
+ PC.scanf("%f", &Kc);
+ PC.printf("\nSet Ki : ");
+ PC.scanf("%f", &Ki);
+ PC.printf("\nSet Kd : ");
+ PC.scanf("%f", &Kd);
+
+ Ti = Ki/Kc;
+ Td = Kd/Kc;
+
+ eewrite();
+
break;
- case 'd':
- StartWriteRead(0);
+ case '2':
+ eeread();
+
+ /*PC.printf("Set Kp : %f\n",Kc);
+ PC.printf("Set Ki : %f\n",Ki);
+ PC.printf("Set Kd : %f\n",Kd);*/
+
+ Ti = Ki/Kc;
+ Td = Kd/Kc;
+
break;
- default:
- PC.printf("plz select a or d\n");
- PC.printf("\n\n");
+ case '3':
+ state_exit = 1;
break;
+ //default:
+ //PC.printf("plz select 1,2,3\n");
+ //PC.printf("\n\n");
+ //break;
+
}
}
-
-
-
} while(state_exit ==0);
PC.printf("\n\n");
break;
- case '2':
+ case '3':
do {
if(state_menu == 0) {
- PC.printf("Mode POP\n\n");
+ PC.printf("Mode POP\n");
+ PC.printf("press x to exit\n\n");
+ PID LU_PID(Kc, Ti, Td, Rate);//Kp,Ki,Kd,Rate
//***start mode
- {
+ wait (2);
+ while(1){
+
LeftUpper.period(0.00005);
LU_PID.setInputLimits(0,127);
- LU_PID.setOutputLimits(0,0.9);
+ LU_PID.setOutputLimits(0.2,1);
LU_PID.setMode(AUTO_MODE);
//get the target position
- SetPoint = 63;
+ //SetPoint = 64;
LU_PID.setSetPoint(SetPoint);
Read_Encoder();
- PC.printf("%d\n",data);
- Get_EnValue(data);
- PC.printf("%d\n********************\n",Position);
+ //PC.printf("%d\n",ENdata);
+ Get_EnValue(ENdata);
+ //PC.printf("%d\n********************\n",Position);
- while(Position != SetPoint) {
+ while(abs(Position-SetPoint)>1) {
LU_PID.setProcessValue(Position);
- LeftUpper.speed(LU_PID.compute());
+ if( Position - SetPoint > 0 ) {
+ dir = 1;
+ }if(Position - SetPoint < 0 ) {
+ dir = -1;
+ }
+
+
+ LeftUpper.speed(LU_PID.compute() * dir);
+ wait_ms(17);
Read_Encoder();
- Get_EnValue(data);
+ Get_EnValue(ENdata);
+ //PC.printf("%d\n********************\n",Position);
+ LeftUpper.brake(0);
+
+ }LeftUpper.brake(1);
+ if(PC.readable()) {
+ data = PC.getc();
+ if (data == 'x') {
+ state_exit = 1;
+ break;
+ }else state_menu = 0;
}
- }
- PC.printf("press x to exit or else to continue\n");
- state_menu = 1;
+
}
- if(PC.readable()) {
- data = PC.getc();
- if (data == 'x') state_exit = 1;
- else state_menu = 0;
- }
-
+
+ }
+ } while(state_exit ==0);
+ PC.printf("\n\n");
+ break;
- } while(state_exit ==0);
- PC.printf("\n\n");
- break;
-
- case '3':
- do{
+ case '2':
+ do {
if(state_menu == 0) {
PC.printf("Mode SetPoint\n");
- PC.printf("z.Mode SetPoint \n");
- PC.printf("x.Stop \n");
+ PC.printf("Waiting for command\n");
state_menu = 1;
}
- if(PC.readable()) {
- data = PC.getc();
- PC.printf("\n");
- state_menu=0;
-
- switch(data) {
-
- case 'z':
- PC.printf("Mode SetPoint\n");
- PC.printf("In Put Your Point 0-128 and spacebar\n");
- PC.scanf(" %d",&SetPoint);
- PC.printf("%d",SetPoint);
- while(SetPoint>128)
- {
- PC.printf("Your Number ERROR Plz Input 0-128 and spacebar\n");
- PC.scanf("%d",&SetPoint);
- }
- PC.printf("SETPOINT = %d",SetPoint);
- break;
-
- case 'x':
- state_exit = 1;
- break;
-
- default:
- PC.printf("plz select z or x\n");
- PC.printf("\n\n");
- break;
-
+
+ PC.scanf("%x %x %x %x %x %x %x %x",&Start1,&Start2,&ID,&Lenght,&inst,&GOAL,&Pos,&Checksum);
+ PC.printf("%2x %2x %2x %2x %2x %2x %2x %2x\n",Start1,Start2,ID,Lenght,inst,GOAL,Pos,Checksum);
+ Check = ~(ID+Lenght+inst+GOAL+Pos);
+
+ if(inst == 03){
+ if(GOAL == 01){
+ if(Checksum == Check) {
+ SetPoint=Pos;
+ printf("Position was set to %d\n",Pos);
+ }else printf("Worng Command\n");
}
}
+ state_menu = 0;
+ break;
