ECE476 Spring 2007
Vincent Lee and Jeffrey Wu
Our device is an impedance analyzer that determines the complex impedance of any R-C circuit within an impedance range.
Our original plan for creating this device was to develop a body fat measurer, a portable device that could allow users to monitor their health at their convenience. However due to device limitations we were unable to achieve this goal. Rather than an actual body fat measurer our end product is an impedance analyzer which is the foundation of a body fat measurer. The impedance analyzer is able to measure the complex impedance of any device under test (DUT) for a range of signal frequencies from 500-2000 Hz.
High Level Design
The idea to develop a portable body fat measurer stemmed from the health conscious member of our group, Vincent Lee, who thought that it would be a good device if it was conveniently available to the public. Current body fat measurement devices are either professionally used medical devices or are attached to scales so that both a body fat percentage and a weight can be determined by using the scale. Our idea was to create a portable body fat measurer and fitness motivator that would measurer the user's body fat and motivate them by words of encouragement or jeering remarks to make the user go work out.
The general idea behind a body fat measurer or any impedance analyzer is that a generated AC current is passed through a body or a device under test (DUT) and the resulting signal coming from the body is analyzed by measuring its output voltage and phase shift from the generated signal. These measurements are then interpreted and the resulting impedance of the DUT can be determined. From this calculated impedance value, a body fat percentage could be determined based on the user's characteristics and empirical models that have been developed over the years.
Impedance is the ratio between voltage across and current through a device. The distinction between impedance and resistance is that it has a phase shift component as well. Consequently, impedance is a complex number, the real part of impedance refers to resistance and the imaginary part refers to reactance.Z = R + jX
Resistance is the dissipative part of the impedance, while the reactance is the energy storage component. Impedance can be rewritten in terms of a phasor multiplied by the magnitude. The magnitude of the impedance can be calculated as:
while the phase shift is
The impedance of a resistor is simply R, the resistor value, and the impedance for a capacitor is -j/wC where C is its capacitance and w = 2*pi*frequency; similarly the impedance for an inductor is jwL where L is its inductance and w = 2*pi*frequency.
The critical factor in constructing an impedance analyzer is having a constant current AC signal. Given a constant current AC source, the voltage level of the output signal after the DUT can be measured to determine the resist
The main software and hardware tradeoff considered in our project was creating our sine wave signal. Although numerous methods exist to create a sine wave, our device requires generating a programmable multi-frequency sine wave generator capable up to 50kHz. The accuracy of the frequency is also crucial.
There are both the hardware and the software approaches. The software approaches include DDS through PWM or DAC, while the hardware approaches usually involve some form of oscillators and filters. The strength of DDS is that the frequency of the sine wave is variable with software. However, the drawback is the number of samples needed and the demanding processing power required from the MCU.
Initially the sine was generated using the DDS technique on MCU. However through trying to generate a 50 kHz sine wave using a parallel DAC, we realized that this method would not be efficient as it took up most of the processing time of the MCU. Sine a 50 kHz sine wave requires at least twice the frequency for its sampling frequency in order to reconstruct the waveform. To have a decent sine wave for our application, it is necessary to increase the samples per cycle to 8 samples at least, and this would require 400 kHz, which means the ISR would have to be executed every 40 clock cycles. Although a 50kHz sine wave can be generated, it leaves the MCU very few cycles to take measurement of the amplitude and phase shift.
Although the hardware approach spares the MCU from spending its processing power on sine wave generation, it is not software programmable. The frequency can only be changed by varying the value of the physical resistors and capacitors. Therefore it is not possible to control it using MCU.
The hardware approach is satisfactory to generate only one known frequency. However, it's frequency limitation would prevent multi-frequency measurement be taken. Next we tried the hardware approach by using a 555 timer and low pass filtering the output. This method allows us to realize a 50 kHz sine wave.
However the need for multi-frequency generation prompted us to combine the software and the hardware approach. We procured an IC butterworth lowpass filter (MAX7480), and toggled the I/O pins on the STK500 to generate clk signal. The clk signals determines the corner frequency on the filter, which filters another clk signal generated by the MCU to give us a programmable sine wave generator. With the corner frequency set at the frequency of the sine wave, this method produced a smooth 50 kHz signal, and requires minimal amount of processing power from the MCU
was not feasible because our current source was not stable enough. Therefore we then decided to change our project to an impedance analyzer for a wide range of frequencies. As a result, we had to change our generator again because hardware timers are normally set at one frequency and must be rewired to generate another. Our final timer design once again uses software, the timer alternates the switching of a pin generating a square wave that is filtered by an 8th order Butterworth filter. This last design does not require much processing time, can generate multiple frequencies depending on the timer pres-scalar and OCR value and provides ample time to complete post processing of the hardware circuits. The most ideal sine wave generator is probably using a waveform generator chip so we could vary the frequency and the voltage amplitude of the waveforms generated.
In the developing a body fat measurer the main considerations with engineering standards are mainly the standards regarding the production of medical devices and testing devices on human subjects. In developing a medical device there are a variety of standards to meet because it will be used on human beings, however in construction of an impedance analyzer there are not that many standards that need to be considered. One such IEEE standard was a resistance measurement standard but it has been withdrawn.
Both the body fat measurer and impedance analyzer are patented devices, however our design is not based upon the existing devices as those designs are not open to the public and would probably cost more than our required budget. Therefore our design for measuring impedance is an innovative design that we came up on our own. The main papers and designs that we referenced were the paper, "A Multi-Frequency Current Source for Bioimpedance Application" by Kuo-Sheng Cheng, Cheng-Yu Chen, Min-Wei Huang and Chien-Hung Chen and documentation by RJL Systems, a pioneer of bioimpedance sciences since 1979. From the RJL Systems' documentation we gained valuable insight into the basis of bioimpedance measurement and from the "Multi-Frequency Current Source for Bioimpedance" paper we obtained a general design method to create a multi-frequency current source. Aside from these two main sources, we developed our own method of analyzing the output signal based on fundamental ECE principles.
The software can be separated into three parts: 1) square wave generation at a known frequency, 2) amplitude and phase shift measurement, and 3) the plotting of the results on the TV.
1) Square Wave generation:
The sine wave generation method we adopted is to low-pass filter a square wave with a corner frequency at the square wave frequency. This method requires two square waves: one to serve as the signal to be filtered into a sine wave, and the other to feed into the clock of the filter (MAX7480) to determine the corner frequency.
The filter works by having a clock signal that has a frequency 100 times of the corner frequency. For instance, an external clock signal of 100kHz would set the filter's corner frequency at 100Hz. The filter's corner frequency range is from 1Hz to 2kHz. Thus, the square wave that needs to be used as the clk line has to be 2kHz * 100 = 200kHz at its maximum.
The challenge lies in the use of different timers to generate two high-frequency square waves for the filter. Because the highest frequency that needs to be generated is 200kHz, that means the I/O pin has to toggled at 400kHz. Consequently, ISR has to be evoked every 40 clock cycles to produce a 2kHz sine wave.
It was first attempted to use one hardware timer to generate the clk signal, and place a counter that counts up to 100 to generate the sine wave signal. However, the software counter uses up too many cycles inside the ISR, and at the highest frequency, the ISR cannot meet the deadline, resulting in a degradation in the sine wave signal. As a result, we switched over to a scheme that employs two different hardware timers, each with a single line of command that toggles their respective I/O pin at different frequencies.
This method works well for high-frequency. However because of the wide range of frequency of square wave that needs to be generated (1Hz to 200kHz). The timers need to be controlled carefully by altering the compare match value (OCR) and the prescaler to ensure maximum resolution and that the OCR has enough bits for the required compare value.
To this end, TIMER2 and TIMER1B are used because they have the highest priority over TIMER0, and TIMER1B has enough bits to store a large number in OCR. This allows generation of low-frequency square wave. However TIMER1B and TIMER1A, which is for video generation, have to be alternated to accommodate for the conflict.
2) Amplitude and Phase shift measurement
During the measurement phase, a state machine is employed to keep control over the different stages of the measurement. At the same time, TIMER2 and TIMER1B continues to generate square waves, while TIMER0 is evoked every 1 ms in order to provide a timer to provide functions, such as wait and debounce.
The state machine above first selects PORTA.2 to sample the amplitude measurement. In the ref_inc state, the program then examines whether the measurement is close to 0V. If so, that means the reference voltage on PORTB is at or above the peak of the sine wave. The value is then stored in an array, and then the state switches over to increase the sine wave frequency. More details about the measurement is discussed at hardware section.
If the measurement is not close to 0V, the reference voltage output from PORTB is incremented. Then a wait state is introduced in order for the new change in reference voltage to propagate through the circuit. The reason is that the RC low-pass filter averages out the PWM to a DC level, but the averaging will take time to settle to the correct level. After the wait state, the state machine takes another sample, and then jumps back to the inc_ref state to examine the amplitude measurement again. This cycle reiterates until either 1) a peak is determined, or 2) the reference voltage is at max and a peak has not been found. In the latter case, the array will be stored with a value of 0 and an "invalid range" message will be sent back to the PC.
In the increase_freq state, a preset range of frequencies are looped through. At certain frequencies, there may be a need to change the prescalers, and if blocks accomplishes such a task. OCR's for TIMER1 and TIMER2 are updated with the appropriate values.
After the frequency has been increased, another wait state ensures the sine wave is well established before jumping back to the amplitude sampling state. After all the frequencies are cycled through, phase amplitude is started by jumping to the phase state. ADMUX is written to change the sample pin for the ADC. Then phase measurement is sampled through ADC, and stored in an array. After the phase measurement is taken, we increase the frequency again until all the frequencies have been cycled through and all phase measurements are taken. At this point, amplitude and phase shift measurement are complete.
The challenge of this part is that the waiting time and sample time is crucial in order to achieve the shortest execution time while allowing the circuit to fully reflect the change in the reference voltage. If there is not enough wait time between each voltage increase, the sampled data will not reflect the change, and another increase in the reference voltage could be resulted. As a consequence, the reference voltage overshoots above the peak voltage, and gives a false value.
3) Video generation:
After the amplitude and phase shift measurement are done, these data are processed in the post state. Amplitude is used to determine the impedance of the DUT. This is achieved by determining the current flowing through the DUT from the howland current source under a certain excitation frequency, and then store the current values in an array for different frequencies. Then the measured voltage and the known current can be used to determine the impedance. Similarly, phase can be determined by knowing that a value of 0 at ADC corresponds to in-phase while 255 corresponds to 180 degrees out of phase from understanding the datasheet of the CMOS Phase Lock Loop. In the same state, impedance is scaled into a coordinate in the y-axis, and stored in an array.
Video generation is done in the next state, display. Almost all the lines and points were drawn prior to the display state. This state simply turns off the sine wave generation TIMERs, and then turn on TIMER1A, while enabling TIMER1A interrupt, and disabling TIMER1B interrupt. The video generation code is courtesy of Professor Bruce Land's ECE476 Lab. The ISR containing the video generation code plots the results on the TV screen.
The last state in the state machine polls the switches, and if the user pressed switch 3, a cursor on the screen moves to the right, while switch 4, to the left. The screen displays the information for the impedance, phase shift and the frequency of the data point indicated by the cursor. A third button can also be pressed to restart the measurement for another load. The button is debounced by a software timer that disables polling for a period of time after the button press.
As mentioned in the overall design of the device above, there are three main stages to the device: signal generation, analysis of the output signal from the DUT, and software post processing of the results from the hardware analysis. The main hardware circuits of this device consist of filtering and generating the current source for the current source and then the phase comparator and voltage comparator processing of the output signal. Additional hardware components used are the STK500 board to interface with the MCU and the television which displays the output of impedance measurements. A detailed schematic of the hardware design and setup and be found in Appendix II. Schematics.
Sine Wave Signal Generation
According to our project goals we needed to sweep the frequency from 1 Hz to 2 kHz therefore we needed a software based variable frequency waveform generator because any hardware waveform generator based on an oscillator would be hard wired to generate a single fixed frequency. To generate a variable frequency using the MCU, we simply used the timer to control the speed of toggling a pin, effectively creating a square wave. The frequency of the signal generated was controlled by the speed of the timer being used by setting both the appropriate pre-scalar and the compare match value. With the method we could effectively control the frequency of the output signal.
After the signal was generated the next step is to filter the square wave and pass it through a current source so that it becomes a sine wave current. To filter the square wave we sampled a MAX7480, which is an 8th order Butterworth variable frequency low pass filter. The MAX7480 was wired according to the typical operating diagram on the datasheet. A link to the datasheet can be found in the References section. Because square waves are harmonics of sine waves with the same fundamental frequency, setting the cut-off frequency at the fundamental frequency could eliminate the high harmonics, and generate a sine wave of the same frequency. Therefore when the square wave was passed through the MAX7480 with the cut-off frequency set to an appropriate value, the output becomes a sine wave.
The sine wave coming out from the filter is from 5V to ground. Therefore to obtain a true AC signal, the signal is first high pass filtered to remove the DC signal before passing the signal to the current source. The specific values we used for our high pass filter is a 0.1 uF capacitor and a 2 kO resistor, which provides a filter with a cut-off frequency that modulates the amplitude of the sine wave with respect to frequency.
The advantage of having such a high-pass filter that lowers the amplitude at the low frequencies is that with the measurement of a capacitive device. The lowered amplitude results in a lowered current. The formula Z = 1/jwc shows that the impedance is inversely proportional to the frequency. Therefore, if the amplitude of the current stays constant at all frequencies, at low frequencies, the voltage across the capacitive device will shoot through the roof. However with a high pass filter that attenuates at low frequencies, the increased impedance is offset by the decreased amplitude. As a result, it controls the voltage of the capacitive device within a measurable range.
After being filtered, the resulting signal is zero centered and is then passed onto both the current source and the phase comparator circuit. The signal passed onto the phase comparator circuit will be described below. The current source we chose to implement is a Howland current source as described in the paper, "A Multi-Frequency Current Source for Bioimpedance Application." The specific values we used for the current source were based upon the Bilateral Current Source design in a paper by National Semiconductor titled, "IC Op Amps Beats FETs on Input Current." (The specific circuit diagram can be found in the Appendix.)
As a current source, it is desirable to have infinite output impedance. According to the formula, the output impedance becomes very large when the resistors are well-matched. Therefore 1% resistors are required to match the resistor values and achieve as high an output impedance as possible. However, the output impedance is dependent on frequency of the excitation voltage as well. It was discovered that at high frequencies, the output impedance decreases dramatically, and the current source is no longer constant. This defect renders the 50 kHz sine wave unfeasible.
The load at the output of the current source was the DUT, and the load current is only dependent on the feedback resistors of the op-amps and the input voltage. This is essentially voltage-controlled-current-source. The output from the current sources passes through the DUT, and then goes to the phase and voltage comparators.
Hardware Analysis of the Signal
Prior to entering the phase and voltage comparators, the signals coming out from the Howland current source are first passed through a voltage follower to ensure that no change after the DUT will affect the measured impedance. Immediately following the DUT is another high pass filter similar to the filter before entering the current source, except that the resistor is now 300 kO. There is a filter after the current source is because we noticed that it tended to introduced some offset to the resulting signal. Therefore, to make sure the signal was zero centered, we high pass filtered the signal again.
Peak Voltage Detector
The voltage analysis circuit used in our device mainly consists of a LM311 comparator chip that compares the input signal after the DUT to a voltage level provided by a DAC. Prior to this circuit we attempted to rectify the signal and then detect the peak voltage of the rectified signal by coupling the output with a large electrolytic capacitor. However this method was very unstable and the measured peak voltage was actually several hundred mV off from the actual peak voltage.
Therefore we decided to pursue other methods and thus thought of this comparator circuit based on TTL zero crossing from the typical applications section of the LM311 datasheet. This comparator is fed two inputs as mentioned before, the signal after the DUT and a voltage level from a DAC that is controlled by the MCU. The output of the comparator is a square wave, whose duty cycle is determined by amount of the time that the voltage of the input signal is higher than the reference voltage.
This square wave is then averaged by a second order low pass filter so that it is averaged out to a DC level, making it much simpler to be sampled by the MCU's ADC. The values for the capacitor and resistor forming both stages of the low pass filter are 0.1 uF and 100 kohm respectively. The MCU then determines if this level is the peak voltage level. If not, the MCU increases the voltage level coming out of the DAC connected to the I/O port.
The peak voltage is determined by the DC voltage level input into the ADC, which corresponds to the duty cycle of the square wave output from the LM311. If the DAC voltage level is zero, then the duty cycle should be approximately 50%, assuming the input wave is centered at zero because that the signal would be higher than zero half the time. As the DAC voltage level increases, there should be less and less of the input signal that is higher than the reference voltage during one cycle. At or immediately after the peak signal voltage, the duty cycle should be approximately zero percent. Once the ADC reads in a tolerable level of "zero volts" the MCU stores the voltage level last output by the DAC and that is determined as the input signal's peak voltage.
A similar approach to the method determining the peak voltage of the input signal is also used to determine the time delay between the signal before and after the DUT. The general idea is that the phase difference between the two signals directly corresponds to a constant voltage level. The voltage level is obtained by converting the signals to square waves and measuring their overlap through a XOR gate. This overlap generates a square wave, which is low pass filtered and corresponds directly to a phase difference value.
The signal before the DUT actually comes before the entering the Howland current source. However before entering the phase comparator section, the signal is first passed through a voltage follower and an inverter. The purpose of the voltage follower as mentioned before is to make sure the any change in the next section of circuit does not affect the circuit before the DUT by adding on to the load. The purpose of the inverter, as its name suggests, is to invert the signal after the voltage follower.
The inverter is needed because the Howland current source actually inverts the incoming signal. Therefore the original signal is inverted to match the current seen by the DUT. 1% 2 kO resistors are used across the input and feedback loop of the inverter to ensure unity gain.
The signal after the DUT as described before comes from the series of a voltage follower and high pass filter after the Howland current source. Before these two signals are input into the phase comparator, the signals are first passed through actively low pass filtered voltage followers so that the circuitry after the DUT does not affect the signal and the noise of the signal is reduced. The resistor value on the input to the voltage follower is 1 kO and the resistor and capacitor values on the feedback loop are 1 kO and 22 pF respectively.
Next the signals are converted to square waves using two LM311 comparators and comparing the signals to ground. The comparators are wired exactly as the wiring used for the comparator in the voltage peak detector, based on the TTL Interface with High Level Logic in the typical applications section of the LM311 datasheet. The output of the LM311 comparators is fed into a MM74HC4046 chip which has three different phase comparators. The phase comparator mainly used by us, is the first one, which is essentially an XOR gate.
The output of this gate is also a square wave whose duty cycle corresponds to the amount of phase shift between the two signals (when two signals are different, it's high; when they are the same, the output is low). This wave is then low pass filtered by a second order low pass filter, producing a DC voltage level, relating to a specific duty cycle or overlap amount. The values for the capacitor and resistor forming both stages of the low pass filter are 0.1 uF and 200 kohm respectively.
The relationship between the DC voltage output and the phase difference of the signals is actually a linear one, if the waves are completely in phase, the voltage level is zero and when they are completely out of phase the voltage level is five volts. Since the relationship is linear, knowing the voltage level from completely out of phase and for completely in phase can be used to determine any voltage level in between the two ends of phase differences. Thus the voltage level is passed into the ADC so the MCU can calculate the approximate phase shift.
The two voltage levels that are passed into the MCU from the phase comparator and the voltage peak detector circuit are processed by the MCU to convert the voltage levels into values of resistance and phase delay. Once those values are calculated the MCU plots a graph of the measured impedance values and the signal frequency onto the television screen. Using two buttons on the STK500, the user can scroll through the points plotted for each frequency and the values of the resistance and phase angle measured are displayed at the bottom of the television screen. A third button has also been implemented to recalculate the impedance after the user has changed the DUT.
In terms of setting up the hardware for this circuit wiring the actual components is relatively simple as long as you follow the datasheets and the overall schematic. However, the hardest and most critical part of this circuit is choosing the resistor and capacitor values for the filters. The values listed above for each filter is specific to our circuit and for the range of frequencies that our circuit is able to operate under. These values were carefully chosen and tweaked to obtain maximum accuracy of our measurement device. Therefore in reproducing this circuit, be sure to use the exact same resistor and capacitor values for the filters otherwise your accuracy will differ from ours significantly.
Results of the Design
After four weeks of researching, testing and debugging different bioelectrical impedance and electrical impedance measurement designs we were able to produce a working impedance measurement device. Although it is not the body fat measurer that we originally wanted, at this stage of completion we have completed the bulk of the work for constructing a body fat measurer. In the end we simply did not have the time and the components to build the circuits necessary to make a body fat measurement device.
Our end result accurately calculates the impedance for devices from 500 ohm to 9.5 kohm for a range of frequencies from 1 Hz to 2 kHz with an error of approximately 5%. The following graphs show the difference between measured results and expected results:
As shown on the graph, the results are more accurate at high frequencies than low frequencies. Also, the results are better for a smaller load than a larger load as expected, since a larger load means a larger percentage of the output impedance. The current output is not as constant as expected.
When the program executes there is a brief delay as the program measures the impedance of the device at each different frequency. The wait time depends on the impedance of the device being measured. The maximum wait time occurs for the highest impedance that our device can calculate and is approximately four minutes. Once the program is complete the output is a plot on the television of a graph displaying the calculated resistance versus the range of frequencies. The graph is also "interactive" in that by using two push buttons on the STK500 board, the user is able to move a cursor along the different frequencies that the impedance was calculated it. At each cursor point the television displays the frequency at which the measurement was made and the measured impedance and phase delay. A third button acts as a reset button, when pressed the program recalculates the impedance measurement, this allows the user to change the DUT and recalculate the impedance. The television produces a very smooth display, meaning there is no jittering in the overall display or when the cursor moves to each point on the plot. Overall the device is easy and safe to use, since it is easy to plug in and remove devices to test and we are not measuring body impedance anymore.
Although our project did not meet our initial expectations, we are still satisfied by the complex impedance analyzer that we were able to create. The body fat calculator was not feasible due to design and component restraints. The main problem our device encountered was being able to construct a stable current source for a 50 kHz signal. Our final device, even though it may not be able to measure human impedance, it is still able to determine accurate values of complex impedance. If this device was taken one step further and a stable current source that worked at 50 kHz was added, it could easily be converted into a bioimpedance measurement device.
If we were to attempt this project again, more time would be spent on creating a stable current source for higher frequencies because it is the most important factor of an accurate impedance measurement. Also the filters and waveform generator would be designed so that they were more flexible in terms of the range of frequencies that they can handle or produce.
Currently some of the filters are hard wired through resistor and capacitor values, however if was an adjustable filter cut off frequency, our device would be much more accurate. Similarly our waveform generator is also limited in the range of frequencies that it can produce, which is mainly due to the Butterworth filter that we are using. We would obtain a filter chip capable of higher cut-off frequencies in order to expand the range of our frequency sweep. However other than the limitations of the devices available to us, our innovative theory and design to measure the different components of the complex seems to work very well.
In development of our design and overall development for both the bioimpedance analyzer and the complex impedance measurer, we tried to be as consistent as possible with the IEEE code of Ethics.
While designing the devices we made sure to be informed about all the circuits we were constructing whether it is through our prior ECE knowledge or through our own research. Other considerations we made while developing our devices included user safety and avoiding plagiarism. To make sure that the user was safe we made sure to keep the current and voltage levels low so that in case of human interaction or contact there would be a very low risk of electrocution. To prevent against plagiarism we cite and acknowledge all sources and references whether it be for circuit diagrams or general background information on bioimpedance analysis.
Through the constructing, testing and debugging stages of this project we welcomed criticism from all of peers and especially the teaching assistants and the Professor, Bruce Land. We also made sure to credit all of our peers that contributed to the completion of our device. While working on our project we treated all persons equally in all situations, ranging from asking for help on our project to aiding any other group that approached us with questions or asking for criticisms.
Now that we have completed our project, we made sure to include a full description of our device in a report that will be published to the public. In the description we will explain all background information and rationale for this project, the schematics for the device and summarize the performance range of the device. The summary of our device's performance range we will include the limitations of our device, ranging from the frequency range that it can handle to the range of impedance values that our device can accurately measure. Along with the range of impedance values, the report will include an error percentage that our device has in measuring that impedance. In documenting our device we attempt to be fully honest and as accurate as possible in all facets of our calculations.
Overall we feel accomplished in our efforts and our device, which is able to measure complex impedances. Although engineers constantly use devices to measure impedance there are not schematics or designs on how the devices actually function. Following the basic theory of measuring impedance that we learned in our attempt to create a bioimpedance analyzer, we were able to develop our own methods to measure complex impedances. This final project served as a great cumulative experience allowing us to recall information learned from previous ECE courses and applying the information through a hands-on project. This project was a worthwhile experience that allows students to incorporate different concepts that they have learned or used before to obtain an even better and more overall understanding of ECE.
|12V Power Supply||$5|
|White Board (2)||$12|
|STK500 Power Supply||$5|
- Circuit Design
- Software Coding
- Circuit/Software Debugging
- Hardware Wiring
- Writing the Lab Report
- Circuit/Software Debugging
Code/Design borrowed from others