Andreas Steffen / Mbed 2 deprecated PIservo

Dependencies:   mbed

Committer:
Reignbow
Date:
Mon Aug 06 17:24:16 2012 +0000
Revision:
1:dc799997391e
Parent:
0:3e6ae21a6bb1
Child:
2:6d472c554758
Working SPI communication with AD7921.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Reignbow 0:3e6ae21a6bb1 1 /* PIservo
Reignbow 0:3e6ae21a6bb1 2 implement a PI controller with USB serial gain setting to stabilize dipole trap power.
Reignbow 0:3e6ae21a6bb1 3 Two analog inputs (control and sensor), one analog output (to RF VCA).
Reignbow 0:3e6ae21a6bb1 4
Reignbow 0:3e6ae21a6bb1 5 20120806 Andreas Steffen
Reignbow 0:3e6ae21a6bb1 6 */
Reignbow 0:3e6ae21a6bb1 7
Reignbow 0:3e6ae21a6bb1 8
Reignbow 0:3e6ae21a6bb1 9 #include "mbed.h"
Reignbow 0:3e6ae21a6bb1 10
Reignbow 1:dc799997391e 11 DigitalOut adcCS(p8);
Reignbow 0:3e6ae21a6bb1 12 AnalogOut vca(p18);
Reignbow 1:dc799997391e 13 SPI adcSPI(p5,p6,p7); //talk to ad7921
Reignbow 0:3e6ae21a6bb1 14 Serial pc(USBTX, USBRX);
Reignbow 0:3e6ae21a6bb1 15
Reignbow 0:3e6ae21a6bb1 16
Reignbow 0:3e6ae21a6bb1 17 Timer t;
Reignbow 0:3e6ae21a6bb1 18 Ticker commTick;
Reignbow 0:3e6ae21a6bb1 19 Ticker intTick;
Reignbow 0:3e6ae21a6bb1 20
Reignbow 1:dc799997391e 21 float pGain = 0.5;
Reignbow 1:dc799997391e 22 float iGain = 5000.;
Reignbow 1:dc799997391e 23 float integrator = 0; //the building up integrator value
Reignbow 1:dc799997391e 24
Reignbow 1:dc799997391e 25 //for keeping track of the cycle rate
Reignbow 1:dc799997391e 26 float cycT=0;
Reignbow 1:dc799997391e 27 float cycN=0;
Reignbow 0:3e6ae21a6bb1 28
Reignbow 0:3e6ae21a6bb1 29 void serialComm(){
Reignbow 0:3e6ae21a6bb1 30 char c;
Reignbow 0:3e6ae21a6bb1 31 float f;
Reignbow 0:3e6ae21a6bb1 32
Reignbow 1:dc799997391e 33 pc.printf("Average cycle time [us]: %f\n",cycT/cycN);
Reignbow 1:dc799997391e 34 cycT = 0;
Reignbow 1:dc799997391e 35 cycN = 0;
Reignbow 1:dc799997391e 36
Reignbow 0:3e6ae21a6bb1 37 if (pc.readable()) {
Reignbow 0:3e6ae21a6bb1 38 c = pc.getc();
Reignbow 0:3e6ae21a6bb1 39 pc.scanf("%f", &f);
Reignbow 0:3e6ae21a6bb1 40 switch (c) {
Reignbow 0:3e6ae21a6bb1 41 case 'p':
Reignbow 0:3e6ae21a6bb1 42 pGain = f;
Reignbow 0:3e6ae21a6bb1 43 pc.printf("Changed p gain to %f.\n",pGain);
Reignbow 0:3e6ae21a6bb1 44 break;
Reignbow 0:3e6ae21a6bb1 45 case 'i':
Reignbow 0:3e6ae21a6bb1 46 iGain = f;
Reignbow 0:3e6ae21a6bb1 47 pc.printf("Changed i gain to %f.\n",iGain);
Reignbow 0:3e6ae21a6bb1 48 break;
Reignbow 0:3e6ae21a6bb1 49 default:
Reignbow 0:3e6ae21a6bb1 50 pc.printf("Command not understood.\n",iGain);
Reignbow 1:dc799997391e 51 pc.printf("Read %c and %f.\n",c,f);
Reignbow 0:3e6ae21a6bb1 52 break;
Reignbow 0:3e6ae21a6bb1 53 }
Reignbow 0:3e6ae21a6bb1 54 }
Reignbow 0:3e6ae21a6bb1 55 }
Reignbow 0:3e6ae21a6bb1 56
Reignbow 0:3e6ae21a6bb1 57 void limitIntegrator(){
Reignbow 0:3e6ae21a6bb1 58 if (integrator > 3.3) {
Reignbow 0:3e6ae21a6bb1 59 integrator = 3.3;
Reignbow 0:3e6ae21a6bb1 60 }
Reignbow 0:3e6ae21a6bb1 61 if (integrator < -3.3) {
Reignbow 0:3e6ae21a6bb1 62 integrator = -3.3;
Reignbow 0:3e6ae21a6bb1 63 }
Reignbow 0:3e6ae21a6bb1 64 }
Reignbow 0:3e6ae21a6bb1 65
Reignbow 0:3e6ae21a6bb1 66 int main() {
Reignbow 1:dc799997391e 67 float err=0.;
Reignbow 1:dc799997391e 68 int ctl=0;
Reignbow 1:dc799997391e 69 int pd=0;
Reignbow 0:3e6ae21a6bb1 70 pc.printf("mbed restarted!\n");
Reignbow 0:3e6ae21a6bb1 71
Reignbow 1:dc799997391e 72 adcSPI.format(16,3);
Reignbow 1:dc799997391e 73 adcSPI.frequency(2000000); //2MHz
Reignbow 1:dc799997391e 74
Reignbow 1:dc799997391e 75 //commTick.attach(&serialComm,0.5); //check serial every half second
Reignbow 1:dc799997391e 76 //intTick.attach(&limitIntegrator,0.001); //check integrator overrun every ms
Reignbow 0:3e6ae21a6bb1 77
Reignbow 0:3e6ae21a6bb1 78 t.start();
Reignbow 1:dc799997391e 79
Reignbow 0:3e6ae21a6bb1 80
Reignbow 0:3e6ae21a6bb1 81 while(1) {
Reignbow 1:dc799997391e 82 adcCS = 0;
Reignbow 1:dc799997391e 83 ctl = adcSPI.write(3<<13); //select ch 1
Reignbow 1:dc799997391e 84 adcCS = 1;
Reignbow 1:dc799997391e 85 wait_us(20);
Reignbow 1:dc799997391e 86 adcCS = 0;
Reignbow 1:dc799997391e 87 pd = adcSPI.write(1); // select ch 0
Reignbow 1:dc799997391e 88 //take the last 12 bits that carry data
Reignbow 1:dc799997391e 89 // for some reason, it seems shifted up by one...
Reignbow 1:dc799997391e 90 pd = (pd>>1) & 0xFFF;
Reignbow 1:dc799997391e 91 ctl = (ctl>>1) & 0xFFF;
Reignbow 1:dc799997391e 92 pc.printf("Read %i from V0 and %i from V1.\n",ctl,pd);
Reignbow 1:dc799997391e 93 adcCS = 1;
Reignbow 1:dc799997391e 94 wait_ms(100);
Reignbow 1:dc799997391e 95 /* err = ctl.read() - pd.read();
Reignbow 1:dc799997391e 96 cycT += t.read_us();
Reignbow 1:dc799997391e 97 cycN += 1.;
Reignbow 1:dc799997391e 98 integrator += err * iGain * t.read_us();
Reignbow 1:dc799997391e 99 t.reset(); //reset timer to get next integration time
Reignbow 1:dc799997391e 100
Reignbow 1:dc799997391e 101 vca = err * pGain + integrator; //analog output
Reignbow 1:dc799997391e 102
Reignbow 1:dc799997391e 103 */
Reignbow 0:3e6ae21a6bb1 104 }
Reignbow 0:3e6ae21a6bb1 105 }