C Library for mbedWSE project based single board computer for hardware peripherals

Dependents:   Lab7_wse Lab7_wse_student mbed_WSEPRJSBC_EncoderTest mbed_WSEPRJSBC_ADC_test ... more

Weapons and Systems Engineering mbed based single board computer

/media/uploads/jebradshaw/mbedwseprojectsbc_final_small.jpg

Contains C library function listing for hardware peripheral support. Includes functions for +/-10V 12-bit 8-Channel analog-to-digital converter (ADC), 10-bit 2-Channel digital-to-analog converter (DAC), motor control/servo ports, and quadrature encoder ports. Board includes physical Ethernet, USB Host, and CAN bus interfaces. Also includes xbee socket and external I/O pins straight to processor for on-board I2C, SPI, ADC, and DAC.

Schematic

/media/uploads/jebradshaw/mbed_wseprojsbc_schematic_20150211.jpg

Description

This single board computer was designed for the Weapons and Systems Engineering department at the US Naval Academy. The board encompasses a multitude of functional capability for interfacing to a variety of sensors and actuators used in embedded control systems. The board can be powered from a 7-36V DC / AC power supply using a 2.1mm standard barrel connector. The on board bridge rectifier composed of individual diodes allows either polarity on the connector power supply. The four primary external integrated circuits on the board all use the SPI bus for communication. The four primary components are the analog to digital converter, the digital to analog converter, and the two dedicated encoder/counter IC's. The encoder/counter IC's off-load the micro-processor from the burden of external interrupts during high frequency edge detection. The IC's offer 32-bit resolution counting/quadrature decoding, rollover and status information, and index detection for absolute position encoder interfacing. The MAX1270 analog to digital converter (ADC) was chosen for its internal reference and bi-polar voltage input range and scaling program-ability (0-5V, 0-10V, +/-5V, +/-10V). The ADC provides 12-bit resolution at these voltage ranges and are individually channel select-able. Note that careful attention must be used when driving the ADC inputs when in Bipolar operation. An Op-Amp with insufficient current drive capability (milli-amps) will be unable to overcome the internal voltage reference on the input pin due to impedance mismatch/ output current drive capability. This should be checked with an oscilloscope on the input pin if discrepancies between measured voltage values and ADC results exist.

The MAX522 DAC provides 0-5V 10-bit voltage resolution. The range is dependent on the selected 5V board voltage reference source (external 5V switching regulator vs. USB power supply). The board power supply 5V reference can be read by connecting the supply to an external ADC channel and reading the voltage on the 0-10V range.

/media/uploads/jebradshaw/mbed_wseprojsbc_schematic_20140922.pdf - Schematic in PDF

Test Program

/media/uploads/jebradshaw/main_mbedwsesbctest.cpp - Program for testing the library, control the SBC with serial commands

http://developer.mbed.org/users/jebradshaw/code/mbed_WSEPRJSBC_EncoderTest/ - Program for testing the Quadrature Encoder Channels

http://developer.mbed.org/users/jebradshaw/code/mbed_WSEPRJSBC_ADC_test/ - Program to read two channels from the MAX1270 ADC in +/- 10V operation.

http://mbed.org/handbook/Windows-serial-configuration - Link to Serial Driver Installation instructions

Datasheets

/media/uploads/jebradshaw/oki-78sr.pdf - 5V switching regulator

/media/uploads/jebradshaw/ls7366r_w_program.pdf - Encoder IC's

/media/uploads/jebradshaw/max1270.pdf - ADC 8-Channel 12-bit 5V to 10V single/bi-polar input

/media/uploads/jebradshaw/max522.pdf - DAC 2-Channel 0-5V 10-bit

/media/uploads/jebradshaw/mcp2551_can_transceiver.pdf - CAN Transceiver

/media/uploads/jebradshaw/0821-1x1t-36-f.pdf - Ethernet Jack

/media/uploads/jebradshaw/190-009-263r001.pdf - CAN connector

Printed Circuit Board (ExpressPCB)

/media/uploads/jebradshaw/mbedprjv10_20140916.pcb

Partslist (partial)

/media/uploads/jebradshaw/mbedprjv10_partslist.pdf

Committer:
jebradshaw
Date:
Tue Oct 11 17:13:09 2016 +0000
Revision:
14:2564f54c89df
Parent:
13:321d6fdc40e6
updated comments

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jebradshaw 4:1aa4a75f6885 1 /* C Library for the WSE-PROJ-SBC
jebradshaw 4:1aa4a75f6885 2 J Bradshaw
jebradshaw 4:1aa4a75f6885 3 20140912
jebradshaw 4:1aa4a75f6885 4 20140918 J Bradshaw - Found CS mistake in Encoder routines
jebradshaw 4:1aa4a75f6885 5 Added comments in Init function, encoder functions
jebradshaw 12:9041603c430e 6 20150210 J Bradshaw - Initialized DigitalOuts with pre-defined logic
jebradshaw 12:9041603c430e 7 levels (CS's high, etc)
jebradshaw 14:2564f54c89df 8 20161011 J Bradshaw - Changed MAX1270 ADC SCLK to 5MHz and format(12, 0)
jebradshaw 14:2564f54c89df 9 for conversion mode to match datasheet (200ns SCLK max PW high and low)
jebradshaw 4:1aa4a75f6885 10 */
jebradshaw 0:dbd8b5c35d0f 11
jebradshaw 4:1aa4a75f6885 12
jebradshaw 4:1aa4a75f6885 13 // LS7366 ENCODER IC DEFINITIONS
jebradshaw 0:dbd8b5c35d0f 14 //=============================================================================
jebradshaw 0:dbd8b5c35d0f 15 // Four commands for the Instruction Register (B7,B6) - LS7366
jebradshaw 0:dbd8b5c35d0f 16 //=============================================================================
jebradshaw 0:dbd8b5c35d0f 17 #define CLR 0x00 //Clear Instruction
jebradshaw 0:dbd8b5c35d0f 18 #define RD 0x01 //Read Instruction
jebradshaw 0:dbd8b5c35d0f 19 #define WR 0x02 //Write Instruction
jebradshaw 0:dbd8b5c35d0f 20 #define LOAD 0x03 //Load Instruction
jebradshaw 0:dbd8b5c35d0f 21
jebradshaw 0:dbd8b5c35d0f 22 //=============================================================================
jebradshaw 0:dbd8b5c35d0f 23 // Register to Select from the Instruction Register (B5,B4,B3) - LS7366
jebradshaw 0:dbd8b5c35d0f 24 //=============================================================================
jebradshaw 0:dbd8b5c35d0f 25 #define NONE 0x00 //No Register Selected
jebradshaw 0:dbd8b5c35d0f 26 #define MDR0 0x01 //Mode Register 0
jebradshaw 0:dbd8b5c35d0f 27 #define MDR1 0x02 //Mode Register 1
jebradshaw 0:dbd8b5c35d0f 28 #define DTR 0x03 //Data Transfer Register
jebradshaw 0:dbd8b5c35d0f 29 #define CNTR 0x04 //Software Configurable Counter Register
jebradshaw 0:dbd8b5c35d0f 30 #define OTR 0x05 //Output Transfer Register
jebradshaw 0:dbd8b5c35d0f 31 #define STR 0x06 //Status Register
jebradshaw 0:dbd8b5c35d0f 32 #define NONE_REG 0x07 //No Register Selected
jebradshaw 0:dbd8b5c35d0f 33
jebradshaw 0:dbd8b5c35d0f 34 // Set-up hardwired IO
jebradshaw 0:dbd8b5c35d0f 35 SPI spi_max1270(p5, p6, p7);
jebradshaw 0:dbd8b5c35d0f 36 SPI spi(p5, p6, p7);
jebradshaw 11:acf3fcc0d085 37 DigitalOut max1270_cs(p8, 1); //CS for MAX1270 ADC (U3)
jebradshaw 11:acf3fcc0d085 38 DigitalOut max522_cs(p11, 1); //CS for MAX522 DAC (U5)
jebradshaw 0:dbd8b5c35d0f 39
jebradshaw 11:acf3fcc0d085 40 DigitalOut ls7166_cs1(p19, 1); //CS for LS7366-1 (U8)
jebradshaw 11:acf3fcc0d085 41 DigitalOut ls7166_cs2(p20, 1); //CS for LS7366-2 (U9)
jebradshaw 0:dbd8b5c35d0f 42
jebradshaw 11:acf3fcc0d085 43 DigitalOut mot1_ph1(p21, 0);
jebradshaw 11:acf3fcc0d085 44 DigitalOut mot1_ph2(p22, 0);
jebradshaw 0:dbd8b5c35d0f 45 PwmOut mot_en1(p23);
jebradshaw 0:dbd8b5c35d0f 46
jebradshaw 11:acf3fcc0d085 47 DigitalOut mot2_ph1(p24, 0);
jebradshaw 11:acf3fcc0d085 48 DigitalOut mot2_ph2(p25, 0);
jebradshaw 0:dbd8b5c35d0f 49 PwmOut mot_en2(p26);
jebradshaw 0:dbd8b5c35d0f 50
jebradshaw 11:acf3fcc0d085 51 DigitalOut led1(LED1, 0);
jebradshaw 11:acf3fcc0d085 52 DigitalOut led2(LED2, 0);
jebradshaw 11:acf3fcc0d085 53 DigitalOut led3(LED3, 0);
jebradshaw 11:acf3fcc0d085 54 DigitalOut led4(LED4, 0);
jebradshaw 0:dbd8b5c35d0f 55
jebradshaw 0:dbd8b5c35d0f 56 Serial pc(USBTX, USBRX); // tx, rx for serial USB interface to pc
jebradshaw 0:dbd8b5c35d0f 57 Serial xbee(p13, p14); // tx, rx for Xbee
jebradshaw 0:dbd8b5c35d0f 58 Timer t; // create timer instance
jebradshaw 0:dbd8b5c35d0f 59
jebradshaw 0:dbd8b5c35d0f 60 // ------ Prototypes -----------
jebradshaw 0:dbd8b5c35d0f 61 int read_max1270(int chan, int range, int bipol);
jebradshaw 0:dbd8b5c35d0f 62 float read_max1270_volts(int chan, int range, int bipol);
jebradshaw 0:dbd8b5c35d0f 63 void mot_control(int drv_num, float dc);
jebradshaw 0:dbd8b5c35d0f 64 void LS7366_cmd(int inst, int reg);
jebradshaw 0:dbd8b5c35d0f 65 long LS7366_read_counter(int chan_num);
jebradshaw 0:dbd8b5c35d0f 66 void LS7366_quad_mode_x4(int chan_num);
jebradshaw 0:dbd8b5c35d0f 67 void LS7366_reset_counter(int chan_num);
jebradshaw 0:dbd8b5c35d0f 68 void LS7366_write_DTR(int chan_num,long enc_value);
jebradshaw 0:dbd8b5c35d0f 69 void write_max522(int chan, float volts);
jebradshaw 0:dbd8b5c35d0f 70
jebradshaw 0:dbd8b5c35d0f 71 //---- Function Listing -------------------------------
jebradshaw 0:dbd8b5c35d0f 72 int read_max1270(int chan, int range, int bipol){
jebradshaw 0:dbd8b5c35d0f 73 int cword=0x80; //set the start bit
jebradshaw 0:dbd8b5c35d0f 74
jebradshaw 14:2564f54c89df 75 spi_max1270.frequency(5000000); //5MHz Max
jebradshaw 0:dbd8b5c35d0f 76 spi_max1270.format(8, 0); // 8 data bits, CPOL0, and CPHA0 (datasheet Digital Interface)
jebradshaw 0:dbd8b5c35d0f 77
jebradshaw 0:dbd8b5c35d0f 78 cword |= (chan << 4); //shift channel
jebradshaw 0:dbd8b5c35d0f 79 cword |= (range << 3);
jebradshaw 0:dbd8b5c35d0f 80 cword |= (bipol << 2);
jebradshaw 0:dbd8b5c35d0f 81
jebradshaw 0:dbd8b5c35d0f 82 max1270_cs = 0;
jebradshaw 0:dbd8b5c35d0f 83
jebradshaw 0:dbd8b5c35d0f 84 spi_max1270.write(cword);
jebradshaw 14:2564f54c89df 85 wait_us(15); //15us
jebradshaw 13:321d6fdc40e6 86 spi_max1270.format(12, 0);
jebradshaw 0:dbd8b5c35d0f 87
jebradshaw 0:dbd8b5c35d0f 88 int result = spi_max1270.write(0);
jebradshaw 0:dbd8b5c35d0f 89
jebradshaw 0:dbd8b5c35d0f 90 max1270_cs = 1;
jebradshaw 0:dbd8b5c35d0f 91 spi_max1270.format(8, 0);
jebradshaw 0:dbd8b5c35d0f 92 return result;
jebradshaw 0:dbd8b5c35d0f 93 }
jebradshaw 0:dbd8b5c35d0f 94
jebradshaw 0:dbd8b5c35d0f 95 float read_max1270_volts(int chan, int range, int bipol){
jebradshaw 0:dbd8b5c35d0f 96 float rangevolts=0.0;
jebradshaw 0:dbd8b5c35d0f 97 float volts=0.0;
jebradshaw 0:dbd8b5c35d0f 98 int adc_res;
jebradshaw 0:dbd8b5c35d0f 99
jebradshaw 0:dbd8b5c35d0f 100 //read the ADC converter
jebradshaw 0:dbd8b5c35d0f 101 adc_res = read_max1270(chan, range, bipol) & 0xFFF;
jebradshaw 0:dbd8b5c35d0f 102
jebradshaw 0:dbd8b5c35d0f 103 //Determine the voltage range
jebradshaw 0:dbd8b5c35d0f 104 if(range) //RNG bit
jebradshaw 0:dbd8b5c35d0f 105 rangevolts=10.0;
jebradshaw 0:dbd8b5c35d0f 106 else
jebradshaw 0:dbd8b5c35d0f 107 rangevolts=5.0;
jebradshaw 0:dbd8b5c35d0f 108
jebradshaw 0:dbd8b5c35d0f 109 //bi-polar input range
jebradshaw 0:dbd8b5c35d0f 110 if(bipol){ //BIP is set, input is +/-
jebradshaw 0:dbd8b5c35d0f 111 if(adc_res < 0x800){ //if result was positive
jebradshaw 0:dbd8b5c35d0f 112 volts = ((float)adc_res/0x7FF) * rangevolts;
jebradshaw 0:dbd8b5c35d0f 113 }
jebradshaw 0:dbd8b5c35d0f 114 else{ //result was negative
jebradshaw 0:dbd8b5c35d0f 115 volts = -(-((float)adc_res/0x7FF) * rangevolts) - (rangevolts * 2.0);
jebradshaw 0:dbd8b5c35d0f 116 }
jebradshaw 0:dbd8b5c35d0f 117 }
jebradshaw 0:dbd8b5c35d0f 118 else{ //input is positive polarity only
jebradshaw 0:dbd8b5c35d0f 119 volts = ((float)adc_res/0xFFF) * rangevolts;
jebradshaw 0:dbd8b5c35d0f 120 }
jebradshaw 0:dbd8b5c35d0f 121
jebradshaw 0:dbd8b5c35d0f 122 return volts;
jebradshaw 0:dbd8b5c35d0f 123 }
jebradshaw 0:dbd8b5c35d0f 124
jebradshaw 0:dbd8b5c35d0f 125 //Motor control routine for PWM on 5 pin motor driver header
jebradshaw 0:dbd8b5c35d0f 126 // drv_num is 1 or 2 (defaults to 1, anything but 2)
jebradshaw 0:dbd8b5c35d0f 127 // dc is signed duty cycle (+/-1.0)
jebradshaw 0:dbd8b5c35d0f 128
jebradshaw 0:dbd8b5c35d0f 129 void mot_control(int drv_num, float dc){
jebradshaw 0:dbd8b5c35d0f 130 if(dc>1.0)
jebradshaw 0:dbd8b5c35d0f 131 dc=1.0;
jebradshaw 0:dbd8b5c35d0f 132 if(dc<-1.0)
jebradshaw 0:dbd8b5c35d0f 133 dc=-1.0;
jebradshaw 0:dbd8b5c35d0f 134
jebradshaw 0:dbd8b5c35d0f 135 if(drv_num != 2){
jebradshaw 0:dbd8b5c35d0f 136 if(dc > 0.0){
jebradshaw 0:dbd8b5c35d0f 137 mot1_ph2 = 0;
jebradshaw 0:dbd8b5c35d0f 138 mot1_ph1 = 1;
jebradshaw 0:dbd8b5c35d0f 139 mot_en1 = dc;
jebradshaw 0:dbd8b5c35d0f 140 }
jebradshaw 0:dbd8b5c35d0f 141 else if(dc < -0.0){
jebradshaw 0:dbd8b5c35d0f 142 mot1_ph1 = 0;
jebradshaw 0:dbd8b5c35d0f 143 mot1_ph2 = 1;
jebradshaw 0:dbd8b5c35d0f 144 mot_en1 = abs(dc);
jebradshaw 0:dbd8b5c35d0f 145 }
jebradshaw 0:dbd8b5c35d0f 146 else{
jebradshaw 0:dbd8b5c35d0f 147 mot1_ph1 = 0;
jebradshaw 0:dbd8b5c35d0f 148 mot1_ph2 = 0;
jebradshaw 0:dbd8b5c35d0f 149 mot_en1 = 0.0;
jebradshaw 0:dbd8b5c35d0f 150 }
jebradshaw 0:dbd8b5c35d0f 151 }
jebradshaw 0:dbd8b5c35d0f 152 else{
jebradshaw 0:dbd8b5c35d0f 153 if(dc > 0.0){
jebradshaw 0:dbd8b5c35d0f 154 mot2_ph2 = 0;
jebradshaw 0:dbd8b5c35d0f 155 mot2_ph1 = 1;
jebradshaw 0:dbd8b5c35d0f 156 mot_en2 = dc;
jebradshaw 0:dbd8b5c35d0f 157 }
jebradshaw 0:dbd8b5c35d0f 158 else if(dc < -0.0){
jebradshaw 0:dbd8b5c35d0f 159 mot2_ph1 = 0;
jebradshaw 0:dbd8b5c35d0f 160 mot2_ph2 = 1;
jebradshaw 0:dbd8b5c35d0f 161 mot_en2 = abs(dc);
jebradshaw 0:dbd8b5c35d0f 162 }
jebradshaw 0:dbd8b5c35d0f 163 else{
jebradshaw 0:dbd8b5c35d0f 164 mot2_ph1 = 0;
jebradshaw 0:dbd8b5c35d0f 165 mot2_ph2 = 0;
jebradshaw 0:dbd8b5c35d0f 166 mot_en2 = 0.0;
jebradshaw 0:dbd8b5c35d0f 167 }
jebradshaw 0:dbd8b5c35d0f 168 }
jebradshaw 0:dbd8b5c35d0f 169 }
jebradshaw 0:dbd8b5c35d0f 170
jebradshaw 0:dbd8b5c35d0f 171 //----- LS7366 Encoder/Counter Routines --------------------
jebradshaw 0:dbd8b5c35d0f 172 void LS7366_cmd(int inst, int reg){
jebradshaw 0:dbd8b5c35d0f 173 char cmd;
jebradshaw 0:dbd8b5c35d0f 174
jebradshaw 0:dbd8b5c35d0f 175 spi.format(8, 0);
jebradshaw 0:dbd8b5c35d0f 176 spi.frequency(2000000);
jebradshaw 0:dbd8b5c35d0f 177 cmd = (inst << 6) | (reg << 3);
jebradshaw 0:dbd8b5c35d0f 178 // printf("\r\ncmd=0X%2X", cmd);
jebradshaw 0:dbd8b5c35d0f 179 spi.write(cmd);
jebradshaw 0:dbd8b5c35d0f 180 }
jebradshaw 0:dbd8b5c35d0f 181
jebradshaw 0:dbd8b5c35d0f 182 long LS7366_read_counter(int chan_num){
jebradshaw 0:dbd8b5c35d0f 183 union bytes{
jebradshaw 0:dbd8b5c35d0f 184 char byte_enc[4];
jebradshaw 0:dbd8b5c35d0f 185 long long_enc;
jebradshaw 0:dbd8b5c35d0f 186 }counter;
jebradshaw 0:dbd8b5c35d0f 187
jebradshaw 0:dbd8b5c35d0f 188 counter.long_enc = 0;
jebradshaw 0:dbd8b5c35d0f 189
jebradshaw 0:dbd8b5c35d0f 190 spi.format(8, 0);
jebradshaw 0:dbd8b5c35d0f 191 spi.frequency(2000000);
jebradshaw 0:dbd8b5c35d0f 192
jebradshaw 0:dbd8b5c35d0f 193 if(chan_num!=2){
jebradshaw 0:dbd8b5c35d0f 194 ls7166_cs1 = 0;
jebradshaw 0:dbd8b5c35d0f 195 wait_us(1);
jebradshaw 0:dbd8b5c35d0f 196 LS7366_cmd(LOAD,OTR);//cmd = 0xe8, LOAD to OTR
jebradshaw 0:dbd8b5c35d0f 197 ls7166_cs1 = 1;
jebradshaw 0:dbd8b5c35d0f 198 wait_us(1);
jebradshaw 0:dbd8b5c35d0f 199 ls7166_cs1 = 0;
jebradshaw 0:dbd8b5c35d0f 200 }
jebradshaw 0:dbd8b5c35d0f 201 else{
jebradshaw 0:dbd8b5c35d0f 202 ls7166_cs2 = 0;
jebradshaw 0:dbd8b5c35d0f 203 wait_us(1);
jebradshaw 0:dbd8b5c35d0f 204 LS7366_cmd(LOAD,OTR);//cmd = 0xe8, LOAD to OTR
jebradshaw 0:dbd8b5c35d0f 205 ls7166_cs2 = 1;
jebradshaw 0:dbd8b5c35d0f 206 wait_us(1);
jebradshaw 0:dbd8b5c35d0f 207
jebradshaw 0:dbd8b5c35d0f 208 ls7166_cs2 = 0;
jebradshaw 0:dbd8b5c35d0f 209 }
jebradshaw 0:dbd8b5c35d0f 210 wait_us(1);
jebradshaw 0:dbd8b5c35d0f 211 LS7366_cmd(RD,CNTR); //cmd = 0x60, READ from CNTR
jebradshaw 0:dbd8b5c35d0f 212 counter.byte_enc[3] = spi.write(0x00);
jebradshaw 0:dbd8b5c35d0f 213 counter.byte_enc[2] = spi.write(0x00);
jebradshaw 0:dbd8b5c35d0f 214 counter.byte_enc[1] = spi.write(0x00);
jebradshaw 0:dbd8b5c35d0f 215 counter.byte_enc[0] = spi.write(0x00);
jebradshaw 0:dbd8b5c35d0f 216
jebradshaw 0:dbd8b5c35d0f 217 if(chan_num!=2){
jebradshaw 0:dbd8b5c35d0f 218 ls7166_cs1 = 1;
jebradshaw 0:dbd8b5c35d0f 219 }
jebradshaw 0:dbd8b5c35d0f 220 else{
jebradshaw 0:dbd8b5c35d0f 221 ls7166_cs2 = 1;
jebradshaw 0:dbd8b5c35d0f 222 }
jebradshaw 0:dbd8b5c35d0f 223
jebradshaw 0:dbd8b5c35d0f 224 return counter.long_enc; //return count
jebradshaw 0:dbd8b5c35d0f 225 }
jebradshaw 0:dbd8b5c35d0f 226
jebradshaw 0:dbd8b5c35d0f 227 void LS7366_quad_mode_x4(int chan_num){
jebradshaw 0:dbd8b5c35d0f 228
jebradshaw 0:dbd8b5c35d0f 229 spi.format(8, 0);
jebradshaw 0:dbd8b5c35d0f 230 spi.frequency(2000000);
jebradshaw 0:dbd8b5c35d0f 231
jebradshaw 0:dbd8b5c35d0f 232 if(chan_num!=2){
jebradshaw 0:dbd8b5c35d0f 233 ls7166_cs1 = 0;
jebradshaw 0:dbd8b5c35d0f 234 }
jebradshaw 0:dbd8b5c35d0f 235 else{
jebradshaw 0:dbd8b5c35d0f 236 ls7166_cs2 = 0;
jebradshaw 0:dbd8b5c35d0f 237 }
jebradshaw 0:dbd8b5c35d0f 238 wait_us(1);
jebradshaw 0:dbd8b5c35d0f 239 LS7366_cmd(WR,MDR0);// Write to the MDR0 register
jebradshaw 4:1aa4a75f6885 240 wait_us(1);
jebradshaw 0:dbd8b5c35d0f 241 spi.write(0x03); // X4 quadrature count mode
jebradshaw 0:dbd8b5c35d0f 242 if(chan_num!=2){
jebradshaw 0:dbd8b5c35d0f 243 ls7166_cs1 = 1;
jebradshaw 0:dbd8b5c35d0f 244 }
jebradshaw 0:dbd8b5c35d0f 245 else{
jebradshaw 0:dbd8b5c35d0f 246 ls7166_cs2 = 1;
jebradshaw 0:dbd8b5c35d0f 247 }
jebradshaw 0:dbd8b5c35d0f 248 }
jebradshaw 0:dbd8b5c35d0f 249
jebradshaw 4:1aa4a75f6885 250 void LS7366_reset_counter(int chan_num){
jebradshaw 4:1aa4a75f6885 251 spi.format(8, 0); // set up SPI for 8 data bits, mode 0
jebradshaw 4:1aa4a75f6885 252 spi.frequency(2000000); // 2MHz SPI clock
jebradshaw 0:dbd8b5c35d0f 253
jebradshaw 4:1aa4a75f6885 254 if(chan_num!=2){ // activate chip select
jebradshaw 0:dbd8b5c35d0f 255 ls7166_cs1 = 0;
jebradshaw 0:dbd8b5c35d0f 256 }
jebradshaw 0:dbd8b5c35d0f 257 else{
jebradshaw 0:dbd8b5c35d0f 258 ls7166_cs2 = 0;
jebradshaw 0:dbd8b5c35d0f 259 }
jebradshaw 4:1aa4a75f6885 260 wait_us(1); // short delay
jebradshaw 4:1aa4a75f6885 261 LS7366_cmd(CLR,CNTR); // Clear the counter register
jebradshaw 4:1aa4a75f6885 262 if(chan_num!=2){ // de-activate chip select
jebradshaw 0:dbd8b5c35d0f 263 ls7166_cs1 = 1;
jebradshaw 0:dbd8b5c35d0f 264 }
jebradshaw 0:dbd8b5c35d0f 265 else{
jebradshaw 4:1aa4a75f6885 266 ls7166_cs2 = 1;
jebradshaw 0:dbd8b5c35d0f 267 }
jebradshaw 4:1aa4a75f6885 268 wait_us(1); // short delay
jebradshaw 0:dbd8b5c35d0f 269
jebradshaw 4:1aa4a75f6885 270 if(chan_num!=2){ // activate chip select
jebradshaw 0:dbd8b5c35d0f 271 ls7166_cs1 = 0;
jebradshaw 0:dbd8b5c35d0f 272 }
jebradshaw 0:dbd8b5c35d0f 273 else{
jebradshaw 0:dbd8b5c35d0f 274 ls7166_cs2 = 0;
jebradshaw 0:dbd8b5c35d0f 275 }
jebradshaw 4:1aa4a75f6885 276 wait_us(1); // short delay
jebradshaw 4:1aa4a75f6885 277 LS7366_cmd(LOAD,CNTR); // load counter reg
jebradshaw 4:1aa4a75f6885 278 if(chan_num!=2){ // de-activate chip select
jebradshaw 0:dbd8b5c35d0f 279 ls7166_cs1 = 1;
jebradshaw 0:dbd8b5c35d0f 280 }
jebradshaw 0:dbd8b5c35d0f 281 else{
jebradshaw 4:1aa4a75f6885 282 ls7166_cs2 = 1;
jebradshaw 0:dbd8b5c35d0f 283 }
jebradshaw 0:dbd8b5c35d0f 284 }
jebradshaw 0:dbd8b5c35d0f 285
jebradshaw 4:1aa4a75f6885 286 void LS7366_write_DTR(int chan_num, long enc_value){
jebradshaw 4:1aa4a75f6885 287 union bytes // Union to speed up byte writes
jebradshaw 0:dbd8b5c35d0f 288 {
jebradshaw 0:dbd8b5c35d0f 289 char byte_enc[4];
jebradshaw 0:dbd8b5c35d0f 290 long long_enc;
jebradshaw 0:dbd8b5c35d0f 291 }counter;
jebradshaw 0:dbd8b5c35d0f 292
jebradshaw 4:1aa4a75f6885 293 spi.format(8, 0); // set up SPI for 8 data bits, mode 0
jebradshaw 4:1aa4a75f6885 294 spi.frequency(2000000); // 2MHz SPI clock
jebradshaw 0:dbd8b5c35d0f 295
jebradshaw 4:1aa4a75f6885 296 counter.long_enc = enc_value; // pass enc_value to Union
jebradshaw 0:dbd8b5c35d0f 297
jebradshaw 4:1aa4a75f6885 298 if(chan_num!=2){ // activate chip select
jebradshaw 0:dbd8b5c35d0f 299 ls7166_cs1 = 0;
jebradshaw 0:dbd8b5c35d0f 300 }
jebradshaw 0:dbd8b5c35d0f 301 else{
jebradshaw 0:dbd8b5c35d0f 302 ls7166_cs2 = 0;
jebradshaw 0:dbd8b5c35d0f 303 }
jebradshaw 4:1aa4a75f6885 304 wait_us(1); // short delay
jebradshaw 4:1aa4a75f6885 305 LS7366_cmd(WR,DTR); // Write to the Data Transfer Register
jebradshaw 4:1aa4a75f6885 306 spi.write(counter.byte_enc[3]); // Write the 32-bit encoder value
jebradshaw 0:dbd8b5c35d0f 307 spi.write(counter.byte_enc[2]);
jebradshaw 0:dbd8b5c35d0f 308 spi.write(counter.byte_enc[1]);
jebradshaw 0:dbd8b5c35d0f 309 spi.write(counter.byte_enc[0]);
jebradshaw 4:1aa4a75f6885 310 if(chan_num!=2){ // de-activate the chip select
jebradshaw 0:dbd8b5c35d0f 311 ls7166_cs1 = 1;
jebradshaw 0:dbd8b5c35d0f 312 }
jebradshaw 0:dbd8b5c35d0f 313 else{
jebradshaw 0:dbd8b5c35d0f 314 ls7166_cs2 = 1;
jebradshaw 0:dbd8b5c35d0f 315 }
jebradshaw 0:dbd8b5c35d0f 316
jebradshaw 4:1aa4a75f6885 317 wait_us(1); // short delay
jebradshaw 4:1aa4a75f6885 318 if(chan_num!=2){ // activate chip select
jebradshaw 0:dbd8b5c35d0f 319 ls7166_cs1 = 0;
jebradshaw 0:dbd8b5c35d0f 320 }
jebradshaw 0:dbd8b5c35d0f 321 else{
jebradshaw 0:dbd8b5c35d0f 322 ls7166_cs2 = 0;
jebradshaw 0:dbd8b5c35d0f 323 }
jebradshaw 4:1aa4a75f6885 324 wait_us(1); // short delay
jebradshaw 4:1aa4a75f6885 325 LS7366_cmd(LOAD,CNTR); // load command to the counter register from DTR
jebradshaw 4:1aa4a75f6885 326 if(chan_num!=2){ // de-activate chip select
jebradshaw 0:dbd8b5c35d0f 327 ls7166_cs1 = 1;
jebradshaw 0:dbd8b5c35d0f 328 }
jebradshaw 0:dbd8b5c35d0f 329 else{
jebradshaw 0:dbd8b5c35d0f 330 ls7166_cs2 = 1;
jebradshaw 0:dbd8b5c35d0f 331 }
jebradshaw 0:dbd8b5c35d0f 332 }
jebradshaw 0:dbd8b5c35d0f 333
jebradshaw 0:dbd8b5c35d0f 334 //------- MAX522 routines ---------------------------------
jebradshaw 0:dbd8b5c35d0f 335 void write_max522(int chan, float volts){
jebradshaw 0:dbd8b5c35d0f 336 int cmd=0x20; //set UB3
jebradshaw 0:dbd8b5c35d0f 337 int data_word = (int)((volts/5.0) * 256.0);
jebradshaw 0:dbd8b5c35d0f 338 if(chan != 2)
jebradshaw 0:dbd8b5c35d0f 339 cmd |= 0x01; //set DAC A out
jebradshaw 0:dbd8b5c35d0f 340 else
jebradshaw 0:dbd8b5c35d0f 341 cmd |= 0x02; //set DACB out
jebradshaw 0:dbd8b5c35d0f 342
jebradshaw 0:dbd8b5c35d0f 343 // pc.printf("cmd=0x%4X data_word=0x%4X \r\n", cmd, data_word);
jebradshaw 0:dbd8b5c35d0f 344
jebradshaw 0:dbd8b5c35d0f 345 spi.format(8, 0);
jebradshaw 0:dbd8b5c35d0f 346 spi.frequency(2000000);
jebradshaw 0:dbd8b5c35d0f 347 max522_cs = 0;
jebradshaw 0:dbd8b5c35d0f 348 spi.write(cmd & 0xFF);
jebradshaw 0:dbd8b5c35d0f 349 spi.write(data_word & 0xFF);
jebradshaw 0:dbd8b5c35d0f 350 max522_cs = 1;
jebradshaw 0:dbd8b5c35d0f 351 }
jebradshaw 0:dbd8b5c35d0f 352
jebradshaw 1:85cd6d500385 353 void mbedWSEsbcInit(unsigned long pcbaud){
jebradshaw 4:1aa4a75f6885 354 led1 = 0; //Initialize all LEDs as off
jebradshaw 4:1aa4a75f6885 355 led2 = 0;
jebradshaw 4:1aa4a75f6885 356 led3 = 0;
jebradshaw 4:1aa4a75f6885 357 led4 = 0;
jebradshaw 4:1aa4a75f6885 358 max1270_cs = 1; //Initialize all chip selects as off
jebradshaw 0:dbd8b5c35d0f 359 max522_cs = 1;
jebradshaw 0:dbd8b5c35d0f 360 ls7166_cs1 = 1;
jebradshaw 0:dbd8b5c35d0f 361 ls7166_cs2 = 1;
jebradshaw 0:dbd8b5c35d0f 362
jebradshaw 0:dbd8b5c35d0f 363 wait(.2); //delay at beginning for voltage settle purposes
jebradshaw 0:dbd8b5c35d0f 364
jebradshaw 4:1aa4a75f6885 365 mot_en1.period_us(50); //20KHz for DC motor control PWM
jebradshaw 1:85cd6d500385 366 pc.baud(pcbaud); //Set up serial port baud rate
jebradshaw 4:1aa4a75f6885 367 pc.printf("\r\n");
jebradshaw 0:dbd8b5c35d0f 368 xbee.baud(9600);
jebradshaw 0:dbd8b5c35d0f 369
jebradshaw 0:dbd8b5c35d0f 370 LS7366_reset_counter(1);
jebradshaw 0:dbd8b5c35d0f 371 LS7366_quad_mode_x4(1);
jebradshaw 0:dbd8b5c35d0f 372 LS7366_write_DTR(1,0);
jebradshaw 0:dbd8b5c35d0f 373
jebradshaw 0:dbd8b5c35d0f 374 LS7366_reset_counter(2);
jebradshaw 0:dbd8b5c35d0f 375 LS7366_quad_mode_x4(2);
jebradshaw 0:dbd8b5c35d0f 376 LS7366_write_DTR(2,0);
jebradshaw 0:dbd8b5c35d0f 377
jebradshaw 0:dbd8b5c35d0f 378 t.start(); // Set up timer
jebradshaw 0:dbd8b5c35d0f 379 }//mbedWSEsbc_init()