Lab 5

Dependencies:   mbed

Committer:
LanierUSNA16
Date:
Thu Oct 02 15:47:39 2014 +0000
Revision:
0:48e80d1e9e1b
Lab 5;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
LanierUSNA16 0:48e80d1e9e1b 1 #include "mbed.h"
LanierUSNA16 0:48e80d1e9e1b 2 #define PI (3.14159)
LanierUSNA16 0:48e80d1e9e1b 3 //=============================================================================
LanierUSNA16 0:48e80d1e9e1b 4 // Four commands for the Instruction Register (B7,B6) - LS7366
LanierUSNA16 0:48e80d1e9e1b 5 //=============================================================================
LanierUSNA16 0:48e80d1e9e1b 6 #define CLR 0x00 //Clear Instruction
LanierUSNA16 0:48e80d1e9e1b 7 #define RD 0x01 //Read Instruction
LanierUSNA16 0:48e80d1e9e1b 8 #define WR 0x02 //Write Instruction
LanierUSNA16 0:48e80d1e9e1b 9 #define LOAD 0x03 //Load Instruction
LanierUSNA16 0:48e80d1e9e1b 10
LanierUSNA16 0:48e80d1e9e1b 11 //=============================================================================
LanierUSNA16 0:48e80d1e9e1b 12 // Register to Select from the Instruction Register (B5,B4,B3) - LS7366
LanierUSNA16 0:48e80d1e9e1b 13 //=============================================================================
LanierUSNA16 0:48e80d1e9e1b 14 #define NONE 0x00 //No Register Selected
LanierUSNA16 0:48e80d1e9e1b 15 #define MDR0 0x01 //Mode Register 0
LanierUSNA16 0:48e80d1e9e1b 16 #define MDR1 0x02 //Mode Register 1
LanierUSNA16 0:48e80d1e9e1b 17 #define DTR 0x03 //Data Transfer Register
LanierUSNA16 0:48e80d1e9e1b 18 #define CNTR 0x04 //Software Configurable Counter Register
LanierUSNA16 0:48e80d1e9e1b 19 #define OTR 0x05 //Output Transfer Register
LanierUSNA16 0:48e80d1e9e1b 20 #define STR 0x06 //Status Register
LanierUSNA16 0:48e80d1e9e1b 21 #define NONE_REG 0x07 //No Register Selected
LanierUSNA16 0:48e80d1e9e1b 22
LanierUSNA16 0:48e80d1e9e1b 23
LanierUSNA16 0:48e80d1e9e1b 24 Serial pc(USBTX,USBRX);
LanierUSNA16 0:48e80d1e9e1b 25 SPI spi(p5, p6, p7);
LanierUSNA16 0:48e80d1e9e1b 26 LocalFileSystem local ("local");
LanierUSNA16 0:48e80d1e9e1b 27 DigitalOut ls7166_cs1(p19); //CS for LS7366
LanierUSNA16 0:48e80d1e9e1b 28 DigitalOut ls7166_cs2(p20); //CS for LS7366
LanierUSNA16 0:48e80d1e9e1b 29
LanierUSNA16 0:48e80d1e9e1b 30 //----- LS7366 Encoder/Counter Routines --------------------
LanierUSNA16 0:48e80d1e9e1b 31 void LS7366_cmd(int inst, int reg){
LanierUSNA16 0:48e80d1e9e1b 32 char cmd;
LanierUSNA16 0:48e80d1e9e1b 33
LanierUSNA16 0:48e80d1e9e1b 34 spi.format(8, 0);
LanierUSNA16 0:48e80d1e9e1b 35 spi.frequency(2000000);
LanierUSNA16 0:48e80d1e9e1b 36 cmd = (inst << 6) | (reg << 3);
LanierUSNA16 0:48e80d1e9e1b 37 // printf("\r\ncmd=0X%2X", cmd);
LanierUSNA16 0:48e80d1e9e1b 38 spi.write(cmd);
LanierUSNA16 0:48e80d1e9e1b 39 }
LanierUSNA16 0:48e80d1e9e1b 40
LanierUSNA16 0:48e80d1e9e1b 41 long LS7366_read_counter(int chan_num){
LanierUSNA16 0:48e80d1e9e1b 42 union bytes{
LanierUSNA16 0:48e80d1e9e1b 43 char byte_enc[4];
LanierUSNA16 0:48e80d1e9e1b 44 long long_enc;
LanierUSNA16 0:48e80d1e9e1b 45 }counter;
LanierUSNA16 0:48e80d1e9e1b 46
LanierUSNA16 0:48e80d1e9e1b 47 spi.format(8, 0);
LanierUSNA16 0:48e80d1e9e1b 48 spi.frequency(2000000);
LanierUSNA16 0:48e80d1e9e1b 49
LanierUSNA16 0:48e80d1e9e1b 50 if(chan_num!=2){
LanierUSNA16 0:48e80d1e9e1b 51 ls7166_cs1 = 0;
LanierUSNA16 0:48e80d1e9e1b 52 wait_us(1);
LanierUSNA16 0:48e80d1e9e1b 53 LS7366_cmd(LOAD,OTR);//cmd = 0xe8, LOAD to OTR
LanierUSNA16 0:48e80d1e9e1b 54 ls7166_cs1 = 1;
LanierUSNA16 0:48e80d1e9e1b 55 wait_us(1);
LanierUSNA16 0:48e80d1e9e1b 56 ls7166_cs1 = 0;
LanierUSNA16 0:48e80d1e9e1b 57 }
LanierUSNA16 0:48e80d1e9e1b 58 else{
LanierUSNA16 0:48e80d1e9e1b 59 ls7166_cs2 = 0;
LanierUSNA16 0:48e80d1e9e1b 60 wait_us(1);
LanierUSNA16 0:48e80d1e9e1b 61 LS7366_cmd(LOAD,OTR);//cmd = 0xe8, LOAD to OTR
LanierUSNA16 0:48e80d1e9e1b 62 ls7166_cs2 = 1;
LanierUSNA16 0:48e80d1e9e1b 63 wait_us(1);
LanierUSNA16 0:48e80d1e9e1b 64
LanierUSNA16 0:48e80d1e9e1b 65 ls7166_cs2 = 0;
LanierUSNA16 0:48e80d1e9e1b 66 }
LanierUSNA16 0:48e80d1e9e1b 67 wait_us(1);
LanierUSNA16 0:48e80d1e9e1b 68 LS7366_cmd(RD,CNTR); //cmd = 0x60, READ from CNTR
LanierUSNA16 0:48e80d1e9e1b 69 counter.byte_enc[3] = spi.write(0x00);
LanierUSNA16 0:48e80d1e9e1b 70 counter.byte_enc[2] = spi.write(0x00);
LanierUSNA16 0:48e80d1e9e1b 71 counter.byte_enc[1] = spi.write(0x00);
LanierUSNA16 0:48e80d1e9e1b 72 counter.byte_enc[0] = spi.write(0x00);
LanierUSNA16 0:48e80d1e9e1b 73
LanierUSNA16 0:48e80d1e9e1b 74 if(chan_num!=2){
LanierUSNA16 0:48e80d1e9e1b 75 ls7166_cs1 = 1;
LanierUSNA16 0:48e80d1e9e1b 76 }
LanierUSNA16 0:48e80d1e9e1b 77 else{
LanierUSNA16 0:48e80d1e9e1b 78 ls7166_cs2 = 1;
LanierUSNA16 0:48e80d1e9e1b 79 }
LanierUSNA16 0:48e80d1e9e1b 80
LanierUSNA16 0:48e80d1e9e1b 81 return counter.long_enc; //return count
LanierUSNA16 0:48e80d1e9e1b 82 }
LanierUSNA16 0:48e80d1e9e1b 83
LanierUSNA16 0:48e80d1e9e1b 84 void LS7366_quad_mode_x4(int chan_num){
LanierUSNA16 0:48e80d1e9e1b 85
LanierUSNA16 0:48e80d1e9e1b 86 spi.format(8, 0);
LanierUSNA16 0:48e80d1e9e1b 87 spi.frequency(2000000);
LanierUSNA16 0:48e80d1e9e1b 88
LanierUSNA16 0:48e80d1e9e1b 89 if(chan_num!=2){
LanierUSNA16 0:48e80d1e9e1b 90 ls7166_cs1 = 0;
LanierUSNA16 0:48e80d1e9e1b 91 }
LanierUSNA16 0:48e80d1e9e1b 92 else{
LanierUSNA16 0:48e80d1e9e1b 93 ls7166_cs2 = 0;
LanierUSNA16 0:48e80d1e9e1b 94 }
LanierUSNA16 0:48e80d1e9e1b 95 wait_us(1);
LanierUSNA16 0:48e80d1e9e1b 96 LS7366_cmd(WR,MDR0);// Write to the MDR0 register
LanierUSNA16 0:48e80d1e9e1b 97 spi.write(0x03); // X4 quadrature count mode
LanierUSNA16 0:48e80d1e9e1b 98 if(chan_num!=2){
LanierUSNA16 0:48e80d1e9e1b 99 ls7166_cs1 = 1;
LanierUSNA16 0:48e80d1e9e1b 100 }
LanierUSNA16 0:48e80d1e9e1b 101 else{
LanierUSNA16 0:48e80d1e9e1b 102 ls7166_cs2 = 1;
LanierUSNA16 0:48e80d1e9e1b 103 }
LanierUSNA16 0:48e80d1e9e1b 104 }
LanierUSNA16 0:48e80d1e9e1b 105
LanierUSNA16 0:48e80d1e9e1b 106 void LS7366_reset_counter(int chan_num){
LanierUSNA16 0:48e80d1e9e1b 107
LanierUSNA16 0:48e80d1e9e1b 108 spi.format(8, 0);
LanierUSNA16 0:48e80d1e9e1b 109 spi.frequency(2000000);
LanierUSNA16 0:48e80d1e9e1b 110
LanierUSNA16 0:48e80d1e9e1b 111 if(chan_num!=2){
LanierUSNA16 0:48e80d1e9e1b 112 ls7166_cs1 = 0;
LanierUSNA16 0:48e80d1e9e1b 113 }
LanierUSNA16 0:48e80d1e9e1b 114 else{
LanierUSNA16 0:48e80d1e9e1b 115 ls7166_cs2 = 0;
LanierUSNA16 0:48e80d1e9e1b 116 }
LanierUSNA16 0:48e80d1e9e1b 117 wait_us(1);
LanierUSNA16 0:48e80d1e9e1b 118 LS7366_cmd(CLR,CNTR);//Clear the counter register
LanierUSNA16 0:48e80d1e9e1b 119 if(chan_num!=2){
LanierUSNA16 0:48e80d1e9e1b 120 ls7166_cs1 = 1;
LanierUSNA16 0:48e80d1e9e1b 121 }
LanierUSNA16 0:48e80d1e9e1b 122 else{
LanierUSNA16 0:48e80d1e9e1b 123 ls7166_cs2 = 1;
LanierUSNA16 0:48e80d1e9e1b 124 }
LanierUSNA16 0:48e80d1e9e1b 125 wait_us(1);
LanierUSNA16 0:48e80d1e9e1b 126
LanierUSNA16 0:48e80d1e9e1b 127 if(chan_num!=2){
LanierUSNA16 0:48e80d1e9e1b 128 ls7166_cs1 = 0;
LanierUSNA16 0:48e80d1e9e1b 129 }
LanierUSNA16 0:48e80d1e9e1b 130 else{
LanierUSNA16 0:48e80d1e9e1b 131 ls7166_cs2 = 0;
LanierUSNA16 0:48e80d1e9e1b 132 }
LanierUSNA16 0:48e80d1e9e1b 133 wait_us(1);
LanierUSNA16 0:48e80d1e9e1b 134 LS7366_cmd(LOAD,CNTR);//
LanierUSNA16 0:48e80d1e9e1b 135 if(chan_num!=2){
LanierUSNA16 0:48e80d1e9e1b 136 ls7166_cs1 = 1;
LanierUSNA16 0:48e80d1e9e1b 137 }
LanierUSNA16 0:48e80d1e9e1b 138 else{
LanierUSNA16 0:48e80d1e9e1b 139 ls7166_cs1 = 1;
LanierUSNA16 0:48e80d1e9e1b 140 }
LanierUSNA16 0:48e80d1e9e1b 141 }
LanierUSNA16 0:48e80d1e9e1b 142
LanierUSNA16 0:48e80d1e9e1b 143 void LS7366_write_DTR(int chan_num,long enc_value)
LanierUSNA16 0:48e80d1e9e1b 144 {
LanierUSNA16 0:48e80d1e9e1b 145 union bytes
LanierUSNA16 0:48e80d1e9e1b 146 {
LanierUSNA16 0:48e80d1e9e1b 147 char byte_enc[4];
LanierUSNA16 0:48e80d1e9e1b 148 long long_enc;
LanierUSNA16 0:48e80d1e9e1b 149 }counter;
LanierUSNA16 0:48e80d1e9e1b 150
LanierUSNA16 0:48e80d1e9e1b 151 spi.format(8, 0);
LanierUSNA16 0:48e80d1e9e1b 152 spi.frequency(2000000);
LanierUSNA16 0:48e80d1e9e1b 153
LanierUSNA16 0:48e80d1e9e1b 154 counter.long_enc = enc_value;
LanierUSNA16 0:48e80d1e9e1b 155
LanierUSNA16 0:48e80d1e9e1b 156 if(chan_num!=2){
LanierUSNA16 0:48e80d1e9e1b 157 ls7166_cs1 = 0;
LanierUSNA16 0:48e80d1e9e1b 158 }
LanierUSNA16 0:48e80d1e9e1b 159 else{
LanierUSNA16 0:48e80d1e9e1b 160 ls7166_cs2 = 0;
LanierUSNA16 0:48e80d1e9e1b 161 }
LanierUSNA16 0:48e80d1e9e1b 162 wait_us(1);
LanierUSNA16 0:48e80d1e9e1b 163 LS7366_cmd(WR,DTR);//
LanierUSNA16 0:48e80d1e9e1b 164 spi.write(counter.byte_enc[3]);
LanierUSNA16 0:48e80d1e9e1b 165 spi.write(counter.byte_enc[2]);
LanierUSNA16 0:48e80d1e9e1b 166 spi.write(counter.byte_enc[1]);
LanierUSNA16 0:48e80d1e9e1b 167 spi.write(counter.byte_enc[0]);
LanierUSNA16 0:48e80d1e9e1b 168 if(chan_num!=2){
LanierUSNA16 0:48e80d1e9e1b 169 ls7166_cs1 = 1;
LanierUSNA16 0:48e80d1e9e1b 170 }
LanierUSNA16 0:48e80d1e9e1b 171 else{
LanierUSNA16 0:48e80d1e9e1b 172 ls7166_cs2 = 1;
LanierUSNA16 0:48e80d1e9e1b 173 }
LanierUSNA16 0:48e80d1e9e1b 174
LanierUSNA16 0:48e80d1e9e1b 175 wait_us(1);
LanierUSNA16 0:48e80d1e9e1b 176 if(chan_num!=2){
LanierUSNA16 0:48e80d1e9e1b 177 ls7166_cs1 = 0;
LanierUSNA16 0:48e80d1e9e1b 178 }
LanierUSNA16 0:48e80d1e9e1b 179 else{
LanierUSNA16 0:48e80d1e9e1b 180 ls7166_cs2 = 0;
LanierUSNA16 0:48e80d1e9e1b 181 }
LanierUSNA16 0:48e80d1e9e1b 182 wait_us(1);
LanierUSNA16 0:48e80d1e9e1b 183 LS7366_cmd(LOAD,CNTR);//
LanierUSNA16 0:48e80d1e9e1b 184 if(chan_num!=2){
LanierUSNA16 0:48e80d1e9e1b 185 ls7166_cs1 = 1;
LanierUSNA16 0:48e80d1e9e1b 186 }
LanierUSNA16 0:48e80d1e9e1b 187 else{
LanierUSNA16 0:48e80d1e9e1b 188 ls7166_cs2 = 1;
LanierUSNA16 0:48e80d1e9e1b 189 }
LanierUSNA16 0:48e80d1e9e1b 190 }
LanierUSNA16 0:48e80d1e9e1b 191 float Ts = 0.01 ; // Specify sampling period
LanierUSNA16 0:48e80d1e9e1b 192
LanierUSNA16 0:48e80d1e9e1b 193 // Arrays for data storage
LanierUSNA16 0:48e80d1e9e1b 194 float etime[1000]; //elapsed time
LanierUSNA16 0:48e80d1e9e1b 195 float ang_pos[1000]; // angular position
LanierUSNA16 0:48e80d1e9e1b 196 Timer t;
LanierUSNA16 0:48e80d1e9e1b 197
LanierUSNA16 0:48e80d1e9e1b 198 // Open "results.M" on the local file system for writing
LanierUSNA16 0:48e80d1e9e1b 199 FILE *fp = fopen("/local/results.M", "w");
LanierUSNA16 0:48e80d1e9e1b 200
LanierUSNA16 0:48e80d1e9e1b 201 float cntr;
LanierUSNA16 0:48e80d1e9e1b 202 float ang;
LanierUSNA16 0:48e80d1e9e1b 203 float dt;
LanierUSNA16 0:48e80d1e9e1b 204 long enc1;
LanierUSNA16 0:48e80d1e9e1b 205 int k;
LanierUSNA16 0:48e80d1e9e1b 206
LanierUSNA16 0:48e80d1e9e1b 207 int main ()
LanierUSNA16 0:48e80d1e9e1b 208 {
LanierUSNA16 0:48e80d1e9e1b 209 pc.baud(921600); //Set up serial port baud rate
LanierUSNA16 0:48e80d1e9e1b 210 spi.frequency(5000000);
LanierUSNA16 0:48e80d1e9e1b 211 LS7366_reset_counter(1);
LanierUSNA16 0:48e80d1e9e1b 212 LS7366_quad_mode_x4(1);
LanierUSNA16 0:48e80d1e9e1b 213 LS7366_write_DTR(1,0);
LanierUSNA16 0:48e80d1e9e1b 214
LanierUSNA16 0:48e80d1e9e1b 215 LS7366_reset_counter(2);
LanierUSNA16 0:48e80d1e9e1b 216 LS7366_quad_mode_x4(2);
LanierUSNA16 0:48e80d1e9e1b 217 LS7366_write_DTR(2,0);
LanierUSNA16 0:48e80d1e9e1b 218 cntr = 0.0; // cntr used to keep track of sample period and elpased time
LanierUSNA16 0:48e80d1e9e1b 219
LanierUSNA16 0:48e80d1e9e1b 220 // initialize data vectors
LanierUSNA16 0:48e80d1e9e1b 221 for(k=0;k<1000;k++)
LanierUSNA16 0:48e80d1e9e1b 222 {
LanierUSNA16 0:48e80d1e9e1b 223 // Insert code
LanierUSNA16 0:48e80d1e9e1b 224 }
LanierUSNA16 0:48e80d1e9e1b 225 k = 0; // Reset index counter
LanierUSNA16 0:48e80d1e9e1b 226
LanierUSNA16 0:48e80d1e9e1b 227 while(cntr <= 1000) {
LanierUSNA16 0:48e80d1e9e1b 228 t.start(); // start measuring comp time
LanierUSNA16 0:48e80d1e9e1b 229
LanierUSNA16 0:48e80d1e9e1b 230 // Read encoder
LanierUSNA16 0:48e80d1e9e1b 231 enc1 = LS7366_read_counter(1);
LanierUSNA16 0:48e80d1e9e1b 232
LanierUSNA16 0:48e80d1e9e1b 233 // Convert from counts to radians
LanierUSNA16 0:48e80d1e9e1b 234 ang = 2*3.14*enc1/4096;
LanierUSNA16 0:48e80d1e9e1b 235 // Log data
LanierUSNA16 0:48e80d1e9e1b 236 etime[k] = cntr*Ts;
LanierUSNA16 0:48e80d1e9e1b 237 ang_pos[k] = ang;
LanierUSNA16 0:48e80d1e9e1b 238 k++;
LanierUSNA16 0:48e80d1e9e1b 239
LanierUSNA16 0:48e80d1e9e1b 240 t.stop(); // end measuring comp time
LanierUSNA16 0:48e80d1e9e1b 241 dt = Ts-t.read();
LanierUSNA16 0:48e80d1e9e1b 242 //printf("%5.2f\n\r",cntr);
LanierUSNA16 0:48e80d1e9e1b 243 pc.printf("%5.2f %5.2f \n\r",cntr*Ts,ang);
LanierUSNA16 0:48e80d1e9e1b 244
LanierUSNA16 0:48e80d1e9e1b 245 t.reset();
LanierUSNA16 0:48e80d1e9e1b 246 cntr=cntr+1;
LanierUSNA16 0:48e80d1e9e1b 247 wait(dt); // wait to ensure sampling period set by Ts
LanierUSNA16 0:48e80d1e9e1b 248 //if (cntr == 200){fclose(fp);}
LanierUSNA16 0:48e80d1e9e1b 249
LanierUSNA16 0:48e80d1e9e1b 250 }//while
LanierUSNA16 0:48e80d1e9e1b 251
LanierUSNA16 0:48e80d1e9e1b 252 // Print out log variables in MATLAB structured variable format.
LanierUSNA16 0:48e80d1e9e1b 253 pc.printf("Printing log variables to file on mBed ... ");
LanierUSNA16 0:48e80d1e9e1b 254 if(1) {
LanierUSNA16 0:48e80d1e9e1b 255 for(k=0; k<1000; k++) {
LanierUSNA16 0:48e80d1e9e1b 256 fprintf(fp,"t(%d,1) = %.5f;\n",k+1,etime[k]);
LanierUSNA16 0:48e80d1e9e1b 257 fprintf(fp,"ang_pos(%d,1) = %.5f;\n",k+1,ang_pos[k]);
LanierUSNA16 0:48e80d1e9e1b 258 }
LanierUSNA16 0:48e80d1e9e1b 259 }
LanierUSNA16 0:48e80d1e9e1b 260 printf("done.\r\n");
LanierUSNA16 0:48e80d1e9e1b 261
LanierUSNA16 0:48e80d1e9e1b 262 // Close file
LanierUSNA16 0:48e80d1e9e1b 263 fclose(fp);
LanierUSNA16 0:48e80d1e9e1b 264
LanierUSNA16 0:48e80d1e9e1b 265 }//main