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.
Fork of JTNucleo06PulsedPS_Encoder_RS232 by
Revision 8:ecdfc4582186, committed 2018-03-23
- Comitter:
- pravinautosys
- Date:
- Fri Mar 23 14:05:58 2018 +0000
- Parent:
- 7:4e6ec83d3c83
- Commit message:
- JTPulsedPS
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CRotaryEncoder.lib Fri Mar 23 14:05:58 2018 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/Raabinator/code/CRotaryEncoder/#56f636261771
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TextLCD.lib Fri Mar 23 14:05:58 2018 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/simon/code/TextLCD/#308d188a2d3a
--- a/main.cpp Wed Sep 13 11:30:50 2017 +0000 +++ b/main.cpp Fri Mar 23 14:05:58 2018 +0000 @@ -1,12 +1,570 @@ #include "mbed.h" +#include "TextLCD.h" +#include "CRotaryEncoder.h" + +#define DAC_ADDR (0xc0) +#define ADC_ADDR (0xD0) +#define BlankString " " + +//bool DEBUGON = 1; +bool DEBUGON = 0; + +bool TxEmpty = 0; +bool SerialAvailable = 0; +uint8_t r0,r1,r2,r3,r4,r5,r6,r7; +uint8_t ChRead; +char SerialBuffer[50]; + +Ticker OneSecTicker; +uint8_t CursorPos = 0; + +I2C i2c(D4,D5); //I2C i2c(I2C_SDA, I2C_SCL); + +//InterruptIn EncoderButton(PA_7); +DigitalIn EncoderButton(PA_7); + +TextLCD lcd(D12, D11, D10, D9, D8, D7,TextLCD::LCD20x4); // rs, e, d4-d7 +CRotaryEncoder Encoder(D3,D6); //PinA,PinB +int EncoderCount = 0; + +DigitalOut MCP4728Ldac(PA_6,1); +DigitalIn MCP4728Rdy(PA_5); +static uint16_t DACvalue = 0; + +Ticker HMSec; +uint8_t NowChannel=0; + +char Buffer[21]; DigitalOut myled(LED1); +//Serial pc(SERIAL_TX, SERIAL_RX); +Serial Rs232(PA_9, PA_10); + +/* +typedef struct { + __IO uint32_t FIODIR; + uint32_t RESERVED0[3]; + __IO uint32_t FIOMASK; + __IO uint32_t FIOPIN; + __IO uint32_t FIOSET; + __O uint32_t FIOCLR; +} LPC_GPIO_TypeDef; +*/ +typedef struct { + uint16_t Ch0; + uint16_t Ch1; + uint16_t Ch2; + uint16_t Ch3; +} StructDAC; + +typedef struct { + uint16_t HexData[4]; + float RealData[4]; + float CalibData[4]; +} StructADC; + +StructADC ADCData; +StructDAC DACData; + + +bool mcp4728_setChannel(uint8_t channel, bool UseInternalVRef, uint8_t powerDownMode, bool use2xGain, uint16_t value){ + char buf[3]; + buf[0] = 0x40 | ((channel & 0x3) << 1); + + buf[1] = ((uint8_t)UseInternalVRef << 7) | ((powerDownMode & 0x3) << 5) | ((uint8_t)use2xGain << 4); + buf[1] |= (value & 0x0f00)>>8; + + buf[2] = value & 0xff; + + return i2c.write(DAC_ADDR, buf, 3, 0) == 0; +} + +int dac_test(void){ +// static uint16_t value = 0; + int ret; + +// MCP4728Ldac = 0; +if(DACvalue == 0xfff) DACvalue = 0; +else DACvalue = 0xfff; + ret = mcp4728_setChannel(0, 1, 0, 1, DACvalue); +// DACvalue += 4; +// MCP4728Ldac = 1; + + if(!ret) return -2; + + return 1; +} + +void EncoderButtonPressed(){ +int cnt; + cnt = Encoder.Get(); + cnt += 10; + Encoder.Set(cnt); + if(DEBUGON) DEBUGON = 0; + else DEBUGON = 1; +} +void SetDAC(uint8_t ChNo,uint16_t Value){ + switch(ChNo){ + case 0: + DACData.Ch0 = Value; + mcp4728_setChannel(0, 1, 0, 1, Value); + break; + case 1: + DACData.Ch1 = Value; + mcp4728_setChannel(1, 1, 0, 1, Value); + break; + case 2: + DACData.Ch2 = Value; + mcp4728_setChannel(2, 1, 0, 1, Value); + break; + case 3: + DACData.Ch3 = Value; + mcp4728_setChannel(3, 1, 0, 1, Value); + break; + } +} +void UpdateDAC(){ + mcp4728_setChannel(0, 1, 0, 1, DACData.Ch0); + mcp4728_setChannel(1, 1, 0, 1, DACData.Ch1); + mcp4728_setChannel(2, 1, 0, 1, DACData.Ch2); + mcp4728_setChannel(3, 1, 0, 1, DACData.Ch3); +} +void ResetDAC(){ + DACData.Ch0 = 0; + DACData.Ch1 = 0; + DACData.Ch2 = 0; + DACData.Ch3 = 0; + UpdateDAC(); +} +void FullDAC(){ + DACData.Ch0 = 0xfff; + DACData.Ch1 = 0xfff; + DACData.Ch2 = 0xfff; + DACData.Ch3 = 0xfff; + UpdateDAC(); +} +bool mcp3428_writeConfig(uint8_t conf){ + return i2c.write(ADC_ADDR, (char*) &conf, 1, 0) == 0; +} + +bool mcp3428_read(uint16_t* data, uint8_t* conf){ + char buf[3]; + int ret = i2c.read(ADC_ADDR, buf, 3, 0); + if(ret != 0) + return false; + *data = buf[0] << 8 | buf[1]; + *conf = buf[2]; + return true; +} + +int ReadADC(uint8_t ChNo){ +uint8_t conf = 0x98; +uint16_t data = 0; + + + switch(ChNo){ + case 0: + conf = 0x98; + break; + case 1: + conf = 0xb8; + break; + case 2: + conf = 0xd8; + break; + case 3: + conf = 0xf8; + break; + } + if(!mcp3428_writeConfig(conf)) return -1; + wait(0.1); + int ret = mcp3428_read(&data, &conf); +//if(DEBUGON) Rs232.printf("CONF: %02x ChannelNo: %02d \n",conf,ChNo); + if(!ret) return -2; + return data; +} +void ConvertNegative(uint8_t ChNo,int d){ + if(d & 0x8000) { + d &= 0x7fff; + d = (d ^ 0x07fff) + 1; + ADCData.HexData[ChNo] = d; + ADCData.RealData[ChNo] = ADCData.HexData[ChNo] * ADCData.CalibData[1] / 32768.0; + ADCData.RealData[ChNo] *= (-1.0); + } + else{ + ADCData.HexData[ChNo] = d; + ADCData.RealData[ChNo] = ADCData.HexData[ChNo] * ADCData.CalibData[ChNo] / 32768.0; + } +} +void ReadADCConverted(){ +int adData=0; +bool Negative=0; + + adData = ReadADC(0); + if ( (adData == -1) || (adData == -2) ) goto next1; + ConvertNegative(0,adData); +next1: + adData = ReadADC(1); + if ( (adData == -1) || (adData == -2) ) goto next2; + ConvertNegative(1,adData); +next2: + adData = ReadADC(2); + if ( (adData == -1) || (adData == -2) ) goto next3; + ConvertNegative(2,adData); +next3: + adData = ReadADC(3); + if ( (adData == -1) || (adData == -2) ) goto next4; + ConvertNegative(3,adData); +next4: + return; +} +/* +void ReadADCTicker(){ +uint8_t conf = 0x98; +uint16_t data = 0; + + switch(NowChannel){ + case 0:conf = 0x98;break; + case 1:conf = 0xb8;break; + case 2:conf = 0xd8;break; + case 3:conf = 0xf8;break; + } + + int ret = mcp3428_read(&data, &conf); + if(!ret) goto NextCh; +// mcp3428_read(&data, &conf); + ADCData.HexData[NowChannel] = data & 0x7fff; + + ADCData.RealData[NowChannel] = ( (ADCData.HexData[NowChannel] * ADCData.CalibData[NowChannel] / 32768.0) ); +NextCh: + NowChannel++; + if(NowChannel > 3) NowChannel = 0; + + switch(NowChannel){ + case 0:conf = 0x98;break; + case 1:conf = 0xb8;break; + case 2:conf = 0xd8;break; + case 3:conf = 0xf8;break; + } + mcp3428_writeConfig(conf); + +} +*/ +int adc_test(void){ +// uint8_t conf = 0x90; + uint8_t conf = 0x98; + uint16_t data = 0; + + if(!mcp3428_writeConfig(conf)) return -1; + + int ret = mcp3428_read(&data, &conf); + + if(!ret) return -2; + + return data; + + } +void HMSecRoutine(){ +// ReadADCTicker(); +} +void LCDPrintDataADC(){ +// lcd.cls(); + sprintf(Buffer,"Ch1: %6.3f V",ADCData.RealData[0]); + lcd.locate(0,0); + lcd.printf(BlankString); + lcd.locate(0,0); + lcd.printf(Buffer); + + sprintf(Buffer,"Ch2: %6.3f V",ADCData.RealData[1]); + lcd.locate(0,1); + lcd.printf(BlankString); + lcd.locate(0,1); + lcd.printf(Buffer); + + sprintf(Buffer,"Ch3: %6.3f V",ADCData.RealData[2]); + lcd.locate(0,2); + lcd.printf(BlankString); + lcd.locate(0,2); + lcd.printf(Buffer); + + sprintf(Buffer,"Ch4: %6.3f V",ADCData.RealData[3]); + lcd.locate(0,3); + lcd.printf(BlankString); + lcd.locate(0,3); + lcd.printf(Buffer); + +// Rs232printf("adc_test: %5.3f %5.3f %5.3f %5.3f\n", ADCData.RealData[0],ADCData.RealData[1],ADCData.RealData[2],ADCData.RealData[3]); + + +} +void LCDPrintDataDAC(){ +// lcd.cls(); + sprintf(Buffer," Ch1: %4d",DACData.Ch0); + lcd.locate(0,0); + lcd.printf(BlankString); + lcd.locate(0,0); + lcd.printf(Buffer); + + sprintf(Buffer," Ch2: %4d",DACData.Ch1); + lcd.locate(0,1); + lcd.printf(BlankString); + lcd.locate(0,1); + lcd.printf(Buffer); + + sprintf(Buffer," Ch3: %4d",DACData.Ch2); + lcd.locate(0,2); + lcd.printf(BlankString); + lcd.locate(0,2); + lcd.printf(Buffer); + + sprintf(Buffer," Ch4: %4d",DACData.Ch3); + lcd.locate(0,3); + lcd.printf(BlankString); + lcd.locate(0,3); + lcd.printf(Buffer); + + while(EncoderButton == 0); + +} + +void DisplayCursor(){ + + switch(CursorPos){ + case 0: + lcd.locate(0,0);lcd.printf(">"); + lcd.locate(0,1);lcd.printf(" "); + lcd.locate(0,2);lcd.printf(" "); + lcd.locate(0,3);lcd.printf(" "); + break; + case 1: + lcd.locate(0,0);lcd.printf(" "); + lcd.locate(0,1);lcd.printf(">"); + lcd.locate(0,2);lcd.printf(" "); + lcd.locate(0,3);lcd.printf(" "); + break; + case 2: + lcd.locate(0,0);lcd.printf(" "); + lcd.locate(0,1);lcd.printf(" "); + lcd.locate(0,2);lcd.printf(">"); + lcd.locate(0,3);lcd.printf(" "); + break; + case 3: + lcd.locate(0,0);lcd.printf(" "); + lcd.locate(0,1);lcd.printf(" "); + lcd.locate(0,2);lcd.printf(" "); + lcd.locate(0,3);lcd.printf(">"); + break; + } + } +void ProcessEncoder(){ +uint16_t val; + switch(CursorPos){ + case 0: val = DACData.Ch0;break; + case 1: val = DACData.Ch1;break; + case 2: val = DACData.Ch2;break; + case 3: val = DACData.Ch3;break; + } + Encoder.Set(val); +here: + val = Encoder.Get(); + lcd.locate(0,3); + lcd.printf("%04d",val); + if(Encoder.Get() < 0) Encoder.Set(0); + if(Encoder.Get() > 4095) Encoder.Set(4095); + if(EncoderButton == 0){ + while(EncoderButton == 0); + val = Encoder.Get(); + switch(CursorPos) { + case 0: + DACData.Ch0 = val; + SetDAC(0,DACData.Ch0); + break; + case 1: + DACData.Ch1 = val; + SetDAC(1,DACData.Ch1); + break; + case 2: + DACData.Ch2 = val; + SetDAC(2,DACData.Ch2); + break; + case 3: + DACData.Ch3 = val; + SetDAC(3,DACData.Ch3); + break; + } + return; + } + goto here; +} +void SetTheDacData(){ + lcd.cls(); + lcd.locate(0,2); + switch(CursorPos){ + case 0:lcd.printf("Set CH%02d Value",CursorPos+1);break; + case 1:lcd.printf("Set CH%02d Value",CursorPos+1);break; + case 2:lcd.printf("Set CH%02d Value",CursorPos+1);break; + case 3:lcd.printf("Set CH%02d Value",CursorPos+1);break; + } + ProcessEncoder(); +} +void SetDac(){ +int ECount; + CursorPos = 0; +here1: + Encoder.Set(CursorPos); + LCDPrintDataDAC(); + while(1){ + ECount = Encoder.Get(); + if(ECount > 3){ECount = 0;CursorPos = 0;Encoder.Set(CursorPos);return;} + else { CursorPos = ECount;Encoder.Set(CursorPos);} + DisplayCursor(); + if(EncoderButton == 0){ + while(EncoderButton == 0); + SetTheDacData(); + goto here1; + } + } +} + +void PushToBuffer(){ + r0 = r1; + r1 = r2; + r2 = r3; + r3 = r4; + r4 = r5; + r5 = r6; + r6 = r7; + r7 = ChRead; + if((r0==':')&&(r7==';')) SerialAvailable = 1; +} + +void Rx_interrupt() { + while(Rs232.readable()){ + ChRead = Rs232.getc(); + PushToBuffer(); + } +} + +void Tx_interrupt() { +// TxEmpty = 1; + return; +} + +void SendSerial(){ +uint8_t ch,i; + TxEmpty = 1; + for(i=0;i<=49;i++){ + ch = SerialBuffer[i]; + if(ch == 0){ + while(!TxEmpty); + TxEmpty = 0; + Rs232.putc(0x0d); + while(!TxEmpty); + TxEmpty = 0; + Rs232.putc(0x0a); + return; + } + while(!TxEmpty); + TxEmpty = 0; + Rs232.putc(ch); + } + +} +void SerialDataSend(){ + Rs232.printf("ADCChannels: %6.3f %6.3f %6.3f %6.3f\n", ADCData.RealData[0],ADCData.RealData[1],ADCData.RealData[2],ADCData.RealData[3]); +} +void PrintRs232(){ + lcd.cls(); + lcd.locate(0,2);lcd.printf("SerialCommand"); + lcd.locate(0,3);lcd.putc(r0); + lcd.locate(1,3);lcd.putc(r1); + lcd.locate(2,3);lcd.putc(r2); + lcd.locate(3,3);lcd.putc(r3); + lcd.locate(4,3);lcd.putc(r4); + lcd.locate(5,3);lcd.putc(r5); + lcd.locate(6,3);lcd.putc(r6); + lcd.locate(7,3);lcd.putc(r7); +} +void SetSerialDAC(){ +uint8_t ch; +uint16_t val; + ch = r2 - '0'; + val = (r3 - '0')*1000; + val += (r4 - '0')*100; + val += (r5 - '0')*10; + val += (r6 - '0')*1; + if(val > 4095) val = 4095; + if(val < 0) val = 0; + if((ch >= 0) && (ch < 4)) SetDAC(ch,val); + else return; +} + + +void ParseCom(){ + if(SerialAvailable){ + PrintRs232(); + switch(r1){ + case '3'://DAC Command Set Value; + SetSerialDAC(); + break; + case '4'://DAC Command Set Zero; + ResetDAC(); + break; + case '5'://DAC Command Set Full; + FullDAC(); + break; + default:break; + } + } + SerialAvailable = 0; +} int main() { - while(1) { - myled = 1; // LED is ON - wait(0.2); // 200 ms - myled = 0; // LED is OFF - wait(1.0); // 1 sec +uint16_t Counter=0; +// EncoderButton.fall(&EncoderButtonPressed); +// EncoderButton.enable_irq (); + + + Rs232.attach(&Rx_interrupt, Serial::RxIrq); + Rs232.attach(&Tx_interrupt, Serial::TxIrq); + + OneSecTicker.attach(&SerialDataSend,1.0); + + lcd.cls(); + MCP4728Ldac = 0; + ResetDAC(); +//ForHighVoltageModule + ADCData.CalibData[0] = 10.08; + ADCData.CalibData[1] = 10.079; + ADCData.CalibData[2] = 10.096; + ADCData.CalibData[3] = 10.095; + + DACData.Ch0 = 0; + DACData.Ch1 = 0; + DACData.Ch2 = 0; + DACData.Ch3 = 0; + + lcd.locate(0,0); +// lcd.printf("Test Jig Module "); + lcd.printf("4 Ch HV Module "); + wait(2); + + while(1){ + ReadADCConverted(); + LCDPrintDataADC(); + ParseCom(); + if(EncoderButton == 0){ + SetDac(); + } + wait(1); + myled = !myled; } + } + + + + + + +