This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

LMP91000 for cyclic voltammetry

Other Parts Discussed in Thread: LMP91000

Hi,

I am woking on a project where i am communicating LMP91000 with arduino for cyclic voltammetry.I have selected the mode of operation as Three Lead Amperometric.I am able to give step voltages between the WE and RE electrodes.But Vout is not varying and i am not able to know from where the current will be measured.Moreover i donot know how to calibrate it when the standard screen printed electrode is interfaced to the LMP9100.I am struck.Plz help m with guideline so I can continue

Thanks

  • Did you ever get this figured out? I am working on the same thing and may have some input.
  • here is the code what I tested.
    #include <Wire.h>
    #define LMP91000_Slave_Address 0x48
    #define STATUS 0x00

    #define MODECN 0x12
    #define Fet_Short_Enabled 0x80
    #define Deep_sleep 0x00
    #define Two_lead_gnd 0x01
    #define Standby 0x02
    #define Three_Lead_Amperometric 0x03
    #define Temperature_meas_TIA_Off 0x06
    #define Temperature_meas_TIA_On 0x07

    #define LOCKCN 0x01
    #define Write_TIACN_REFCN 0x00
    #define Read_TIACN_REFCN 0x01

    #define TIACN 0x10
    #define Gain_External_Resistance 0x00
    #define Gain_2p75KOhm 0x04
    #define Gain_3p5KOhm 0x08
    #define Gain_7KOhm 0x0C
    #define Gain_14KOhm 0x10
    #define Gain_35KOhm 0x14
    #define Gain_120KOhm 0x18
    #define Gain_350KhOhm 0x1C
    #define Rload_10_Ohm 0x00
    #define Rload_33_Ohm 0x01
    #define Rload_50_Ohm 0x02
    #define Rload_100_Ohm 0x03

    #define REFCN 0x11
    #define Internal_Vref 0x00
    #define External_Vref 0x80
    #define Internal_Zero_20 0x00
    #define Internal_Zero_50 0x20
    #define Internal_Zero_67 0x40
    #define Internal_Zero_Bypassed 0x60
    #define Bias_Negative 0x00
    #define Bias_Positive 0x10
    #define Bias_0_Percent 0x00
    #define Bias_1_Percent 0x01
    #define Bias_2_Percent 0x02
    #define Bias_4_Percent 0x03
    #define Bias_6_Percent 0x04
    #define Bias_8_Percent 0x05
    #define Bias_10_Percent 0x06
    #define Bias_12_Percent 0x07
    #define Bias_14_Percent 0x08
    #define Bias_16_Percent 0x09
    #define Bias_18_Percent 0x0A
    #define Bias_20_Percent 0x0B
    #define Bias_22_Percent 0x0C
    #define Bias_24_Percent 0x0D
    void setup() {
    Serial.begin(9600);
    Wire.begin();
    }
    void loop() {
    Wire.beginTransmission(LMP91000_Slave_Address);
    Wire.write(STATUS);
    Wire.endTransmission();
    Wire.requestFrom(LMP91000_Slave_Address,1);
    while(Wire.available()==0);
    int a=Wire.read();
    Wire.beginTransmission(LMP91000_Slave_Address);
    Wire.write(LOCKCN);
    Wire.write(Write_TIACN_REFCN);
    Wire.endTransmission();
    Wire.requestFrom(LMP91000_Slave_Address,1);
    while(Wire.available()==0);
    int b=Wire.read();
    Wire.beginTransmission(LMP91000_Slave_Address);
    Wire.write(MODECN);
    Wire.write(Three_Lead_Amperometric);
    Wire.endTransmission();
    Wire.requestFrom(LMP91000_Slave_Address,1);
    while(Wire.available()==0);
    //int b=Wire.read();
    Wire.beginTransmission(LMP91000_Slave_Address);
    Wire.write(TIACN);
    Wire.write(Gain_7KOhm|Rload_100_Ohm);
    Wire.endTransmission();
    Wire.requestFrom(LMP91000_Slave_Address,1);
    while(Wire.available()==0);
    int c=Wire.read();
     }

    the code should be modified further so that step voltages are provided

  • Which pin is reading your VOUT?  VOUT is analog and therefore should be accounted for with an analogRead() which will give you your potential proportional to current experienced at the WE.  Here's the real trick though: analogRead() is not a continuous process from the Arduino and will only happen as often as it is placed in the loop.  If your cyclic voltammertric cycle is as long as mine, 50 mV per second slope and scans at every 5 mV increase (from 0-650 mV would take 50 mV per/second, 26 seconds with samples taken every 5 mV increase [50 mV/s divided by 5 mV/sample = 10 samples/ second = an analogRead() every 100 millisecond. In a 26 second long loop, that's a LOT of analogRead()'s. 

    Also, current should be:
    Vout = Internal Zero - Iwe * RTIA

    Solve for current.

    Let me know if your logic is the same. 

  • Also, I'm not exactly sure what you mean by calibration, but when your VOUT is measured, Arduino remaps input voltages from 0 -1024, meaning a 512 read from an analog input is equal to 2.5 Volts, 1024 is 5 Volts, and 0 is 0 volts. Once your code has programmatically accounted for this remapping, I would guess testing several known standards to create a calibration curve would probably be the best way to calibrate the instrument.
  • Hello,
    I have a question about how to do the applied voltage variation.
    I wanted to vary in increments of 50 mV or less than that.
    Can I just apply this voltage to the electrode pins instead of 3.3V?
    Can I do this with the power pins?
    I think the power supply should be 3.3V constant and make the voltage variation of the electrodes in a separate place. But I did not see where to do it. (Well, that's just a kick!)

    Thank you very much for any help.
    Cleber Borges
  • Hi Cleber,
    Yes it is possible to modify the voltage applied to the Reference Electrode, changing the BIAS selection bits in REFCN register (Address 0x11).
    The bias voltage can be programmed to be 1% to 24% (14 steps in total) of the supply, or of the external reference voltage.
    The 14 steps can be programmed through the I2C interface. The polarity of the bias can be also programmed.
    In your case you can select to use an external reference voltage (for example 2.5V), and you can select the bias value from 1% (25mV) to 24% ( 600mV).
    Let me know if this replies to your question.
    Best regards,
    Carmine
  • Thank you for your attention but do not answer my doubt.
    I would like to vary the voltage to my purpose such as from 0 to 5V in steps of 50 mv, that is, 100 voltage settings defined by me.

    This is just one example of one case.

  • Cleber:

    What I did to incrementally change the voltage BIAS was vary the amount of power that was provided to the VREF on the LMP91000.  For instance, the BIAS can be set, as Carmine stated, to 0, 1, 2, 4, 6... and so on the 24% of the available power supply, so if you change the amount available to the LMP91000, you can achieve a greater variety of voltage BIAS between WE and RE depending on the flexibility of your microcontroller and power supply.  

    For instance, if I want to set the potential between WE and RE to values from -100 to 600 mV, I would provide an amount of voltage to the VREF of the LMP91000, that, when multiplied by any one of the possible BIAS settings, i.e., 0,1,2,4,6,8,10,12,14,16,18,20,22,24 (all in percentages, of course), would equal a value in the range.  Specifically:

    600 mV = .24 * (xVREF)


    where 600 mV is the desired potential between the WE and RE, .24 is a possible BIAS setting of the power supply (@ VREF on LMP91000), and xVREF is the potential that must be set at VREF to achieve this potential between the WE and RE.  

    50 mV increments is not as bad as, say, 20 mV increments, which is what laboratory potentiostats often increment by during cyclic voltammetry.  Obviously, both sized increments, with the LMP91000's BIAS limitations, can put you through quite a bit of math to figure out every combination necessary for your scan parameter.  So I wrote a quick program to calculate all the values needed in the BIAS settings and VREF so that those values needed to just be plugged into the code.  

    Hope this helps and was clear.