ECE 4760: Laboratory 1

Digital Capacitance Meter.


You will produce a digital capacitance meter (DCM) which displays the capacitance on the graphic LCD. The DCM will measure capacitances from 1 to 100 nF. But first you need to set up a board, arrange jumpers, learn how to connect peripheral devices and use the compiler.


The hardware you will be using to support the PIC32 microcontroller is a small board providing:

In the initial testing phase of this lab, you are going to connect a TFT LCD screen to use for debugging and results.
The connections will be much like the photos on the TFT page, but you will get Vdd from the connection in the middle of the Microstick2.
You may want to solder a header pin there. Turns out that the GND and Vdd pins are not quite 0.1 inch apart, so you need to
bend the header slightly to make it fit. Also note that the jumper in the lower left of the image below is unmounted to turn off
the on-board LED.

Connections to MCU

The MCU peripherials can be configured to different pins, so some planning is necessary to fit the pieces together.
For this lab I suggest the following:


Software you will use is freely downloadable and consists of:

More information


  1. For most of the semester you will be useing the TFT LCD for output and debugging.
    Read the TFT page, then wire it up as summarized above, and run the run the test code below.
    You will need to use some of the graphics library calls described there in this lab.
    The (ZIP for TFT) includes the project, source and libraries for TFT and for Protothreads, and has serial and dubugging turned off.
    The Protothreads library has appropriate defines disabled (see above).
    Test code: TFT_test_BRL4.c. -- displays color patches, system time, and moves a ball.
  2. You may want to refer the the ProtoThreads page for the general threading setup.
    But note that the UART functions mentioned on that page were deleted for TFT compatability.
    The following test code shows how to set up a timer input event capture, which you will need to do for this lab.
    Test code: Timer_catpure_signal_gen_1_1.c, ZIP includes TFT
  3. Timing of all functions in this lab, and every exercise in this course will be handled by interrupt-driven counters, (including the builtin functions in ProtoThreads) and not by software wait-loops. This will be enforced because wait-loops are hard to debug and tend to limit multitasking. You may not use any form of a delay(mSec) function.
  4. You can connect the oscilloscope to the computer with a USB cable (type-B connector) attached to the back of the oscilloscope (not the type-A connector on the front).
    To use the Tektronix software on the PC:
    1. Search for OpenChoice Desktop in the start menu, and start the program.
    2. When the main panel appears, choose Select Instrument.
    3. In the select dialog box, choose the USB device, and click OK.
    4. Back in the main panel, click Get Screen.
    5. Copy or save the image or data to your lab report.

Capacitance measurement

The approach we will use is to measure the time it takes for a RC circuit to charge a capacitor to a given level. Using the IVref internal voltage reference, then the level will be v(t1.2)=1.2±0.06 . Since the internal reference has 5% possible error, you will need to measure the voltage for your chip. Specifically, we will use the internal analog comparator as shown in the following diagram to trigger a timer capture event. The C1OUT pin needs to be connected to one of the event capture channels, with IC1 shown. Since R will be known, we can get C because the voltage on the capacitor v(t)=Vdd(1-exp(-t/τ)) with τ=R*C. The capacitor shown is the device you are trying to measure.You must choose R so that the capacitor charging time is not too short or too long. If it is too short you will lose measurement accuracy. It if is too long, the timer will overflow. The 100 ohm resistor limits discharging current when using pin 7 (B3) as an output. The following code snippet is sufficient to set up internal compare1 and read C1OUT with the oscilloscope.
//set up compare 1
PPSOutput(4, RPB9, C1OUT); //pin18
mPORTBSetPinsDigitalIn(BIT_3); //Set port as input (pin 7 is RB3

One thread of your program will have to (in time order):

  1. Drive C1INA (PortB3) to zero by making it an output and clearing the bit, then wait long enough to discharge the capacitor through 100 ohms. Since R and the 100 ohm resistor form a voltage divider, to dischage to zero volts with 1% accuracy, R>100*(100ohms).
  2. Convert C1INA (PortB3) to an input and start a timer connected to the chosen capture unit.. The capacitor will start to charge toward Vcc.
  3. Detect when the voltage at C1INA (PortB3) is greater than than the IVref. That is, you will have to record when the comparator changes state. Do this by connecting the comapator output to the input capture IC1. Using input capture gives better timing accuracy and more dynamic range than polling or an interrupt.
  4. Print capicitance to the TFT.
  5. Repeat

I suggest that you organize the program as follows:



Timing of all functions in this lab, and every exercise in this course will be handled by interrupt-driven counters, not by software wait-loops.
ProtoThreads maintains a ISR driven timer for you! This will be enforced because wait-loops are hard to debug and tend to limit multitasking.

Write a Protohreads C program which will:

When you demonstrate the program to a staff member, you should demonstrate that the capacitance is correct within the tolerance of the resistors you use. Your program should not need to be reset during the demo.

Your written lab report should include the sections mentioned in the policy page, and :

Copyright Cornell University November 16, 2016