+ Post New Thread
Page 1 of 3 1 2 3 LastLast
Results 1 to 20 of 41
  1. #1
    Advanced Member level 2
    Points: 2,848, Level: 12
    baileychic's Avatar
    Join Date
    Aug 2017
    Posts
    562
    Helped
    49 / 49
    Points
    2,848
    Level
    12

    How to interface BP Transducer to PIC18F?

    How to interface BP Transducer to PIC16F?

    I need to use these and interface BP transducer and Analog Stimulator to PIC16F Mic rocontroller.

    BP transducer needs to connect to PIC16F ADC input and Analog Stimulator needs to connect to DAC output of PIC18F.

    I will be using PIC16F1779 which has both 10-bit ADC and DAC.

    Find attached file.

    This is for a lab experiment.

    Also fins attached flowchart.

  2. #2
    Super Moderator
    Points: 257,313, Level: 100
    Awards:
    1st Helpful Member

    Join Date
    Jan 2008
    Location
    Bochum, Germany
    Posts
    44,890
    Helped
    13657 / 13657
    Points
    257,313
    Level
    100

    Re: How to interface BP Transducer to PIC18F?

    Do you want to use the pressure transducer with its dedicated amplifier, or include the amplifier function in your design? In the latter case, does your design need to provide fully galvanic isolation like the shown bp amp?

    The stimulation waveform generation and respective control algorithms are apparently beyond the scope of this thread. Nevertheless they have to be designed by someone and compiled into the PIC.



  3. #3
    Advanced Member level 2
    Points: 2,848, Level: 12
    baileychic's Avatar
    Join Date
    Aug 2017
    Posts
    562
    Helped
    49 / 49
    Points
    2,848
    Level
    12

    Re: How to interface BP Transducer to PIC18F?

    I will try both methods that are:

    1. Using a dedicated amplifier and
    2. Custom amplifier

    I want to implement Galvanic isolation if required.

    Regarding the algorithm, the student said that ADC needs to be used to read the sensor and the vale should be sent to DAC to get a voltage and amplified if required and fed into Stimulator.
    Is there a requirement of a special algorithm?



  4. #4
    Super Moderator
    Points: 257,313, Level: 100
    Awards:
    1st Helpful Member

    Join Date
    Jan 2008
    Location
    Bochum, Germany
    Posts
    44,890
    Helped
    13657 / 13657
    Points
    257,313
    Level
    100

    Re: How to interface BP Transducer to PIC18F?

    I can't read a sense into sending the blood pressure signal to stimulation amplifier. What should be the purpose?


    1 members found this post helpful.

  5. #5
    Advanced Member level 2
    Points: 2,848, Level: 12
    baileychic's Avatar
    Join Date
    Aug 2017
    Posts
    562
    Helped
    49 / 49
    Points
    2,848
    Level
    12

    Re: How to interface BP Transducer to PIC18F?

    @FvM

    The student had only given nformation that ADC reads the sensor/transducer and the raw ADC value will be scaled and converted to suitable voltage using internal DAC of PIC and DAC output voltage is given to Stimulator.

    If more information is needed then please tell what are the requirements and I will ask the Student and will update.

    - - - Updated - - -

    @FvM

    This is the Flowchart that the Student's Professor has given. She (I) have to implement it using PIC?
    Show what is the method?

    Just read the transducer using ADC and then scale the raw ADC value and feed it to get DAC output voltage and then use an OpAmp to get the required stimulus voltage for Analog Stimulator?



    •   AltAdvertisement

        
       

  6. #6
    Super Moderator
    Points: 257,313, Level: 100
    Awards:
    1st Helpful Member

    Join Date
    Jan 2008
    Location
    Bochum, Germany
    Posts
    44,890
    Helped
    13657 / 13657
    Points
    257,313
    Level
    100

    Re: How to interface BP Transducer to PIC18F?

    I don't understand the exact purpose of the stimulator part, but I really don't need to know. You should however understand it if you are doing any srious support work for the project.

    There should be a detailed experiment description supplementing the "flowchart". Without it, one might guess that the student neither understands the project purpose.



  7. #7
    Advanced Member level 2
    Points: 2,848, Level: 12
    baileychic's Avatar
    Join Date
    Aug 2017
    Posts
    562
    Helped
    49 / 49
    Points
    2,848
    Level
    12

    Re: How to interface BP Transducer to PIC18F?

    I will give a detailed report to the student (the student has only provided me the PDFs which I have attached in this thread).

    I just want to know whether I can use a 5V excitation voltage for the transducer/sensor same as PICs power supply and read the sensor using ADC and feed the 10-bit ADC result to internal DAC of PIC and get a DAC output voltage and then amplify it if needed using an OpAmp (MCP6001) and feed it to Analog Stimulator?

    I have to design the PIC interface circuit for the BP transducer and Analog Stimulator to conduct the experiment.

    Should I use an Instrumentation Amplifier to get the stimulator voltage?



  8. #8
    Advanced Member level 2
    Points: 2,848, Level: 12
    baileychic's Avatar
    Join Date
    Aug 2017
    Posts
    562
    Helped
    49 / 49
    Points
    2,848
    Level
    12

    Re: How to interface BP Transducer to PIC16F?

    @FvM

    I guess the setup should be like this:

    Provide say 5V excitation voltage to transducer/sensor.
    Put an OpAmp between transducer output and PIC's ADC input
    Read transducer output using ADC and get the raw ADC value of 10-bit
    Scale this reading if required for the internal DAC of PIC
    Then feed the DAC output to Analog Stimulator
    Analog Stimulator output is connected to the transducer for control

    What do you say?

    The professor needs solution for both methods that are using the BP Amp instrument and also external OpAmp.

    So, If the above method is correct then I will use the chosen PIC's internal OpAmp to amplify the transducer's output for ADC.

    Note: I have never used these instruments and this also applies for the student.


    This is what is mentioned in the transducer's datasheet.

    Operating range: –50 to +300 mmHg
    Excitation voltage: 2 to 10 V DC
    Sensitivity (full range): 5 ĩV/V/mmHg

    So, If my excitation voltage is 5V DC then I get

    5uV * 5 = 25uV for 5V and it is equal to 1 mmHg?

    If yes, then range is -50 to 300 mmHg = 350

    So, 25uV * 350 = 8750 uV = 8.75mV?

    So, I need to amplify this value to 5V for ADC input?
    Last edited by baileychic; 23rd April 2019 at 06:30.



  9. #9
    Super Moderator
    Points: 75,514, Level: 67
    Achievements:
    7 years registered
    Awards:
    Most Frequent Poster 3rd Helpful Member

    Join Date
    Apr 2014
    Posts
    15,307
    Helped
    3486 / 3486
    Points
    75,514
    Level
    67

    Re: How to interface BP Transducer to PIC18F?

    Hi,

    Operating range: –50 to +300 mmHg
    Excitation voltage: 2 to 10 V DC
    Sensitivity (full range): 5 ĩV/V/mmHg

    So, If my excitation voltage is 5V DC then I get

    5uV * 5 = 25uV for 5V and it is equal to 1 mmHg?

    If yes, then range is -50 to 300 mmHg = 350

    So, 25uV * 350 = 8750 uV = 8.75mV?

    So, I need to amplify this value to 5V for ADC input?
    If you take the units correctly with your calculations:

    5uV/V/mmHg * 5V = 25uV/mmHg

    25uV/mmHg * 350mmHg = 8750 uV = 8.75mV

    While these calculations are basically correct...In reality I'd expect problems because of:
    * output offset of the sensor
    * gain variation of the sensor
    * reference voltage error
    * amplifier gain and offset error
    * no headrom to be able to detect "out of range"

    At this stage it's time to consider about
    * the measurement method: absolute or ratiometric
    * schematic
    * error calculations

    Klaus
    Please donīt contact me via PM, because there is no time to respond to them. No friend requests. Thank you.



    •   AltAdvertisement

        
       

  10. #10
    Advanced Member level 2
    Points: 2,848, Level: 12
    baileychic's Avatar
    Join Date
    Aug 2017
    Posts
    562
    Helped
    49 / 49
    Points
    2,848
    Level
    12

    Re: How to interface BP Transducer to PIC18F?

    Human BP doesn't exceed 250 mmHg and transducer can measure up to 300 mmHg. So, will there be an out of range reading?



    •   AltAdvertisement

        
       

  11. #11
    Super Moderator
    Points: 75,514, Level: 67
    Achievements:
    7 years registered
    Awards:
    Most Frequent Poster 3rd Helpful Member

    Join Date
    Apr 2014
    Posts
    15,307
    Helped
    3486 / 3486
    Points
    75,514
    Level
    67

    Re: How to interface BP Transducer to PIC18F?

    Hi,

    I didnīt go through the datasheets, thus I donīt know about the sensor errors...

    So itīs just a reminder to consider worst case scenarios not to get in trouble later...

    Klaus
    Please donīt contact me via PM, because there is no time to respond to them. No friend requests. Thank you.



  12. #12
    Advanced Member level 2
    Points: 2,848, Level: 12
    baileychic's Avatar
    Join Date
    Aug 2017
    Posts
    562
    Helped
    49 / 49
    Points
    2,848
    Level
    12

    Re: How to interface BP Transducer to PIC18F?

    The student discussed with the professor and the new requirement is as below.

    The BP transducer gives voltage output and also can connect to BP AMP I2C Input. BP AMP also gives direct mmHg data at its I2C output connector but the professor doesn't want to use it.
    He wants the student to use the voltage output of the BP sensor (transducer) and use ADC of MCU and convert it into a voltage level between 0 and 10V and a pulse of 20 Hz to 100 Hz that is single output to input into stimulator.

    The pulse voltage level should be between 0 and 10V and 20 Hz to 100 Hz based on sensor (ADC) value.

    How can this be achieved using PIC16F1779?

    I can use a DAC to get a voltage and a digital output pin to get pulse output but need to get both on one pin.

    I can use additional transistors, N-Mosfet, OpAmps with PIC if required to get the required output.

    - - - Updated - - -

    Can I use PIC16F1779's internal DAC to get the pulse output signal that is:

    I will update the DAC value in Timer ISR which can give 20 Hz to 100 Hz max 5V output pulse and I will use an external OPAMP with +10V supply for it to get the amplified pulse output which can vary between 20 Hz to 100 Hz with voltage level 10V max.

    Will this work?

    If it works then I am thinking about using ti.com OPA743 (12V rail-to-rail opamp).



  13. #13
    Advanced Member level 2
    Points: 2,848, Level: 12
    baileychic's Avatar
    Join Date
    Aug 2017
    Posts
    562
    Helped
    49 / 49
    Points
    2,848
    Level
    12

    Re: How to interface BP Transducer to PIC18F?

    My hardware setup will be like this.

    I will not be using BP AMP and BP STIMULATOR.

    I will be using just BP sensor (Professor's requirement to use just that)
    The BP sensor is connected to internal OPAMP of PIC16F1779 and OPAMP's output is fed to ADC input.
    ADC reading is taken and converted to DAC value and based on the DAC value (or ADC value) then timer interrupt period is selected between 20 Hz to 100 Hz.
    The DAC will output a pulsed DC between 0-5V and 20 Hz to 100 Hz.
    This is amplified to 20V max pulsed using external 36V Rail-to-Rail OPAMP.
    The external OPAMP acts as the stimulator.

    So, How should I write the c code that is to get Systolic and Diastolic BP readings in mmHg for displaying on LCD?



  14. #14
    Advanced Member level 2
    Points: 2,848, Level: 12
    baileychic's Avatar
    Join Date
    Aug 2017
    Posts
    562
    Helped
    49 / 49
    Points
    2,848
    Level
    12

    Re: How to interface BP Transducer to PIC18F?

    I have a new issue related to this project.

    The BP sensor gives a reading 0 to 2.5V max for 0 to 250 mmHg BP. I am using PIC16F1779 with ADC+Internal OPAMP1+DAC+Internal OPAMP3+Stimulator out with external OPAMP circuits.

    The 0 to 2.5V from the sensor is fed to OPAMP1's (Internal to PIC) IN+ pin and IN- pin has two gain resistors Ri and Rf of 10k each which amplifies this signal to 0 to 5V range.
    The 10 - bit ADC value is directly fed to DAC (at present) and Timer1 and Timer3 are used to generate pulses out of DAC output (0 to 2.5V sensor voltage = 0 to 60 mmHg = -18V to +18V, 20 Hz to 100 Hz, 2000us to 100us pulse width). This is working fine.

    The DAC out is buffered with UG OPAMP using PIC's Internal OPAMP3.

    Stimulator out pulse is Bi-Polar and it is applied to the subject (human or animal).

    Now, I need to calculate the MAP (Mean Arterial Pressure from BP readings that is Systolic and Diastolic).

    This is the equation.

    MAP= 1/3*sbp+2/3*dbp

    or

    MAP=DBP+1/3(SBP-DBP)

    SBP = Systolic BP and DSP = Diastolic BP.

    For now, I am just reading ADC (sensor) continuously in ADC interrupt and taking the peak value.

    I want to get both SBP and DBP readings from ADC. How should I read the sensor? PIC is running at 8 MHz clock. Can't change this.

    If needed, I can post the current code.

    If the blood pressure falls below 60 mmHg then stimulator applies the corresponding to nerve of the subject from above skin.


    This is the Stimlator circuit that I have designed. 0 to 5V (Buffered) from DAC+OPAMP3 is fed to this circuit.

    Also attached PSU circuit that I have designed.

    I need minimum +/- 2V to max +/-18V stimulator output for 0 to 60 mmHg BP.

    How to read SBP and DBP?

    Here is the present code.

    Code C - [expand]
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    
    // LCD module connections
    sbit LCD_RS at LATB4_bit;
    sbit LCD_EN at LATB5_bit;
    sbit LCD_D4 at LATB0_bit;
    sbit LCD_D5 at LATB1_bit;
    sbit LCD_D6 at LATB2_bit;
    sbit LCD_D7 at LATB3_bit;
     
    sbit LCD_RS_Direction at TRISB4_bit;
    sbit LCD_EN_Direction at TRISB5_bit;
    sbit LCD_D4_Direction at TRISB0_bit;
    sbit LCD_D5_Direction at TRISB1_bit;
    sbit LCD_D6_Direction at TRISB2_bit;
    sbit LCD_D7_Direction at TRISB3_bit;
    // End LCD module connections
     
    sbit Read_Blood_Pressure_Switch at RC0_bit;
    sbit Read_Blood_Pressure_Switch_Direction at TRISC0_bit;
     
    sbit GO_DONE_bit at ADCON0.B1;
     
    //#define BASIC_TEST
     
    #ifndef BASIC_TEST
        #define FULL_TEST
    #endif
     
    #define Blood_Pressure_Threshold        246.00
     
    #define Max_BP_Transducer_Output_Voltage  2.50
    #define Max_OpAmp_Output_Voltage          5.00
    #define Max_BP_Reading_In_mmHg          250.00
     
    #define ADC_Resolution 1023.0
    #define DAC_Resolution 1023.0
     
    typedef struct {
      unsigned int rawAdcValue;
      unsigned int oldRawAdcValue;
      double bpValueInMmHg;
      double bpTransducerOutputVoltage;
      unsigned int maxAdcReading;
      unsigned int oldMaxAdcReading;
    }ADC_TYPE;
     
    typedef struct {
      unsigned int dacValue;
    }DAC_TYPE;
     
    typedef struct {
      unsigned int timer1ReloadValue;
      unsigned int oldTimer1ReloadValue;
    }TIMER1_TYPE;
     
    typedef struct {
      unsigned int timer3ReloadValue;
      unsigned int oldTimer2ReloadValue;
    }TIMER3_TYPE;
     
    typedef struct {
      ADC_TYPE adc;
      DAC_TYPE dac;
      TIMER1_TYPE timer1;
      TIMER3_TYPE timer3;
    }BLOOD_PRESSURE_MONITOR_TYPE;
     
    BLOOD_PRESSURE_MONITOR_TYPE bpMonitor;
    unsigned char flagReg = 0;
    char txt[23];
     
    sbit readBloodPressure at flagReg.B0;
    sbit toggleDacOutput   at flagReg.B1;
     
    const code char txt1[] = "   BP Monitor   ";
    const code char txt2[] = "BP: ";
    const code char txt3[] = "SV: ";
     
    //Timer1
    //Prescaler 1:1; TMR1 Preload = 55536; Actual Interrupt Time : 5 ms
    void InitTimer1() {
        T1CON = 0x00;
        TMR1IF_bit = 0;
        TMR1H = 0x00;
        TMR1L = 0x00;
        TMR1IE_bit = 1;
    }
     
    //Timer3
    //Prescaler 1:1; TMR3 Preload = 65336; Actual Interrupt Time : 100 us
    void InitTimer3() {
        T3CON = 0x00;
        TMR3IF_bit = 0;
        TMR3H = 0xFF;
        TMR3L = 0x38;
        TMR3IE_bit = 1;
    }
     
    long map(long x, long in_min, long in_max, long out_min, long out_max) {
        return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
    }
     
    void interrupt() {
        if((ADIE_bit) && (ADIF_bit)) {
            ADIF_bit = 0;
     
            bpMonitor.adc.rawAdcValue = (unsigned int)(ADRESH << 8) + ADRESL;
     
            if(bpMonitor.adc.oldMaxAdcReading < bpMonitor.adc.rawAdcValue) {
               bpMonitor.adc.oldMaxAdcReading = bpMonitor.adc.rawAdcValue;
            }
     
            if(bpMonitor.adc.rawAdcValue <= Blood_Pressure_Threshold) {
                if(toggleDacOutput == 0) {
                    bpMonitor.dac.dacValue = (unsigned int)map((long)bpMonitor.adc.rawAdcValue, 0, 246, 1023, 0);
                    bpMonitor.timer1.timer1ReloadValue = (unsigned int)map((long)bpMonitor.adc.rawAdcValue, 0, 246, 15536, 55536);
                    bpMonitor.timer3.timer3ReloadValue = (unsigned int)map((long)bpMonitor.adc.rawAdcValue, 0, 246, 61536, 65336);
                }
     
                if(bpMonitor.timer1.timer1ReloadValue != bpMonitor.timer1.oldTimer1ReloadValue) {
                    bpMonitor.timer1.oldTimer1ReloadValue = bpMonitor.timer1.timer1ReloadValue;
                    if(TMR1ON_bit == 0) { TMR1H = 0xFE; TMR1L = 0xFF; TMR1ON_bit = 1; }
                }
            }
        }
     
        if((TMR1IE_bit) && (TMR1IF_bit)) {
            TMR1IF_bit = 0;
            TMR1H = bpMonitor.timer1.timer1ReloadValue >> 8;
            TMR1L = bpMonitor.timer1.timer1ReloadValue;
     
            toggleDacOutput = ~toggleDacOutput;
     
            if(toggleDacOutput) {
               DAC1REFH = bpMonitor.dac.dacValue >> 8;
               DAC1REFL = bpMonitor.dac.dacValue;
     
               TMR3H = bpMonitor.timer3.timer3ReloadValue >> 8;
               TMR3L = bpMonitor.timer3.timer3ReloadValue;
     
               DAC1LD_bit = 1;
               TMR3ON_bit = 1;
            }
            
            GO_DONE_bit = 1;
        }
     
        if((TMR3IE_bit) && (TMR3IF_bit)) {
            TMR3IF_bit = 0;
            TMR3ON_bit = 0;
     
            DAC1REFH = 0;
            DAC1REFL = 0;
            DAC1LD_bit = 1;
        }
    }
     
    // copy const to ram string
    char *CopyConst2Ram(char *dest, const code char *src) {
        char *d;
     
        d = dest;
     
        for(;*dest++ = *src++;);
     
        return d;
    }
     
    void initailizePorts() {
        TRISA = 0x37;
        TRISB = 0x00;
        TRISC = 0x21;
        TRISD = 0x00;
        TRISE = 0x00;
     
        PORTA = 0x00;
        PORTB = 0x00;
        PORTC = 0x00;
        PORTD = 0x00;
        PORTE = 0x00;
     
        LATA = 0x00;
        LATB = 0x00;
        LATC = 0x00;
        LATD = 0x00;
        LATE = 0x00;
     
        ODCONA = 0x00;
        ODCONB = 0x00;
        ODCONC = 0x00;
        ODCOND = 0x00;
        ODCONE = 0x00;
     
        WPUA = 0x00;
        WPUB = 0x00;
        WPUC = 0x01;
        WPUD = 0x00;
        WPUE = 0x00;
     
        HIDRVB = 0x00;
     
        SLRCONA = 0x00;
        SLRCONB = 0x00;
        SLRCONC = 0x00;
        SLRCOND = 0x00;
        SLRCONE = 0x00;
    }
     
    void initailizeADC() {
        ANSELA = 0x37;
        ANSELB = 0x00;
        ANSELC = 0x60;
        ANSELD = 0x00;
        ANSELE = 0x00;
     
        ADCON0 = 0x00;
        ADCON1 = 0b11010000;
        ADCON2 = 0x00;
    }
     
    void initailizeDAC() {
        FVRCON = 0x00;
        DAC1CON0 = 0xA0;
        DAC1REFH = 0x00;
        DAC1REFL = 0x00;
        DAC1OE1_bit = 1;
        DAC1LD_bit = 1;
    }
     
    void initailizeOPAMP() {
        OPA1CON = 0x80;
        OPA1ORS = 0x00;
        OPA1NCHS = 0x00;
        OPA1PCHS = 0x00;
     
        OPA3CON = 0x90;
        OPA3ORS = 0x00;
        OPA3NCHS = 0x00;
        OPA3PCHS = 0x00;
    }
     
    void initializeVariables() {
        bpMonitor.adc.rawAdcValue = 0;
        bpMonitor.adc.oldRawAdcValue = 0;
        bpMonitor.adc.bpValueInMmHg = 0.0;
        bpMonitor.adc.maxAdcReading = 0;
        bpMonitor.adc.oldMaxAdcReading = 0;
        bpMonitor.adc.bpTransducerOutputVoltage = 0.0;
    }
     
    void main() {
        OSCCON = 0x73;
        OSCSTAT = 0x11;
        OSCTUNE = 0x00;
     
        initailizePorts();
        initailizeADC();
        initailizeDAC();
        initailizeOPAMP();
        initializeVariables();
     
        Delay_ms(200);
     
        Lcd_Init();
        Lcd_Cmd(_LCD_CURSOR_OFF);
        Lcd_Cmd(_LCD_CLEAR);
     
        Lcd_Out(1,1,CopyConst2Ram(txt,txt1));
        Lcd_Out(2,1,CopyConst2Ram(txt,txt2));
        Lcd_Out(2,9,CopyConst2Ram(txt,txt3));
     
        Sound_Init(&PORTC, 2);
        Sound_Play(800,800);
     
        ADIF_bit = 0;
        ADIE_bit = 0;
        ADON_bit = 1;
     
        while(1) {
             if(/*(bpMonitor.adc.oldRawAdcValue != bpMonitor.adc.rawAdcValue) && */(bpMonitor.adc.rawAdcValue < bpMonitor.adc.oldMaxAdcReading)) {
                bpMonitor.adc.bpValueInMmHg = (double)bpMonitor.adc.oldMaxAdcReading * Max_BP_Reading_In_mmHg / ADC_Resolution;
                bpMonitor.adc.bpTransducerOutputVoltage = (double)bpMonitor.adc.oldMaxAdcReading * Max_BP_Transducer_Output_Voltage / ADC_Resolution;
     
                sprintf(txt, "%3.0f", bpMonitor.adc.bpValueInMmHg);
                Ltrim(txt);
                Rtrim(txt);
                strcat(txt," ");
                Lcd_Out(2,5,txt);
     
                sprintf(txt, "%5.2f", bpMonitor.adc.bpTransducerOutputVoltage);
                Ltrim(txt);
                Rtrim(txt);
                strcat(txt," ");
                Lcd_Out(2,13,txt);
     
                bpMonitor.adc.oldMaxAdcReading = 0;
                bpMonitor.adc.oldRawAdcValue = bpMonitor.adc.rawAdcValue;
             }
     
             if(Read_Blood_Pressure_Switch == 0) {
                Delay_ms(50);
                while(Read_Blood_Pressure_Switch == 0);
     
                toggleDacOutput = 0;
                ADIF_bit = 0;
                ADIE_bit = ~ADIE_bit;
     
                if(ADIE_bit) {
                    InitTimer1();
                    InitTimer3();
                    PEIE_bit = 1;
                    GIE_bit = 1;
                    GO_DONE_bit = 1;
                }
                else {
                    PEIE_bit = 0;
                    GIE_bit = 0;
                    GO_DONE_bit = 0;
                    TMR1ON_bit = 0;
                    TMR3ON_bit = 0;
                    DAC1REFH = 0;
                    DAC1REFL = 0;
                    DAC1LD_bit = 1;
                }
             }
        }
    }

    - - - Updated - - -

    BP threshold 60 mmHg = raw adc value 246.00

    Code:
    #define Blood_Pressure_Threshold        246.00
    Last edited by baileychic; 27th May 2019 at 13:16.



  15. #15
    Super Moderator
    Points: 75,514, Level: 67
    Achievements:
    7 years registered
    Awards:
    Most Frequent Poster 3rd Helpful Member

    Join Date
    Apr 2014
    Posts
    15,307
    Helped
    3486 / 3486
    Points
    75,514
    Level
    67

    Re: How to interface BP Transducer to PIC18F?

    Hi,

    your supply schematic:
    * C3 and C7 need to be reversed
    * C4, C7, C9, C11: 10uF...100uF should be well sufficient. It is more effective if you increase the value of C1 and C3.
    * Not wrong, but more power efficient: when you connect U3, U4, U5 directely to BR1 ... instead of serializing them. This also may increase peak current delivery.
    * Iīm not sure if connecting two 7805 in parallel is allowed...Donīt expect equal current distribution...and equal heating. I even doubt that paralleling makes sense with your circuit. Whatīs the idea behind it?


    your signal schematic:
    * U1 is connected as an amplifier, but itīs gain is so high (too high), that it canīt regulate. It will saturate close to the positive rail.
    * U2 is connected as comparator. --> Better use a dedicated comparator instead of an OPAMP.
    * Whatīs the use of R1 and R2?

    Itīs not clear whatīs the real input signal (source, levels, analog or digital), and what ouput signal you expect (anlog, digital, levels, timing).

    Currently I donīt think itīs correct.

    Klaus
    Please donīt contact me via PM, because there is no time to respond to them. No friend requests. Thank you.



  16. #16
    Advanced Member level 2
    Points: 2,848, Level: 12
    baileychic's Avatar
    Join Date
    Aug 2017
    Posts
    562
    Helped
    49 / 49
    Points
    2,848
    Level
    12

    Re: How to interface BP Transducer to PIC18F?

    Okay, I will change the capacitors. Two 7805's are used because LCD backlight draws more current and if single is used it will heat up. 5V is used only for PIC and LCD circuits.

    The Stimulator circuit posted gives -18V to +18V Bi-Polar signal when DAC output is 5V currently.

    I need to change it.

    Sensor voltage is 0 to 2.5V = 0 to 250 mmHg.

    Sensor voltage 0 to 2.5V is scaled with PIC's OPAMP1 to get 0 to 5V for ADC input.

    0 to 5V = 0 to 1023 raw adc value.

    0 to 60 mmHg BP = 0 to 246 raw adc value.

    0 to 60 mmHg BP = 0 to 246 raw adc value = +/-18V to +/-2V Bi-Polar signal is the requirement (How should I change the circuit for this?)

    I need to take SBP and DBP readings and calculate MAP (mean arterial pressure) and then based on it change the Stimulator signal.

    Currently 0 to 60 mmHg BP = 0 to 5V DAC output = 0 to +/-18V Stimulator output.

    I prefer scaling the DAC voltage in code to get 0 to 60 mmHg BP = =/-18V to +/-2V pulsed Stimulator signal.

    I found the U2 circuit at a website. I forgot the link. If I get it I will post it here. It was for +/-5V and I modified it for +/-18V.



    Edit:

    Scaling issue I solve myself.

    0 to 60 mmHg BP = 0 to 246 raw adc value and this is mapped to 5V to 2V DAC voltage. range is 5V - 2V = 3V.

    resolution = 3V/60mmHg = 0.05, required is 0.1.

    5V = 18V
    x = 2V

    x = 0.55V

    5V = 1023
    0.55V = y

    y = 112.53

    so, 0 to 60 mmHg BP is mapped for DAC voltage as (5V to 0.55V) which is equal to raew DAC value (1023 to 112.53) which gives +/-18V to +/-2V Stimulator signal.

    Code:
    #define Blood_Pressure_Threshold        246.00
    
    #define Max_BP_Transducer_Output_Voltage  2.50
    #define Max_OpAmp_Output_Voltage          5.00
    #define Max_BP_Reading_In_mmHg          250.00
    
    #define ADC_Resolution 1023.0
    #define DAC_Resolution 1023.0
    
    
    if(bpMonitor.adc.rawAdcValue <= Blood_Pressure_Threshold) {
                if(toggleDacOutput == 0) {
                    bpMonitor.dac.dacValue = (unsigned int)map((long)bpMonitor.adc.rawAdcValue, 0, 246, 1023, 113);

    I just want to know how to read SBP and DBP to get MAP because I need to adjust Stimulator signal based on MAP value.
    Last edited by baileychic; 27th May 2019 at 14:10.



  17. #17
    Super Moderator
    Points: 75,514, Level: 67
    Achievements:
    7 years registered
    Awards:
    Most Frequent Poster 3rd Helpful Member

    Join Date
    Apr 2014
    Posts
    15,307
    Helped
    3486 / 3486
    Points
    75,514
    Level
    67

    Re: How to interface BP Transducer to PIC18F?

    Hi,

    Two 7805's are used because LCD backlight draws more current and if single is used it will heat up.
    The ammount of produced heat will not be less when you connect two 7805 in parallel.

    And if you claim that 7805 will get hot, then - according your circuit - 7818 and 7809 will dissipate more power (generate more heat) than one (or two) 7805.
    --> in my eyes it makes no sense.

    The Stimulator circuit posted gives -18V to +18V Bi-Polar signal when DAC output is 5V currently.
    I expect
    * close to -18V ouput at 0V input
    * close to +18V output when 5V input

    so far so good...

    * but it will be
    * -18V for every DAC ouput from 0V ... 2.5V
    * +18V for every DAC output from 2.5V ... 5V

    0 to 60 mmHg BP = 0 to 246 raw adc value = +/-18V to +/-2V Bi-Polar signal is the requirement (How should I change the circuit for this?)
    I donīt understand this.
    What about a hand drawn sketch?


    Klaus
    Please donīt contact me via PM, because there is no time to respond to them. No friend requests. Thank you.



    •   AltAdvertisement

        
       

  18. #18
    Advanced Member level 2
    Points: 2,848, Level: 12
    baileychic's Avatar
    Join Date
    Aug 2017
    Posts
    562
    Helped
    49 / 49
    Points
    2,848
    Level
    12

    Re: How to interface BP Transducer to PIC18F?

    Quote Originally Posted by KlausST View Post
    Hi,


    The ammount of produced heat will not be less when you connect two 7805 in parallel.

    And if you claim that 7805 will get hot, then - according your circuit - 7818 and 7809 will dissipate more power (generate more heat) than one (or two) 7805.
    --> in my eyes it makes no sense.
    So, what is the solution to avoid all regulators heating. I can input more than 12V into LM7805.

    Quote Originally Posted by KlausST View Post
    I expect
    * close to -18V ouput at 0V input
    * close to +18V output when 5V input

    so far so good...

    * but it will be
    * -18V for every DAC ouput from 0V ... 2.5V
    * +18V for every DAC output from 2.5V ... 5V

    I donīt understand this.
    What about a hand drawn sketch?


    Klaus

    What is neede now is:

    0 to 60 mmHg BP should give +/-18V to +/-2V Bi-Polar signal continuously that is when Blood Pressure is 60 mmHg then +/-2V Bi-Polar signal will be applied to subject through Stimulator continuously.
    When BP falls to 0 mmHg then +/-18V Bi-Polar signal is applied to subject through Stimulator.

    So, for 2.5V DAC output 18/2 = 9V, so, +/-9V Bi-Polar signal is applied. This is just a rough explanation because I already changed the DAC output scale in previous post.

    I want 2 things now:

    First a circuit whic h converts 0 to 5V DAC output into +/-18V to +/-2V Bi-Polor signal.
    Second thing is how to read SBP (Systolic BP) and DSP (Diastolic BP) using ADC for calculating MAP (Mean Arterial Pressure).

    If it is still not clear, then I can explain more.


    @Klaus

    You are write. My circuit was wrong and I fixed it. This was the page I had referred earlier.

    https://masteringelectronicsdesign.c...ge-output-dac/

    Still not getting correct Bi-Polar voltage for 0 to 5V DAC output.

    How to fix it.

    Latest circuit.

    - - - Updated - - -

    I am referring to this now.

    http://www.ti.com/lit/an/slaa869/slaa869.pdf

    Need to install MAPLE to solve the equations.

    I need to get +/-18V Bi_Polar signal with 5V DAC output and +/-18V Power supply for OPAMP.
    Last edited by baileychic; 27th May 2019 at 15:02.



  19. #19
    Super Moderator
    Points: 75,514, Level: 67
    Achievements:
    7 years registered
    Awards:
    Most Frequent Poster 3rd Helpful Member

    Join Date
    Apr 2014
    Posts
    15,307
    Helped
    3486 / 3486
    Points
    75,514
    Level
    67

    Re: How to interface BP Transducer to PIC18F?

    Hi,

    I still donīt get how you want to get a bipolar +/-18V output from a single 0V DAC ouput.

    An OPAMP amplifier can genrate: V_OUT = V_in x Gain + Offset.

    ***
    With your first OPAMP:
    Gain = 3.6
    Offset = 0

    Thus: V_Out = V_in x 3.6

    With your second OPAMP:
    Gain = 2
    Offset = -18V

    Thus: V_Out = V_in x 2 - 18V

    ***
    Thus the overall formula is:

    V_Stim = V_DAC x 3.6 x 2 -18V = V_DAC * 7.2 -18V.

    ****
    For V_DAC = 0V --> V_Stim = -18V (this has nothing to do with bipolar)
    For V_DAC = 5V --> V_Stim = 5V x 3.6 x 2 -18V = 18V (again this has nothing to do with bipolar)
    Note: this is against Common mode input voltage specification of your OPAMP, because IN+ = 18V but itīs specified to be +Supply -2V which is 18V-2V = 16V

    Klaus
    Please donīt contact me via PM, because there is no time to respond to them. No friend requests. Thank you.



  20. #20
    Advanced Member level 2
    Points: 2,848, Level: 12
    baileychic's Avatar
    Join Date
    Aug 2017
    Posts
    562
    Helped
    49 / 49
    Points
    2,848
    Level
    12

    Re: How to interface BP Transducer to PIC18F?

    Okay.

    Did you refer the ti.com document in the previous post? I am using that now but still not getting Bi-Polar signals. Does that mean the ti.com document is wrong?

    - - - Updated - - -

    I guess the ti.com document is all wrong. It is not working for me.

    Can anybody show how to solve these equations to get 0 to 5V DAC voltage = +/-18V to +/-2V Output?

    https://masteringelectronicsdesign.c...ge-output-dac/

    I solved some an found that R4 by choosing R3 as 10k and obtained R4 = 36k.

    I am having problem calculating R1 and R2.


    1 + R4/R3 I am getting as 1 + 3.6 = 4.6.

    How to solve for R1 and R2?


    Even this calculator method is not working.

    https://masteringelectronicsdesign.c...-calculator-2/

    For 5V input and 2V Vref (R2 = R3 = 10k) it gives +/-18V signal but for 1V input it gives (-10.5 to -18.0V) signal.
    Last edited by baileychic; 27th May 2019 at 17:26.



--[[ ]]--