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:
Fri Sep 12 16:10:10 2014 +0000
Revision:
0:dbd8b5c35d0f
Child:
1:85cd6d500385
First C library for mbed WSE project SBC and exercise program.

Who changed what in which revision?

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