USNA ES305
/
TwoTank
...
main.cpp
- Committer:
- riobrien
- Date:
- 2014-08-05
- Revision:
- 0:722b391fe228
- Child:
- 1:daaa91186ace
File content as of revision 0:722b391fe228:
#include "mbed.h" // APIs Serial pc(USBTX, USBRX); // tx, rx for serial USB interface to pc 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 mot1_ph1(p21); DigitalOut mot1_ph2(p22); PwmOut mot_en1(p23); /*DigitalOut mot2_ph1(p24); DigitalOut mot2_ph2(p25); PwmOut mot_en2(p26);*/ 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; } } }*/ //------- 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; spi.frequency(10000000); }*/ float Tank1,Tank2,dt,h1,h2; float Ts = 0.5; // 1/Ts Hz float c1 = 15.0/(2.77+1.24); // cm/V float c2 = 11.5/(3.58-0.79); // cm/V float v10 = -0.52; // V float v20 = -3.35; // V Timer t; float cntr; float dc; int main () { pc.baud(921600); mot_en1.period_us(50); max1270_cs = 1; //Ts = 0.1; //dc = 0.2; cntr = 0.0; while(cntr*Ts <= 120) { t.start(); // start measuring comp time // Read pressure sensors Tank1 = read_max1270_volts(0, 1, 1); h1 = c1*(Tank1 - v10); Tank2 = read_max1270_volts(1, 1, 1); h2 = c2*(Tank2 - v20); // drive motor //if (cntr*Ts <= 0.05) { // dc = 0.0; //} else if (cntr*Ts <= 0.2) { // dc = 0.3; //} else { // dc = 0.7; //} if (cntr*Ts <= 5) { dc = 0.0; } else if (cntr*Ts <= 110) { dc = -0.75; } else { dc = 0.0; } //dc = 0.75; //mot_control(1,-dc); 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);} t.stop(); // end measuring comp time //printf("%f\n\r",t.read()); dt = Ts-t.read(); //printf("%f\n\r",dt); pc.printf("%5.2f %5.2f %5.2f %5.2f %5.2f %5.2f \n\r",cntr*Ts,Tank1,Tank2,h1,h2,dc); //printf("%5.2f \n\r",angleNew); t.reset(); cntr=cntr+1; wait(dt); // wait to ensure sampling period set by Ts }//while mot1_ph2 = 0; mot_en1 = 0.0; }//main