Current regulator

Dependencies:   EthernetInterface mbed-rtos mbed

Committer:
soren51929277
Date:
Fri Jun 17 07:18:32 2016 +0000
Revision:
1:b5e6acbc6f10
Parent:
0:e3a184a83be0
Testing UDP

Who changed what in which revision?

UserRevisionLine numberNew contents of line
soren51929277 0:e3a184a83be0 1 #include "mbed.h"
soren51929277 0:e3a184a83be0 2 #include <stdint.h>
soren51929277 0:e3a184a83be0 3 #include "EthernetInterface.h"
soren51929277 0:e3a184a83be0 4 #define currentStep 0.01
soren51929277 0:e3a184a83be0 5
soren51929277 0:e3a184a83be0 6 //CONSTANTS---------------------------------------------------------------------
soren51929277 0:e3a184a83be0 7 const int PORT = 7; //arbitrary port
soren51929277 0:e3a184a83be0 8 static const char* SERVER_IP = "192.168.1.101"; //IP of server board
soren51929277 0:e3a184a83be0 9 static const char* MASK = "255.255.255.0"; //mask
soren51929277 0:e3a184a83be0 10 static const char* GATEWAY = "192.168.1.1"; //gateway
soren51929277 0:e3a184a83be0 11
soren51929277 0:e3a184a83be0 12 //STRUCTS-----------------------------------------------------------------------
soren51929277 0:e3a184a83be0 13 typedef struct {
soren51929277 0:e3a184a83be0 14 char CtrlType;
soren51929277 0:e3a184a83be0 15 float Out; //output from controller
soren51929277 0:e3a184a83be0 16 float Error; //Error between Iset and Current
soren51929277 0:e3a184a83be0 17 float Iset; //Setpoint value for current
soren51929277 0:e3a184a83be0 18 float Voltage; //Voltage over the H-bridge for thr coil
soren51929277 0:e3a184a83be0 19 float Current; //Current to the H-bridge
soren51929277 0:e3a184a83be0 20 } __attribute__ ((packed)) Setting;
soren51929277 0:e3a184a83be0 21
soren51929277 0:e3a184a83be0 22 Setting status;
soren51929277 0:e3a184a83be0 23
soren51929277 0:e3a184a83be0 24 //INITS-------------------------------------------------------------------------
soren51929277 1:b5e6acbc6f10 25 SPI spi(PTD2, NC, PTD1); //mosi, miso(not used), sclk (reset+rdy not used)
soren51929277 0:e3a184a83be0 26 DigitalOut cs(PTC12); //SYNC
soren51929277 0:e3a184a83be0 27 DigitalOut led(LED1);
soren51929277 1:b5e6acbc6f10 28 //DigitalOut ledgreen(LED2);
soren51929277 0:e3a184a83be0 29
soren51929277 0:e3a184a83be0 30 AnalogIn BattVolt(A0); //ADC for the battery voltage resistordivider = 10k/(36k+10k) = 0.217. Measered voltage = (BattVolt*3.3V)/0.217
soren51929277 0:e3a184a83be0 31 AnalogIn CoilVolt(A1); //ADC for the coil voltage. Measered voltage = (CoilVolt*3.3V)/0.217
soren51929277 0:e3a184a83be0 32 AnalogIn Current(A2); //ADC for the current measurement. Measered current = ((Current/3)-(9/2))/(0.05*N) Number of turns of wire throuth current sensor.
soren51929277 0:e3a184a83be0 33
soren51929277 0:e3a184a83be0 34 int BattVoltRes, CoilVoltRes, CurrentRes;
soren51929277 0:e3a184a83be0 35
soren51929277 0:e3a184a83be0 36 PwmOut PwmSpare(D3); //Extra PWM output
soren51929277 0:e3a184a83be0 37 PwmOut PwmAlarm(D5); //PWM for the alarm output set value = 1 for 100% PWM signal
soren51929277 0:e3a184a83be0 38 PwmOut PwmPump(D6); //PWM output for pump
soren51929277 0:e3a184a83be0 39 PwmOut PwmFan(D7); //PWM output for fan
soren51929277 0:e3a184a83be0 40
soren51929277 0:e3a184a83be0 41 Serial pc(USBTX, USBRX); //tx, rx
soren51929277 0:e3a184a83be0 42 EthernetInterface eth; //create ethernet
soren51929277 0:e3a184a83be0 43 UDPSocket server; //creat server
soren51929277 0:e3a184a83be0 44 Endpoint client; //create endpoint
soren51929277 1:b5e6acbc6f10 45 /*
soren51929277 0:e3a184a83be0 46 void InitPot(void) {
soren51929277 0:e3a184a83be0 47 cs = 1; //Deselect the device
soren51929277 0:e3a184a83be0 48 spi.format(16,1); //Setup the spi for 16 bit data, SPI mode = 1
soren51929277 0:e3a184a83be0 49 spi.frequency(1000000); //1MHz clock
soren51929277 0:e3a184a83be0 50 cs = 0; //Select the device
soren51929277 0:e3a184a83be0 51 spi.write(0x1803); //Send 0x1803 to enable updating of RDAC register for changing potentiometer values
soren51929277 0:e3a184a83be0 52 cs = 1; //Deselect the device
soren51929277 0:e3a184a83be0 53 }
soren51929277 0:e3a184a83be0 54
soren51929277 0:e3a184a83be0 55 void SetPot(int value) { //Values from 0-1023 are allowed
soren51929277 0:e3a184a83be0 56 cs = 0; //Select the device
soren51929277 0:e3a184a83be0 57 spi.write(0x400+value); //Values from 0x0400 to 0x7FF for digital potentiometer
soren51929277 0:e3a184a83be0 58 cs = 1; //Deselect the device
soren51929277 0:e3a184a83be0 59 }
soren51929277 0:e3a184a83be0 60
soren51929277 0:e3a184a83be0 61 float GetBattVolt(void) {
soren51929277 0:e3a184a83be0 62 float result;
soren51929277 0:e3a184a83be0 63 result = (BattVolt.read()*15.207f);
soren51929277 0:e3a184a83be0 64 return result;
soren51929277 0:e3a184a83be0 65 }
soren51929277 0:e3a184a83be0 66
soren51929277 0:e3a184a83be0 67 float GetCoilVolt(void) {
soren51929277 0:e3a184a83be0 68 float result;
soren51929277 0:e3a184a83be0 69 result = (CoilVolt.read()*15.207f);
soren51929277 0:e3a184a83be0 70 return result;
soren51929277 0:e3a184a83be0 71 }
soren51929277 0:e3a184a83be0 72
soren51929277 0:e3a184a83be0 73 float GetCurrent(void) { //For N=2 turns of wire through sensor
soren51929277 0:e3a184a83be0 74 float result;
soren51929277 0:e3a184a83be0 75 result = (Current.read()*30)-45;
soren51929277 0:e3a184a83be0 76 return result;
soren51929277 0:e3a184a83be0 77 }
soren51929277 1:b5e6acbc6f10 78 */
soren51929277 0:e3a184a83be0 79
soren51929277 0:e3a184a83be0 80 void InitEth(void) {
soren51929277 0:e3a184a83be0 81 eth.init(SERVER_IP, MASK, GATEWAY); //set up IP
soren51929277 0:e3a184a83be0 82 eth.connect(); //connect ethernet
soren51929277 0:e3a184a83be0 83 pc.printf("\nSERVER - Server IP Address is %s\r\n", eth.getIPAddress()); //get server IP address;
soren51929277 0:e3a184a83be0 84 server.bind(PORT); //bind server
soren51929277 0:e3a184a83be0 85 }
soren51929277 0:e3a184a83be0 86
soren51929277 0:e3a184a83be0 87 void ReadSocketDate(void const *args) {
soren51929277 0:e3a184a83be0 88 char buffer[256];
soren51929277 0:e3a184a83be0 89 while(1) {
soren51929277 0:e3a184a83be0 90 int n = server.receiveFrom(client, buffer, sizeof(buffer));
soren51929277 0:e3a184a83be0 91 memcpy(&status,&buffer[0],sizeof(buffer));
soren51929277 1:b5e6acbc6f10 92 pc.printf("Out: %3.3f%\r\n", status.Out);
soren51929277 1:b5e6acbc6f10 93 pc.printf("Error: %3.3f%\r\n", status.Error);
soren51929277 1:b5e6acbc6f10 94 pc.printf("Iset: %3.3f%\r\n", status.Iset);
soren51929277 1:b5e6acbc6f10 95 pc.printf("Voltage: %3.3f%\r\n", status.Voltage);
soren51929277 1:b5e6acbc6f10 96 pc.printf("Current: %3.3f%\r\n", status.Current);
soren51929277 0:e3a184a83be0 97 }
soren51929277 0:e3a184a83be0 98 }
soren51929277 0:e3a184a83be0 99
soren51929277 1:b5e6acbc6f10 100 /*
soren51929277 0:e3a184a83be0 101 void UpdateCurrent() {
soren51929277 0:e3a184a83be0 102
soren51929277 0:e3a184a83be0 103 if(HighMoment == true) {
soren51929277 0:e3a184a83be0 104 if(status.Current < status.Iset) {
soren51929277 0:e3a184a83be0 105 CurrentOut =(status.Current + currentStep*(status.Iset-status.Current));
soren51929277 0:e3a184a83be0 106 }
soren51929277 0:e3a184a83be0 107
soren51929277 0:e3a184a83be0 108 else if(status.Current > status.Iset) {
soren51929277 0:e3a184a83be0 109 CurrentOut = (status.Current - currentStep*(status.Current-status.Iset));
soren51929277 0:e3a184a83be0 110 }
soren51929277 0:e3a184a83be0 111
soren51929277 0:e3a184a83be0 112 else {
soren51929277 0:e3a184a83be0 113 CurrentOut = (status.Current);
soren51929277 0:e3a184a83be0 114 }
soren51929277 0:e3a184a83be0 115 pc.printf("CurrentOut: %3.3f%\n\r", CurrentOut);
soren51929277 0:e3a184a83be0 116 //CurrentPot = 0.015*CurrentOut+4; //Conversiom from input current to output voltage to the gate of the MOSFET.
soren51929277 0:e3a184a83be0 117 //CurrentPot = CurrentPot*511.5-1442.45;
soren51929277 0:e3a184a83be0 118 CurrentPot = 7.6725*CurrentOut+603.55;
soren51929277 0:e3a184a83be0 119 pc.printf("CurrentPot: %3.3f%\n\r", CurrentPot);
soren51929277 0:e3a184a83be0 120 SetPot(int(CurrentPot));
soren51929277 0:e3a184a83be0 121 }
soren51929277 0:e3a184a83be0 122 }
soren51929277 1:b5e6acbc6f10 123 */
soren51929277 0:e3a184a83be0 124
soren51929277 0:e3a184a83be0 125 int main() {
soren51929277 0:e3a184a83be0 126
soren51929277 1:b5e6acbc6f10 127 InitEth(); //setup Ethernet connection
soren51929277 1:b5e6acbc6f10 128 //InitPot(); //setup potentiometer
soren51929277 0:e3a184a83be0 129 led = 1;
soren51929277 0:e3a184a83be0 130
soren51929277 1:b5e6acbc6f10 131 Thread DbThread(ReadSocketDate, NULL, osPriorityNormal, (DEFAULT_STACK_SIZE * 2.25));
soren51929277 0:e3a184a83be0 132
soren51929277 0:e3a184a83be0 133 while(1) {
soren51929277 0:e3a184a83be0 134
soren51929277 0:e3a184a83be0 135 led = !led;
soren51929277 0:e3a184a83be0 136
soren51929277 1:b5e6acbc6f10 137 //UpdateCurrent(CurrentOut, CurrentPot);
soren51929277 0:e3a184a83be0 138
soren51929277 1:b5e6acbc6f10 139 wait(1);
soren51929277 1:b5e6acbc6f10 140
soren51929277 1:b5e6acbc6f10 141 /*
soren51929277 1:b5e6acbc6f10 142 for(int i=0; i<1023;i++) {
soren51929277 0:e3a184a83be0 143 SetPot(i);
soren51929277 0:e3a184a83be0 144 wait_us(100);
soren51929277 1:b5e6acbc6f10 145 }
soren51929277 1:b5e6acbc6f10 146 pc.printf("BatteryPercent: %3.3f%%\n\r", BattVolt.read()*100.0f);
soren51929277 1:b5e6acbc6f10 147 pc.printf("CoilPercent: %3.3f%%\n\r", CoilVolt.read()*100.0f);
soren51929277 1:b5e6acbc6f10 148 pc.printf("CurrentPercent: %3.3f%%\n\r", Current.read()*100.0f);
soren51929277 0:e3a184a83be0 149
soren51929277 0:e3a184a83be0 150 PwmSpare = 0.1f;
soren51929277 0:e3a184a83be0 151 PwmAlarm = 0.25f;
soren51929277 0:e3a184a83be0 152 PwmPump = 0.5f;
soren51929277 0:e3a184a83be0 153 PwmFan = 0.75f;
soren51929277 1:b5e6acbc6f10 154 */
soren51929277 0:e3a184a83be0 155 }
soren51929277 0:e3a184a83be0 156 }