C Library for mbedWSE project based single board computer for hardware peripherals
Dependents: cts_matlab_interface
Diff: mbedWSEsbc.h
- Revision:
- 0:dbd8b5c35d0f
- Child:
- 1:85cd6d500385
diff -r 000000000000 -r dbd8b5c35d0f mbedWSEsbc.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbedWSEsbc.h Fri Sep 12 16:10:10 2014 +0000 @@ -0,0 +1,368 @@ +// C Library for the WSE-PROJ-SBC +// J Bradshaw +// 20140912 + +//============================================================================= +// Four commands for the Instruction Register (B7,B6) - LS7366 +//============================================================================= +#define CLR 0x00 //Clear Instruction +#define RD 0x01 //Read Instruction +#define WR 0x02 //Write Instruction +#define LOAD 0x03 //Load Instruction + +//============================================================================= +// Register to Select from the Instruction Register (B5,B4,B3) - LS7366 +//============================================================================= +#define NONE 0x00 //No Register Selected +#define MDR0 0x01 //Mode Register 0 +#define MDR1 0x02 //Mode Register 1 +#define DTR 0x03 //Data Transfer Register +#define CNTR 0x04 //Software Configurable Counter Register +#define OTR 0x05 //Output Transfer Register +#define STR 0x06 //Status Register +#define NONE_REG 0x07 //No Register Selected + +// Set-up hardwired IO +SPI spi_max1270(p5, p6, p7); +SPI spi(p5, p6, p7); +DigitalOut max1270_cs(p8); //MAX1270 ADC CS +DigitalOut max522_cs(p11); //MAX522 DAC CS + +DigitalOut ls7166_cs1(p19); //CS for LS7366 +DigitalOut ls7166_cs2(p20); //CS for LS7366 + +DigitalOut mot1_ph1(p21); +DigitalOut mot1_ph2(p22); +PwmOut mot_en1(p23); + +DigitalOut mot2_ph1(p24); +DigitalOut mot2_ph2(p25); +PwmOut mot_en2(p26); + +DigitalOut led1(LED1); +DigitalOut led2(LED2); +DigitalOut led3(LED3); +DigitalOut led4(LED4); + +Serial pc(USBTX, USBRX); // tx, rx for serial USB interface to pc +Serial xbee(p13, p14); // tx, rx for Xbee +Timer t; // create timer instance + +// ------ Prototypes ----------- +int read_max1270(int chan, int range, int bipol); +float read_max1270_volts(int chan, int range, int bipol); +void mot_control(int drv_num, float dc); +void LS7366_cmd(int inst, int reg); +long LS7366_read_counter(int chan_num); +void LS7366_quad_mode_x4(int chan_num); +void LS7366_reset_counter(int chan_num); +void LS7366_write_DTR(int chan_num,long enc_value); +void write_max522(int chan, float volts); + +//---- Function Listing ------------------------------- +int read_max1270(int chan, int range, int bipol){ + int cword=0x80; //set the start bit + + spi_max1270.frequency(10000000); + spi_max1270.format(8, 0); // 8 data bits, CPOL0, and CPHA0 (datasheet Digital Interface) + + cword |= (chan << 4); //shift channel + cword |= (range << 3); + cword |= (bipol << 2); + + max1270_cs = 0; + + spi_max1270.write(cword); + wait_us(15); //15us + spi_max1270.format(12, 3); + + int result = spi_max1270.write(0); + + max1270_cs = 1; + spi_max1270.format(8, 0); + return result; +} + +float read_max1270_volts(int chan, int range, int bipol){ + float rangevolts=0.0; + float volts=0.0; + int adc_res; + + //read the ADC converter + adc_res = read_max1270(chan, range, bipol) & 0xFFF; + + //Determine the voltage range + if(range) //RNG bit + rangevolts=10.0; + else + rangevolts=5.0; + + //bi-polar input range + if(bipol){ //BIP is set, input is +/- + if(adc_res < 0x800){ //if result was positive + volts = ((float)adc_res/0x7FF) * rangevolts; + } + else{ //result was negative + volts = -(-((float)adc_res/0x7FF) * rangevolts) - (rangevolts * 2.0); + } + } + else{ //input is positive polarity only + volts = ((float)adc_res/0xFFF) * rangevolts; + } + + return volts; +} + +//Motor control routine for PWM on 5 pin motor driver header +// drv_num is 1 or 2 (defaults to 1, anything but 2) +// dc is signed duty cycle (+/-1.0) + +void mot_control(int drv_num, float dc){ + if(dc>1.0) + dc=1.0; + if(dc<-1.0) + dc=-1.0; + + if(drv_num != 2){ + if(dc > 0.0){ + mot1_ph2 = 0; + mot1_ph1 = 1; + mot_en1 = dc; + } + else if(dc < -0.0){ + mot1_ph1 = 0; + mot1_ph2 = 1; + mot_en1 = abs(dc); + } + else{ + mot1_ph1 = 0; + mot1_ph2 = 0; + mot_en1 = 0.0; + } + } + else{ + if(dc > 0.0){ + mot2_ph2 = 0; + mot2_ph1 = 1; + mot_en2 = dc; + } + else if(dc < -0.0){ + mot2_ph1 = 0; + mot2_ph2 = 1; + mot_en2 = abs(dc); + } + else{ + mot2_ph1 = 0; + mot2_ph2 = 0; + mot_en2 = 0.0; + } + } +} + +//----- LS7366 Encoder/Counter Routines -------------------- +void LS7366_cmd(int inst, int reg){ + char cmd; + + spi.format(8, 0); + spi.frequency(2000000); + cmd = (inst << 6) | (reg << 3); +// printf("\r\ncmd=0X%2X", cmd); + spi.write(cmd); +} + +long LS7366_read_counter(int chan_num){ + union bytes{ + char byte_enc[4]; + long long_enc; + }counter; + + counter.long_enc = 0; + + spi.format(8, 0); + spi.frequency(2000000); + + if(chan_num!=2){ + ls7166_cs1 = 0; + wait_us(1); + LS7366_cmd(LOAD,OTR);//cmd = 0xe8, LOAD to OTR + ls7166_cs1 = 1; + wait_us(1); + ls7166_cs1 = 0; + } + else{ + ls7166_cs2 = 0; + wait_us(1); + LS7366_cmd(LOAD,OTR);//cmd = 0xe8, LOAD to OTR + ls7166_cs2 = 1; + wait_us(1); + + ls7166_cs2 = 0; + } + wait_us(1); + LS7366_cmd(RD,CNTR); //cmd = 0x60, READ from CNTR + counter.byte_enc[3] = spi.write(0x00); + counter.byte_enc[2] = spi.write(0x00); + counter.byte_enc[1] = spi.write(0x00); + counter.byte_enc[0] = spi.write(0x00); + + if(chan_num!=2){ + ls7166_cs1 = 1; + } + else{ + ls7166_cs2 = 1; + } + + return counter.long_enc; //return count +} + +void LS7366_quad_mode_x4(int chan_num){ + + spi.format(8, 0); + spi.frequency(2000000); + + if(chan_num!=2){ + ls7166_cs1 = 0; + } + else{ + ls7166_cs2 = 0; + } + wait_us(1); + LS7366_cmd(WR,MDR0);// Write to the MDR0 register + spi.write(0x03); // X4 quadrature count mode + if(chan_num!=2){ + ls7166_cs1 = 1; + } + else{ + ls7166_cs2 = 1; + } +} + +void LS7366_reset_counter(int chan_num){ + + spi.format(8, 0); + spi.frequency(2000000); + + if(chan_num!=2){ + ls7166_cs1 = 0; + } + else{ + ls7166_cs2 = 0; + } + wait_us(1); + LS7366_cmd(CLR,CNTR);//Clear the counter register + if(chan_num!=2){ + ls7166_cs1 = 1; + } + else{ + ls7166_cs2 = 1; + } + wait_us(1); + + if(chan_num!=2){ + ls7166_cs1 = 0; + } + else{ + ls7166_cs2 = 0; + } + wait_us(1); + LS7366_cmd(LOAD,CNTR);// + if(chan_num!=2){ + ls7166_cs1 = 1; + } + else{ + ls7166_cs1 = 1; + } +} + +void LS7366_write_DTR(int chan_num,long enc_value){ + union bytes + { + char byte_enc[4]; + long long_enc; + }counter; + + spi.format(8, 0); + spi.frequency(2000000); + + counter.long_enc = enc_value; + + if(chan_num!=2){ + ls7166_cs1 = 0; + } + else{ + ls7166_cs2 = 0; + } + wait_us(1); + LS7366_cmd(WR,DTR);// + spi.write(counter.byte_enc[3]); + spi.write(counter.byte_enc[2]); + spi.write(counter.byte_enc[1]); + spi.write(counter.byte_enc[0]); + if(chan_num!=2){ + ls7166_cs1 = 1; + } + else{ + ls7166_cs2 = 1; + } + + wait_us(1); + if(chan_num!=2){ + ls7166_cs1 = 0; + } + else{ + ls7166_cs2 = 0; + } + wait_us(1); + LS7366_cmd(LOAD,CNTR);// + if(chan_num!=2){ + ls7166_cs1 = 1; + } + else{ + ls7166_cs2 = 1; + } +} + +//------- MAX522 routines --------------------------------- +void write_max522(int chan, float volts){ + int cmd=0x20; //set UB3 + int data_word = (int)((volts/5.0) * 256.0); + if(chan != 2) + cmd |= 0x01; //set DAC A out + else + cmd |= 0x02; //set DACB out + + // pc.printf("cmd=0x%4X data_word=0x%4X \r\n", cmd, data_word); + + spi.format(8, 0); + spi.frequency(2000000); + max522_cs = 0; + spi.write(cmd & 0xFF); + spi.write(data_word & 0xFF); + max522_cs = 1; +} + +void mbedWSEsbc_init(void){ + led4 = 0; + max1270_cs = 1; + max522_cs = 1; + ls7166_cs1 = 1; + ls7166_cs2 = 1; + + wait(.2); //delay at beginning for voltage settle purposes + + mot_en1.period_us(50); + //pc.baud(921600); //Set up serial port baud rate + pc.baud(9600); //Set up serial port baud rate + xbee.baud(9600); + + spi.frequency(5000000); + LS7366_reset_counter(1); + LS7366_quad_mode_x4(1); + LS7366_write_DTR(1,0); + + LS7366_reset_counter(2); + LS7366_quad_mode_x4(2); + LS7366_write_DTR(2,0); + + t.start(); // Set up timer +}//mbedWSEsbc_init() \ No newline at end of file