Go Down

Topic: Implementing Cordic Algorithm in Arduino (Read 961 times) previous topic - next topic

nithesh26

Can any one please tell me the code to implement Cordic algorithm for Arduino Uno. I'm having the 'C' language program for Cordic Algorithm.

jremington

Google "cordic algorithm c language" for examples.

fungus


Can any one please tell me the code to implement Cordic algorithm for Arduino Uno. I'm having the 'C' language program for Cordic Algorithm.


You're in luck! The Arduino Uno uses the C++ language.
No, I don't answer questions sent in private messages (but I do accept thank-you notes...)

nithesh26

what should we use in place of printf command for Arduino?

mrburnette


nithesh26

Hello All,

I had a code for implementing CORDIC algorithm. While I go through it there were lot of errors showing up. Can anyone please help me with this.

nithesh26

#6
Apr 08, 2014, 12:59 am Last Edit: Apr 08, 2014, 04:55 am by Coding Badly Reason: 1
Hello All,

I had a code for implementing CORDIC algorithm. While I go through it there were lot of errors showing up. Can anyone please help me with this. Thanks in advance.



I'm attaching the code below.


Code: [Select]
#define M_PI 3.1415926536897932384626
#define K1 0.6072529350088812561694

int main(int argc, char **argv)
{
   int i;
   int bits = 32; // number of bits
   int mul = (1<<(bits-2));
   
   
   int n = bits; // number of elements.
   int c;

   println("//Cordic in %d bit signed fixed point math\n", bits);
   println("//Function is valid for arguments in range -pi/2 -- pi/2\n");
   println("//for values pi/2--pi: value = half_pi-(theta-half_pi) and similarly for values -pi---pi/2\n");
   println("//\n");
   println("// 1.0 = %d\n", mul);
   println("// 1/k = 0.6072529350088812561694\n");
   println("// pi = 3.1415926536897932384626\n");

   println("//Constants\n");
   println("#define cordic_1K 0x%08X\n", (int)(mul*K1));
   println("#define half_pi 0x%08X\n", (int)(mul*(M_PI/2)));
   println("#define MUL %f\n", (double)mul);
   println("#define CORDIC_NTAB %d\n", n);
   
   println("int cordic_ctab [] = {");
   for(i=0;i<n;i++)
   {
       c = (atan(pow(2, -i)) * mul);
       println("0x%08X, ", c);
   }
   println("};\n\n");


   //Print the cordic function
   println("void cordic(int theta, int *s, int *c, int n)\n{\n  int k, d, tx, ty, tz;\n");
   println("  int x=cordic_1K,y=0,z=theta;\n  n = (n>CORDIC_NTAB) ? CORDIC_NTAB : n;\n");
   println("  for (k=0; k<n; ++k)\n  {\n    d = z>>%d;\n", (bits-1));
   println("    //get sign. for other architectures, you might want to use the more portable version\n");
   println("    //d = z>=0 ? 0 : -1;\n    tx = x - (((y>>k) ^ d) - d);\n    ty = y + (((x>>k) ^ d) - d);\n");
   println("    tz = z - ((cordic_ctab[k] ^ d) - d);\n    x = tx; y = ty; z = tz;\n  }  \n *c = x; *s = y;\n}\n");
   
}


cordic-32bit.h


Code: [Select]
//Cordic in 32 bit signed fixed point math
//Function is valid for arguments in range -pi/2 -- pi/2
//for values pi/2--pi: value = half_pi-(theta-half_pi) and similarly for values -pi---pi/2
//
// 1.0 = 1073741824
// 1/k = 0.6072529350088812561694
// pi = 3.1415926536897932384626
//Constants
#define cordic_1K 0x26DD3B6A
#define half_pi 0x6487ED51
#define MUL 1073741824.000000
#define CORDIC_NTAB 32
int cordic_ctab [] = {0x3243F6A8, 0x1DAC6705, 0x0FADBAFC, 0x07F56EA6, 0x03FEAB76, 0x01FFD55B,
0x00FFFAAA, 0x007FFF55, 0x003FFFEA, 0x001FFFFD, 0x000FFFFF, 0x0007FFFF, 0x0003FFFF,
0x0001FFFF, 0x0000FFFF, 0x00007FFF, 0x00003FFF, 0x00001FFF, 0x00000FFF, 0x000007FF,
0x000003FF, 0x000001FF, 0x000000FF, 0x0000007F, 0x0000003F, 0x0000001F, 0x0000000F,
0x00000008, 0x00000004, 0x00000002, 0x00000001, 0x00000000, };

void cordic(int theta, int *s, int *c, int n)
{
 int k, d, tx, ty, tz;
 int x=cordic_1K,y=0,z=theta;
 n = (n>CORDIC_NTAB) ? CORDIC_NTAB : n;
 for (k=0; k<n; ++k)
 {
   d = z>>31;
   //get sign. for other architectures, you might want to use the more portable version
   //d = z>=0 ? 0 : -1;
   tx = x - (((y>>k) ^ d) - d);
   ty = y + (((x>>k) ^ d) - d);
   tz = z - ((cordic_ctab[k] ^ d) - d);
   x = tx; y = ty; z = tz;
 }  
*c = x; *s = y;
}




Moderator edit: [code] [/code] tags added.

KeithRB

What does this have to do with arduino?

Arduino hides the main() function - how do expect to send it arguments? Instead arduino uses setup() and loop().

nithesh26

#8
Apr 08, 2014, 04:56 am Last Edit: Apr 08, 2014, 05:01 am by nithesh26 Reason: 1
I'm new to Arduino. I dont know the commands properly. I have downloaded this code through internet.

michinyon

Well you need to go and understand  setup() and loop() before you will get very far.

All of those println() function calls in your alleged C program  will need to be replaced by Serial.println() to work on the arduino.

AWOL

You'll also need to understand the difference between 16 and 32 bit integers.
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

nithesh26

Arduino hides main ( ). So what should we use in the place of main ( ) ? And also if we use the setup function,should we assign any pin number to that? 

PaulS

Quote
And also if we use the setup function,should we assign any pin number to that?   

Yes. You should use the number of the pin that setup() is attached to.

KeithRB

http://arduino.cc/en/Reference/Setup

http://arduino.cc/en/Reference/Loop

If you want something done once, put it in setup().
If you want it done over and over, put it in loop().


robtillaart


check this thread for CORDIC - http://forum.arduino.cc/index.php?topic=75126.msg568212#msg568212 -

gr. Rob
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

Go Up