Implementing Cordic Algorithm in Arduino

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.

Google "cordic algorithm c language" for examples.

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.

You're in luck! The Arduino Uno uses the C++ language.

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

http://playground.arduino.cc/Main/Printf#.UymwFU7D_bU

Added:
Also check out Streaming:
http://playground.arduino.cc/Main/StreamingOutput#.Uymzt07D_bU

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.

cordic arduino.docx (17.3 KB)

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.

#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

//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:
</mark> <mark>[code]</mark> <mark>

</mark> <mark>[/code]</mark> <mark>
tags added.

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().

I'm new to Arduino. I dont know the commands properly. I have downloaded this code through internet.

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.

You'll also need to understand the difference between 16 and 32 bit integers.

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?

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.

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

check this thread for CORDIC - Fastest way to do sin(), cos() atan2() - #34 by MarkT - Programming Questions - Arduino Forum -

gr. Rob

This link may help:

http://stm32duino.com/viewtopic.php?f=18&t=1510

bro nitesh....take your time to study Arduino...just because you were said arduino is done via C++....that aint enough to float your boat.....download ebook "piece of cake, into to arduino"....if ya good with c ya can crush the book within week .....so do go for this little awesome book...and this would be enough for you to unleash your creativity if ya know c....

sabishaw:
bro nitesh...

Has long since left the building...

Apr 08, 2014, 10:17 am