Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: main.cpp
- Revision:
- 5:bf2ed3846087
- Parent:
- 4:c38f7e4e8fda
diff -r c38f7e4e8fda -r bf2ed3846087 main.cpp --- a/main.cpp Mon Aug 13 12:44:56 2012 +0000 +++ b/main.cpp Mon Mar 04 16:21:35 2013 +0000 @@ -1,176 +1,176 @@ -/* PIservo - implement a PI controller with USB serial gain setting to stabilize dipole trap power. - Two analog inputs (control and sensor), one analog output (to RF VCA). - -20120806 Andreas Steffen -*/ - - -#include "mbed.h" - -DigitalOut adcCS(p8); -DigitalOut dacCS(p14); -DigitalOut cyc(p10); -AnalogOut vca(p18); -SPI adc(p5,p6,p7); //talk to ad7921 on SSP1 -SPI dac(p11,p12,p13); //talk to ad5551 on SSP0 -Serial pc(USBTX, USBRX); - - -Ticker commTick; -Ticker limTick; - -// PI variables -int pGain = 7000; -int iGain = 12000; -int ctl=0; -int pd=0; -int err=0; -int out = 0; -int integrator = 0; //the building up integrator value - -//control variables -int monitor = 0; //echo to serial? -int testDAC = 0; //stops PI, just 0-5V jumps on output - - -extern "C" void mbed_reset(); - - -void serialComm(){ - char c; - int i; - - if (monitor) { - pc.printf("Measuring ctl=%i and pd=%i, err=%i, integrator= %i, out=%i\n",ctl,pd,err,integrator,out); - } - - if (pc.readable()) { - c = pc.getc(); - pc.scanf("%i", &i); - switch (c) { - case 'p': - pGain = i; - pc.printf("Changed p gain to %i.\n",pGain); - break; - case 'i': - iGain = i; - pc.printf("Changed i gain to %i.\n",iGain); - if (i==0) - integrator = 0; - break; - case 'm': - monitor = i; - break; - case 't': - testDAC = i; - pc.printf("Turning on test mode... outputting 0-5 V on DAC\n"); - break; - case 'z': - mbed_reset(); - break; - default: - pc.printf("Command not understood.\n",iGain); - pc.printf("Read %c and %i.\n",c,i); - break; - } - } -} - - -void limitIntegrator() { - if(integrator < -(1<<14)/iGain) { - integrator = -(1<<14)/iGain; - } - if(integrator > (1<<14)/iGain) { - integrator = (1<<14)/iGain; - } -} - -int main() { - pc.printf("mbed restarted!\n"); - - adc.format(16,2); - adc.frequency(5e6); - dac.format(14,2); - dac.frequency(20e6); - - commTick.attach(&serialComm,1); //check serial every second - //limTick.attach_us(&limitIntegrator,500); //check integrator overflow every 500 us - cyc = 0; - - while(1) { - cyc = cyc^1; //toggle debug pin - - while (testDAC) { - dacCS = 1; - dacCS = 0; - LPC_SSP0->DR = 0x3FFF; - wait_us(1000); - dacCS = 1; - dacCS = 0; - LPC_SSP0->DR = 0; - wait_us(1000); - } - - //stagger read and output - //The SPI read takes a long time, so start it by writing to the data - //register, do sth. else (write new output), then get the value - //and start the read from the other channel - - //begin SPI transfer - adcCS = 0; - LPC_SSP1->DR = 3<<13; //select ch 1 - - //write to DAC - err = ctl - pd; - integrator += err; - dacCS = 0; - // if control is very low (probably 0V), no output and no integrator - // otherwise integrator overflows from stray light! - if (ctl < 10) { - err = 0; - integrator = 0; - } - out = ( (err * pGain + integrator)>>12 ) & 0x3FFF; - LPC_SSP0->DR = out; - - //read SPI transfer results - while(LPC_SSP1->SR & 0x10) {} //check for busy p 10 - pd = LPC_SSP1->DR & 0xFFF; //last 12 bits are data - wait_us(1); //delay necessary for unknown reason - adcCS = 1; - while(LPC_SSP0->SR & 0x10) {} - dacCS = 1; - - - - //begin transfer from other channel - adcCS = 0; - LPC_SSP1->DR = 1; //select ch 0 - - //write to DAC - err = ctl-pd; - integrator += err*iGain; - dacCS = 0; - // if control is very low (probably 0V), no output and no integrator - // otherwise integrator overflows from stray light! - if (ctl < 10) { - err = 0; - integrator = 0; - } - out = ( (err * pGain + integrator)>>12 ) & 0x3FFF; - LPC_SSP0->DR = out; - - //read SPI transfer results - while(LPC_SSP1->SR & 0x10) {} - ctl = LPC_SSP1->DR & 0xFFF; //last 12 bits are data - wait_us(1); //delay necessary for unknown reason - adcCS = 1; - while(LPC_SSP0->SR & 0x10) {} - dacCS = 1; - - - - } -} +/* PIservo + implement a PI controller with USB serial gain setting to stabilize dipole trap power. + Two analog inputs (control and sensor), one analog output (to RF VCA). + +20120806 Andreas Steffen +*/ + + +#include "mbed.h" + +DigitalOut adcCS(p8); +DigitalOut dacCS(p14); +DigitalOut cyc(p10); +AnalogOut vca(p18); +SPI adc(p5,p6,p7); //talk to ad7921 on SSP1 +SPI dac(p11,p12,p13); //talk to ad5551 on SSP0 +Serial pc(USBTX, USBRX); + + +Ticker commTick; +Ticker limTick; + +// PI variables +int pGain = 7000; +int iGain = 12000; +int ctl=0; +int pd=0; +int err=0; +int out = 0; +int integrator = 0; //the building up integrator value + +//control variables +int monitor = 0; //echo to serial? +int testDAC = 0; //stops PI, just 0-5V jumps on output + + +extern "C" void mbed_reset(); + + +void serialComm(){ + char c; + int i; + + if (monitor) { + pc.printf("Measuring ctl=%i and pd=%i, err=%i, integrator= %i, out=%i\n",ctl,pd,err,integrator,out); + } + + if (pc.readable()) { + c = pc.getc(); + pc.scanf("%i", &i); + switch (c) { + case 'p': + pGain = i; + pc.printf("Changed p gain to %i.\n",pGain); + break; + case 'i': + iGain = i; + pc.printf("Changed i gain to %i.\n",iGain); + if (i==0) + integrator = 0; + break; + case 'm': + monitor = i; + break; + case 't': + testDAC = i; + pc.printf("Turning on test mode... outputting 0-5 V on DAC\n"); + break; + case 'z': + mbed_reset(); + break; + default: + pc.printf("Command not understood.\n",iGain); + pc.printf("Read %c and %i.\n",c,i); + break; + } + } +} + + +void limitIntegrator() { + if(integrator < -(1<<14)/iGain) { + integrator = -(1<<14)/iGain; + } + if(integrator > (1<<14)/iGain) { + integrator = (1<<14)/iGain; + } +} + +int main() { + pc.printf("mbed restarted!\n"); + + adc.format(16,2); + adc.frequency(5e6); + dac.format(14,2); + dac.frequency(20e6); + + commTick.attach(&serialComm,1); //check serial every second + //limTick.attach_us(&limitIntegrator,500); //check integrator overflow every 500 us + cyc = 0; + + while(1) { + cyc = cyc^1; //toggle debug pin + + while (testDAC) { + dacCS = 1; + dacCS = 0; + LPC_SSP0->DR = 0x3FFF; + wait_us(1000); + dacCS = 1; + dacCS = 0; + LPC_SSP0->DR = 0; + wait_us(1000); + } + + //stagger read and output + //The SPI read takes a long time, so start it by writing to the data + //register, do sth. else (write new output), then get the value + //and start the read from the other channel + + //begin SPI transfer + adcCS = 0; + LPC_SSP1->DR = 3<<13; //select ch 1 + + //write to DAC + err = ctl - pd; + integrator += err; + dacCS = 0; + // if control is very low (probably 0V), no output and no integrator + // otherwise integrator overflows from stray light! + if (ctl < 20) { + err = 0; + integrator = 0; + } + out = ( (err * pGain + integrator)>>12 ) & 0x3FFF; + LPC_SSP0->DR = out; + + //read SPI transfer results + while(LPC_SSP1->SR & 0x10) {} //check for busy p 10 + pd = LPC_SSP1->DR & 0xFFF; //last 12 bits are data + wait_us(1); //delay necessary for unknown reason + adcCS = 1; + while(LPC_SSP0->SR & 0x10) {} + dacCS = 1; + + + + //begin transfer from other channel + adcCS = 0; + LPC_SSP1->DR = 1; //select ch 0 + + //write to DAC + err = ctl-pd; + integrator += err*iGain; + dacCS = 0; + // if control is very low (probably 0V), no output and no integrator + // otherwise integrator overflows from stray light! + if (ctl < 20) { + err = 0; + integrator = 0; + } + out = ( (err * pGain + integrator)>>12 ) & 0x3FFF; + LPC_SSP0->DR = out; + + //read SPI transfer results + while(LPC_SSP1->SR & 0x10) {} + ctl = LPC_SSP1->DR & 0xFFF; //last 12 bits are data + wait_us(1); //delay necessary for unknown reason + adcCS = 1; + while(LPC_SSP0->SR & 0x10) {} + dacCS = 1; + + + + } +}