JTPulsedPS

Dependencies:   mbed

Fork of JTNucleo06PulsedPS_Encoder_RS232 by pravin sarode

Revision:
8:ecdfc4582186
Parent:
2:b60cb847489c
diff -r 4e6ec83d3c83 -r ecdfc4582186 main.cpp
--- 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;
     }
+
 }
+
+
+
+ 
+ 
+
+