This is only a preview of the November 2023 issue of Silicon Chip.
You can view 47 of the 112 pages in the full issue, including the advertisments.
Articles in this series:
Items relevant to "Pico Audio Analyser":
Articles in this series:
Items relevant to "K-Type Thermostat":
Items relevant to "Modem/Router Watchdog":
Items relevant to "1kW+ Class-D Amplifier, Pt2":
Items relevant to "Recreating Sputnik-1, Part 1":
Purchase a printed copy of this issue for $12.50.
Project by Tim Blythman This handy little tool uses an inexpensive Raspberry Pi Pico microcontroller board and not much else to generate and analyse audio signals. It has oscilloscope and spectrum modes and can run a sweep to plot a frequency response or perform harmonic analysis to check signal quality. It fits in the palm of your hand, is portable and battery powered. PICO Audio Analyser T he Pico Audio Analyser is a compact handheld device that’s powered by an internal rechargeable battery. It can generate and analyse basic audio signals and is suitable for various tasks such as checking amplifiers, wiring, filters etc. It’s a handy tool for working in the field, and for troubleshooting and tinkering with audio circuits. You can even hook it up to a breadboard to test simple circuits like RC filters. This project was inspired by a Circuit Notebook submission, which used a dsPIC microcontroller with an LCD to create a spectrum analyser (August 2023; siliconchip.au/Article/15908). The concept is also similar to our Low Frequency Distortion Analyser (April 2015; siliconchip.au/Article/8441). We took those ideas and expanded them to include more features. One potentially interesting use is to monitor the distortion of the mains waveform, which theoretically is a sinewave, but often looks little like one! To do that, you’d connect the output of just about any AC plugpack to its input and put it in distortion analysis mode. Like the earlier designs mentioned Features & Specifications > Audio signal generator (up to 3V peak-to-peak/1.06V RMS) with selectable frequency > Sine, square, triangle, sawtooth and white noise waveforms > Audio signal input with switchable 3.6V and 34V peak-to-peak ranges (1.27/12V > > > > > > > > > > > 36 RMS) Oscilloscope and spectrum displays Harmonic analysis with THD measured down to 0.3% (1.2V RMS, 1.2kHz) Can measure and monitor mains distortion with a suitable plugpack Sweep analysis with frequency response display RCA sockets for input and output Runs from USB power or an internal rechargeable battery Uses 128×64 OLED display and pushbutton controls Compact and portable Controllable from a virtual USB serial port Typical current draw around 50mA Operates for around 12 hours with a fully charged 600mAh battery Silicon Chip Australia's electronics magazine above, the Pico Analyser uses a Fourier transform to examine the frequency components of a signal. That allows us to create a spectrum display and perform a sweep analysis. The April 2015 article explains in detail the use of Fourier transforms and how they are used to measure distortion. Design When planning this design, we had in mind that it should be inexpensive and compact. The circuitry fits in the smallest Jiffy box (UB5), measuring just 83 × 54mm. The front panel is also the back of the main PCB, recessed into the top of the box, meaning that the height is just 28mm and even less than it would be with the box’s included lid. The display is a 1.3-inch (33mm) diagonal OLED, about the smallest type of display capable of showing graphics. It can also display multiple lines of text. We used this sort of screen in the Advanced SMD Test Tweezers (February & March 2023; siliconchip. au/Series/396). No expensive ADC (analog-to- digital converter) or DAC (digital-to- analog converter) chips are used in this design. Instead, a Pico microcontroller board uses its onboard 12-bit ADC (see panel later) to sample the input and a filtered PWM (pulse width modulation) peripheral to drive the output. The Pico also has an onboard 3.3V switchmode regulator that can operate in PFM (pulse frequency modulation) siliconchip.com.au Fig.1: the Analyser is implemented mainly in software running on the Pico. By only making connections along one side of MOD1, we can mount the Pico on its edge, saving PCB space. and PWM modes. We use the PWM mode, as the PFM mode can introduce low-frequency artefacts under the light load levels that this circuit draws. A clean 3.3V rail is important for this application, as it is used to set the output level and as the reference for the ADC. While a switchmode regulator is not the best choice for high- quality audio, using the Pico’s onboard regulator also removes the need to provide separate circuitry and saves us further on hardware costs. Circuit details Fig.1 shows the circuit diagram of the Pico Analyser. MOD1 is the Raspberry Pi Pico microcontroller module. The input stage of the Pico Analyser receives a signal via the RCA socket at CON1. A 4.7kW resistor combined with a 1nF capacitor gives a low-pass filter with a -3dB point of around 34kHz. This reduces any high-frequency components that the ADC might alias. The 100kW resistor keeps this signal biased to ground whenever nothing siliconchip.com.au is connected. A 10μF capacitor AC- couples the signal so that the Pico’s analog input pin (AIN, pin 31) can be DC-biased to 1.65V (half of the 3.3V supply) by another 100kW resistor. The incoming network attenuates the audio slightly, to around 91% of its original level. That means that voltages up to 3.6V (peak-to-peak) can be measured before clipping occurs, corresponding to around 1.2V RMS. Switch S6 can connect a 510W resistor in parallel to the first 100kW resistor, changing the divider formed with the 4.7kW resistor. This allows levels up to 34V peak-to-peak (or 12V RMS) to be measured without clipping. This resistor does change the filter characteristics and may let in more higher- frequency components than the ×1 range. The output signal from the Pico (DOUT, pin 21) is a PWM signal at around 250kHz, so it first passes through two RC filter stages, each consisting of a 2.2kW resistor and 1nF capacitor. A 100kW resistor also biases Australia's electronics magazine this to the 1.65V rail so that a known level is present if the pin is not being driven. The two RC stages give a similar -3dB point to the input stage, attenuating the 250kHz PWM artefacts by 24dB in total, compared to the 12dB for a single stage. The result is not hifi, but good enough for our purposes. This signal is buffered by IC1b, then AC coupled and biased to ground by another 10μF/100kW pair before being made available at CON2. The filtering and biasing mean that around 3.1V peak-to-peak is available from a 3.3V rail, or about 1.1V RMS, although this is limited by the op amp’s drive near its rails and will depend on the output load. Buttons S1-S4 are connected to other available digital input pins. These are used to provide controls for the user interface. Internal pullup currents supplied by the Pico hold the corresponding pins high unless the switches are closed, pulling the attached pins to ground. November 2023 37 Power supply Important to the circuit’s operation is a schottky diode internal to MOD1, from its VBUS pin (40) to its VSYS pin (39). The Pico’s switchmode regulator is fed from VSYS and its output is available at the 3V3 pin. You’ll note that only one side of the Pico has connections. By mounting it on its edge against the PCB, we save much PCB space and it fits more easily in the box. The circuit can be powered from a USB supply via the Pico’s onboard USB connector, leaving around 4.7V available at the VSYS pin. Alternatively, power from a rechargeable lithium battery is provided via D1 when switch S5 is closed, giving around 3.4-3.9V at VSYS. The regulator on the Pico can handle between 1.8V and 5.5V, so these are all comfortably within its operating range. When USB power is available, the battery is charged by IC2. The two 10μF capacitors provide the input and output bypassing it requires, while a 10kW resistor between its pin 5 (PROG) and ground sets the charge current to 100mA. The STAT pin (pin 1) is low during charging and goes high when charging is complete, so the bi-colour LED will show the charging state: red during charging or green when charged; separate 1kW resistors limit the LED currents. MOD2 is a 1.3-inch (33mm) OLED display module. Its VCC pin is fed with whatever voltage is available at the Pico’s VSYS pin, and its onboard regulator provides 3.3V for its operation, as well as internal pullups for the I2C control lines, SDA and SCL. The I2C lines are taken back to the appropriate pins on the Pico so the Pico can update the display. IC1 is a low-voltage dual op amp, and it too is fed from the VSYS rail with a 10μF supply bypass capacitor. Since VSYS is slightly higher than 3.3V, this provides a bit more headroom than the 3V3 rail would allow. The 3V3 rail is divided by a pair of 10kW resistors and bypassed by the 10μF capacitor to give the 1.65V mid-rail reference. This is buffered by unity-gain op amp IC1a. The Pico has four ADC channels, with one internally connected to VSYS via a divider, so two are left after we’ve fed in our audio signal. We’ve connected one of these to the 1.65V rail 38 Silicon Chip so the Pico can check that it is correct. The remaining ADC channel is connected to a divider comprising two 22kW resistors across the battery downstream of the switch. This allows it to read the battery voltage when S5 is closed, ensuring the battery is not drained when the unit is switched off. Software We used the Arduino IDE to create the software, mainly because so many libraries are available. We use OLED libraries from Adafruit that make generating the graphics needed for the spectrum, oscilloscope and frequency response modes easy. The audio generation software is a fairly straightforward PWM implementation, where the PWM duty cycle is updated between samples to provide a varying waveform. It is based on the software we wrote for the Pico BackPack, which has a stereo audio output (siliconchip.au/Article/15236). While we’re using 8-bit PWM, the data is calculated and stored as 16-bit samples, with the PWM data derived from the upper eight bits. Then the remainder due to the lower eight bits is dithered over several PWM cycles per sample period, slightly improving the effective resolution. A block of samples equivalent to about 200ms is generated to provide this data. For all but the lowest frequencies, this means that the frequency does not need to divide evenly into the sampling rate since the sample block contains multiple cycles. We use the second processor core to calculate and update the dithered samples. That is about all the second processor does, so not much can interrupt audio generation once it is running. A similar technique is applied to the analog input sampling. The 12-bit The right-hand end of the case has two holes for the RCA sockets and a notch for S6. ADC runs at 490kHz, very close to its maximum speed of 500kHz. The DMA peripheral captures a block of samples over about 1/10th of a second without interrupting either processor. This means we can detect frequencies down to around 10Hz. The performance of the ADC is a little disappointing; it turns out that the RP2040 chip on the Pico has some problems with the ADC peripheral (see the panel for details). Our software applies adjustments to the ADC readings to compensate for this somewhat. It helps, but the ADC still only has about nine effective bits. The oscilloscope mode uses the raw samples for its display, which provides adequate resolution for the 50-pixel vertical axis. The other modes apply downsampling before running a Fourier transform to extract the frequency elements of the sampled waveform. Much of the software is involved in drawing the various displays and user interfaces. Construction First, use the blank PCB to mark the box, then perform the cuts shown in Fig.2. One end of the box has a notch Fig.2: many of these cuts can be made without measuring. The notches for the switches at the top of the box can be marked using the PCB as a template, while the holes for the RCA sockets do not need to be precisely located, as the sockets are wired with flying leads. Australia's electronics magazine siliconchip.com.au Fig.3: the rear of the PCB also forms the device’s front panel, so all components are surface-mounting. It’s a bit cramped with the OLED and Pico adjacent. We recommend fitting the Pico first and ensuring it is aligned with the hole for its USB socket, then fit the OLED and check its operation before continuing. Note that the OLED is mounted face-down on the rear side. for S5 and the Pico’s USB socket, while the other has a notch for S6, plus two holes for the RCA sockets. The notches can be marked using the edge of the PCB, which might be easier than using a ruler to find the midpoint. Make a pair of vertical cuts on each side, not quite to the desired depth, with a sharp hobby knife or hacksaw. Score along the bottom of the notches with a sharp knife, then carefully flex the tab, which should break off along the scored line. Tidy the corners and edges to the correct depth with a small file or sharp knife if necessary. Mark out the slot for the USB socket and start by drilling two or three holes inside the lines. Then use a small file or sharp-pointed hobby knife to square up the edges of the slot. We can use this slot later to align the Pico correctly, or alternatively, we can make the Pico fit it more easily than we can adjust the hole! The RCA sockets mount in drilled holes that can be made with a twist or step drill. Their exact positions are not critical, as the sockets are connected by flying leads. The measurements shown match our prototype and work well. The front-facing side of the PCB. siliconchip.com.au Starting with a smaller 3mm pilot hole will make it easier to align the holes and adjust them if they are not aligned. We’ve specified 7mm holes to suit the RCA sockets we’ve used, but check if a different size is required for your parts. PCB assembly Many of the components are fairly large standard SMDs. There are a few parts that are mounted in a slightly unorthodox fashion. We recommend starting by fitting the SMDs; you will need a fine-tipped iron and solder, flux paste, tweezers and good illumination. Some solder-wicking braid will be handy, as will some solvent to clean up any excess flux. Use fume removal (such as a fume removal hood) to ensure you are not exposed to smoke from the flux. If that is not possible, work outside in fresh air. Refer to the Fig.3 overlay diagram for the component placements and orientations. You should also consult the photo showing the PCB fitted with surface-mounting parts. The components are pretty close together, and IC2 is the smallest part, so start with it. Put some flux paste on the pads and align the five pins with them; they will only fit one way. Tack one lead on the side with two pins and check that all the other pins are within their pads, adjusting as necessary. Solder the remaining pins and then go back to refresh the first pin. Check for bridges and use solder wick and fresh flux to draw excess solder away, if necessary. Use a similar technique for IC1. Its pins are more widely spaced, so soldering should be easier. Make sure pin 1 of IC1 (which might be marked with a bevel along one edge) is aligned to the dot on the PCB silkscreen. The capacitors are spread around the PCB. Be sure not to mix up the two values, although the 10μF parts will probably be thicker than the 1nF parts. The different resistor values all need to go in the correct locations too. For these passives, use the same basic soldering technique. Solder one lead, then check and adjust before soldering the other lead. The single diode is a bit larger, and you must ensure its polarity is correct, with its cathode stripe towards the “K” on the PCB. If this is reversed, you risk connecting the battery directly to the USB supply, which will probably cause something to burn out. Now is a good time to clean the PCB with a flux solvent. Doing so now avoids the possibility of solvents getting into the switch mechanisms. Isopropyl alcohol is a good all-round choice. Allow the PCB to dry thoroughly before continuing. Fit slide switches S5 and S6 next. They have small leads but are easy to align as they have locating pins in their November 2023 39 Use this photo as a guide to fitting the smaller components. This stage of assembly is a good point to clean off any excess flux in preparation for adding the final components like the switches, LED, Pico and OLED. undersides that lock into holes in the PCB. Tack one lead, confirm that they are flat and then solder the other leads. Next, fit the four reverse tactile switches, S1-S4. We found it helpful to splay the leads out from the bodies so that the switch stems protrude further through the PCB holes. This makes them easier to operate. After soldering one pin, it’s also a good idea to check that the switch stems are centred in their holes through the PCB. That will ensure the front panel looks good and eliminate the possibility of the stems jamming on the PCB. Once you’re happy with them, solder the other three pins on each switch. Be sure to use a generous amount of solder to ensure that they have good mechanical strength. The tricky bits The LED is mounted unusually. While bi-colour SMD LEDs are available, they often have independent leads for the two LEDs, making the pads small and tricky to solder, so we’re using a 3mm through-hole LED as a reversed surface-mounting device. The pad marked K corresponds to the cathode of the red LED inside such a device. If you’re unsure and don’t have the means to test it, just fit the LED one way; if it is incorrect, swap the leads. Carefully bend the leads by 180° and trim them so they are slightly longer than the LED lens. As you can see from our photo overleaf, the tip of the LED is pointed at the opening in the solder mask (facing towards the PCB). Solder the LED leads to the two pads. Fine-tipped tweezers will help to position the component until one lead is soldered. Solder the other lead, then refresh the first joint. The next part is the Pico module. Before proceeding, check that the PCB (with S5 and S6 mounted) sits flush and slots neatly into the box’s notches. The top of the PCB should sit level with the surrounding box. This is to ensure that the USB connector on the Pico can align correctly with the slot in the box. Adjust the notches in the box if necessary. Working with just one end pad on the Pico, tack it roughly into place at right angles to the main PCB. The Pico’s PCB should sit back slightly from the edge of the main PCB, with the USB connector protruding slightly. Note its relative orientation, with the VBUS pin closest to the edge of the PCB and GP16 at the other end. The USB socket should be above the corresponding marking on the silkscreen too. Tack one pad at the other end and carefully adjust the Pico to be at right angles to the main PCB. Test it in the box and see that it is aligned with the slot. Remember that the top of the PCB will sit flush with the top of the box. Once you are happy with the location of the Pico, solder the remaining pins. We found it easiest to feed in the solder from the bottom of the Pico (on the side facing the switches) and apply the iron to the other side, ie, the Pico’s top. Ensure there is a generous fillet on each of the 20 pins to hold the module securely. Now cut the LED lead offcuts (or other fine wire) into four pieces, each about 1cm long. It will help if they are all slightly different lengths to stagger their insertion into MOD2’s pads. Using the tweezers to hold each one, solder them to the centre of the pads for MOD2. They should sit vertically. The Analyser is fully wired up, with its lid open. Note how the LED, OLED and Pico modules have been mounted. Extending the wires from the battery holder allows the lid to be folded open as shown; a generous amount of neutral-cure silicone helps to secure and insulate the battery leads. 40 Silicon Chip Australia's electronics magazine siliconchip.com.au Remove the protective film from the front of the OLED and place it facedown over these wires and flat against the main PCB. You will see that the backwards markings on the PCB now correspond to the OLED pins. Finally, solder each wire to the OLED. Be gentle, as there is little more than surface tension holding the pin in place to the main PCB. You might need to adjust the wire with tweezers. Verify that the OLED is accurately aligned with the silkscreen markings. If it is not, the misalignment will be evident in use. Now is a good time to run some quick tests to ensure that the OLED and Pico are correctly soldered, but the Pico will need to be programmed if it is not already. Programming the Pico Hold the white BOOTSEL button while connecting the Pico to a computer via a USB cable. You might not need to hold the button if you have a new, unprogrammed Pico. Picos supplied in kits are generally not programmed as it’s easy for constructors to do. Then copy the 0410723A.UF2 file to the RPI-RP2 drive that should appear on your computer’s file system. If everything is working, you should see the OLED screen light up after a second. If not, go back and check the solder joints and component placement. Verify that the display contents are square within the PCB cutout. If they are not, you might be able to gently twist the OLED by a small amount. Completion With the OLED aligned, use the remnants of the lead offcuts to secure its two lower holes to the matching pads on the PCB. The connection should work much the same as for the four smaller pads on the top of the OLED module. Prepare the RCA sockets by disassembling them. Cut two pieces of white wire about 4cm long and two pieces of black wire about 4cm long. The colours are not critical, but using two contrasting colours will help identify them. Solder one end of each of the white pieces of wire to the centre connection of an RCA socket. Similarly, solder one end of each black wire to the washer, which becomes the ground connection. siliconchip.com.au Parts List – Pico Audio Analyser 1 double-sided PCB coded 04107231, 83 × 50mm, with black solder mask 1 UB5 Jiffy box (83 × 53 × 30mm) 2 chassis-mount RCA sockets (CON1, CON2) [Altronics P0161] 1 single AA cell holder with flying leads 1 14500 (AA-sized) Li-ion rechargeable cell with nipple 1 Raspberry Pi Pico micro board, programmed with 0410723A.UF2 (MOD1) 1 1.3-inch (33mm) OLED module (MOD2) [Silicon Chip SC5026] 4 reverse-mount SMD tactile switches (S1-S4) [Adafruit 5410] 2 SPDT SMD slide switches (S5-S6) 4 M3 washers, 1.5mm thick 2 20cm lengths of hookup wire (eg, white and black) 1 4cm length of fine bare wire (eg, lead offcuts from LED1) 1 small tube of neutral-cure silicone sealant 1 short RCA-RCA cable (for testing & calibration) Semiconductors 1 MCP6002 or MCP6L2 rail-to-rail dual op amp, SOIC-8 (IC1) 1 MCP73831-2ACI/OT Li-ion charge regulator, SOT-23-5 (IC2) 1 bi-colour red/green 3mm LED (LED1) 1 SS34 40V 3A schottky diode, DO-214 (D1) Capacitors (all M3216/1206 size, X7R ceramic) 6 10μF 16V+ 3 1nF 50V Resistors (all M3216/1206 size, 1% 1/8W) 4 100kW 2 2.2kW Pico Audio Analyser Kit 2 22kW 2 1kW 3 10kW 1 510W SC6772 ($50): includes the PCB and 3 4.7kW everything that mounts directly on it. The Pico is supplied blank and Assemble the sockets into the will need to be programmed using a holes in the enclosure by securing computer and USB cable. the washer with the nut. Adjust them such that the wires poke out the top We do not want these to come loose, of the box, then bend them over the as there is a good chance that their end of the box. bare ends would cause the battery to Next, place the PCB upside down be short-circuited. next to the enclosure and solder the While waiting for the silicone to wires, as shown in the photos opposite cure, you might like to also add some and overleaf. The two black wires go more to CON1 and CON2 on the PCB to to the GND pads on CON1 and CON2, secure the audio connections, as well while the white wires go to the corre- as any exposed metal on the outside of sponding pads marked IN and OUT. the battery holder itself (for example, Use a generous amount of solder to ensure a firm connection. Using neutral-cure silicone or similar gap-filling glue, secure the battery holder to the bottom back corner of the box, with the opening facing outwards. Solder the wires to the BAT+ and BAT- pads on the PCB, being sure to connect the red wire to BAT+ and the black wire to BAT-. If you do not have an RCA-RCA On our prototype, we slightly cable, a simple loopback cable extended one of the battery leads to like this can be made by soldering allow the PCB to fold fully open away a short wire between the centre from the box. That simplified testing pins of two RCA plugs. Such a and assembly. cable is necessary for testing and Like the RCA sockets, use a generous calibrating the Analyser. We also solder fillet to secure the battery leads. found it handy to have a pair Apply silicone around the BAT+ and of RCA plugs fitted with jumper BAT- pads to further secure the batwires to allow connecting to a breadboard for experimentation. tery leads and insulate any bare wire. Australia's electronics magazine November 2023 41 Another close-up of the finished Pico Audio Analyser. Note that the LED is mounted upside-down, as shown in the insert. the previous step. Press OK to proceed to the next screen. Screen 5 sets the INPUT LEVEL on the ×10 range, so leave the cable connected and change S6 to the ×10 range. You will see a prompt similar to the previous step; press DOWN when it appears. Screen 6 is used to save those parameters to flash memory; press DOWN to do so, and you should see a message reporting that this has occurred. If the settings have somehow become corrupted, you can use the UP button here to restore the defaults. Operation around the battery’s contacts with the holder). After the silicone has cured fully, fit the battery, making sure to check its polarity. Switch the unit on with S5 and confirm that the OLED illuminates after about a second. If it does not, remove the battery and check for any problems. Apply power to the USB socket and see that the LED lights up red initially and then goes green when the battery finishes charging. If the LED starts green, it might be reversed. It’s a good idea to remove the battery before making any changes to the circuit. Four washers sit between the PCB and the box’s pillars to keep the PCB flush with the top of the box, so thread these over the screws as you screw them into the box. Take care that you don’t pinch any of the wires. Calibration After some calibration steps, the Analyser will be ready to use. The Analyser will function without calibration, but its accuracy will not be as good. You’ll need a multimeter or oscilloscope that can accurately measure a 500mV AC RMS signal and an RCA plug to RCA plug cable to make a loopback connection between the input and output. We used a pair of RCA plugs with a short piece of wire connecting their centre terminals (the ground connection is made via the PCB in this case). 42 Silicon Chip Power up the Analyser using a USB cable to give the battery a chance to charge. The splash screen shows for a few seconds as the bias voltages stabilise. Press the MODE button until the SETTINGS screen appears (Screen 1), then press OK. Screen 2 shows the first calibration item, the INPUT OFFSET. Ensure nothing is connected to the input and wait until the value seen on the fourth line settles to a steady value and press the DOWN button, then OK. Screen 3 is the OUTPUT LEVEL calibration. The Analyser will deliver a nominal 500mV RMS sinewave, which should be measured at the CON2 output. Use the UP and DOWN buttons to adjust the calibration ratio until your meter reads 500mV, then press OK. Screen 4 sets the INPUT LEVEL for the ×1 range. Connect the CON2 output to the CON1 input and set switch S6 to the ×1 position. Since the Analyser knows it should be receiving a 500mV signal, it can calculate the calibration ratio easily. When you see the “DOWN to set” message, press the DOWN button to load the calculated ratio. This allows us to check that a valid signal is used for the calculations. If you don’t see this message and are sure that S6 is set correctly, there could be a minor problem with the PCB, such as a resistor being the wrong value. This step also depends on the 500mV reference being set correctly in Australia's electronics magazine The remaining screens show the operating modes. The MODE button cycles between the modes, while the UP, DOWN and OK buttons provide controls within each mode. Generally, a pair of angle brackets <> highlights the value being changed. When switching between ×1 and ×10, the input mode must also be manually changed on the SETTINGS page to match. Pressing DOWN selects the ×1 mode (and uses the ×1 calibration factor), while pressing UP selects the ×10 mode. The last line of this page shows the current scaling. The top right corner of the SETTINGS page shows the battery voltage when the power switch (S5) is turned on. Take care that the Analyser is not left switched on when not in use, as there is nothing to prevent the battery from being overdischarged. The first mode (seen in Screen 7) controls the WAVE OUTPUT. This will continue to run at its last setting unless another mode needs to take control of the output. This can occur when a SWEEP is run, or the SETTINGS needs to produce its calibration waveform. The OK button cycles between the various parameters, while the UP and DOWN buttons change them. The set frequency can vary between 10Hz and 10kHz; the frequency steps are smaller for lower frequencies. Since the Pico has a crystal oscillator, we have provided no frequency calibration adjustment. The frequency accuracy of the crystal is around 30ppm (0.003%), which is good enough. The output level can be set in steps of 50mV as either peak-topeak or RMS, and the corresponding equivalent values are displayed siliconchip.com.au depending on what is selected. The ratio between the peak-to-peak and RMS values changes depending on the waveform. Values up to about 2V peak-to-peak should give clean outputs before op amp drive limits come into play, depending on the output load. The chosen op amp is quite robust and can handle an output short circuit indefinitely. The next option cycles between sine, square, triangle, sawtooth and white noise waveforms, while the last option allows the signal to be turned off or on without changing any other settings. Internally, the Analyser generates a 0V amplitude waveform when the output is off. The SPECTRUM mode displays the spectrum of the input waveform (Screen 8). The UP and DOWN buttons change the horizontal scale, while the OK button switches the vertical scale between the PEAK and TOTAL (RMS) amplitude. As the Fourier Transform includes a windowing step, even a pure sinewave will typically be spread across multiple frequency bins. The Low Frequency Distortion Analyser article from April 2015 has more information about windowing (siliconchip. au/Article/8441). The calculated peak frequency is interpolated between the bins and may also be slightly off due to rounding errors. The SCOPE mode (Screen 9) simply shows the shape of the waveform as you would see on an oscilloscope. The UP and DOWN buttons change the horizontal (time) scaling, while the OK button toggles between dots and lines for the plot. You might find the line mode clearer when many cycles are displayed. The vertical scaling is automatic and based on the amplitude, shown as a peak-to-peak value on the left. The SCOPE attempts to trigger on a positive- going zero crossing and, if not, will simply display the last part of the sample it has taken. Screen 1: when the Analyser is first powered up, use the MODE button to cycle through to the SETTINGS page to perform the calibrations. Press OK to start the process. Screen 6: press OK again to see this screen and then DOWN to save the calibration values to flash memory. You will see a message confirming that it was done. Screen 2: to set the INPUT OFFSET, leave the input open and allow the displayed level to settle to a steady value. Then press the DOWN button to store this value, followed by OK. Screen 7: pressing OK on the WAVE OUTPUT screen cycles between the parameters, while UP and DOWN modifies them. The USB serial port can also control the output waveform. Screen 3: use an AC RMS meter or similar instrument to measure the output and adjust (using UP and DOWN) until the meter reads 500mV, then press OK. Screen 8: the SPECTRUM display uses UP and DOWN to change the horizontal scaling, while OK toggles the vertical scale between peak and total energy. Screen 4: connect the input to the output with an appropriate RCA cable for the next steps. Ensure the range switch S6 is set to 1x and press DOWN when prompted, then OK. Screen 9: the SCOPE display also uses UP and DOWN to change the horizontal scaling. The OK button changes between dot and line displays. Screen 5: follow the prompts and set the switch to 10x. You will see a message if S6 is set to the wrong position or a signal is not detected. Press DOWN to set the scaling factor, followed by OK. Screen 10: HARMONIC ANALYSIS provides information about the harmonic content of a waveform. Connecting the input to the output is a good way to check this feature. Harmonic analysis HARMONIC ANALYSIS (Screen 10) provides information about the detected fundamental frequency, an analysis of the harmonics and the measured THD (total harmonic distortion). The UP, DOWN and OK buttons do nothing in this mode. siliconchip.com.au Australia's electronics magazine November 2023 43 Flaws in the RP2040 ADC Our initial design for the Pico Analyser had some optimistic targets. As the RP2040 microcontroller claims to have a 12-bit ADC (analog-to-digital converter), we hoped to get something near the equivalent of 14 bits of resolution with oversampling. However, connecting the output of our Audio Precision System One (with a THD+N figure of around 0.0004%) to the Analyser only gave a reading of around 0.3%, closer to eight effective bits of resolution. Some digging into the RP2040 data sheet revealed an erratum relating to the ADC peripheral that stated the claimed ENOB (effective number of bits) was, in fact, closer to eight. The ADC is a successive approximation register (SAR) type, which uses tiny capacitors arranged with binary weighting within the chip to measure voltages. The total capacitance is around 1pF, meaning the smaller capacitors are on the order of femtofarads (fF or 10-15F)! 44 Silicon Chip Some people have determined, after thorough testing, that the value of some of these capacitors is off by around 0.8%, starting at the third most significant bit (MSB); see https://pico-adc.markomo.me/INL-DNL/ The folks at the Raspberry Pi Foundation have indicated that this is due to a discrepancy between their design simulations of these sampling capacitors and the actual silicon. To test the effect on our own hardware, we temporarily modified the program to count the number of times each different ADC value (4096 possibilities) appeared within a sample set. We then used the Analyser’s wave source to generate a triangle waveform. A triangle wave should spend an equal time at each level (within the waveform’s amplitude) since the slope (amplitude/time) is constant for each half cycle. Fig.4 shows the result of this analysis. Note the zero counts at each end, showing values outside the wave amplitude. There are also slight peaks near the tips of the waveform as the slope changes direction and the Fig.4 waveform is rounded off slightly. The four prominent peaks in an otherwise fairly flat plot show that the ADC ‘thinks’ the waveform is spending longer at these values than it should. The ‘troublesome’ ADC values are 511, 1535, 2559 and 3583, all pointing to problems with the third MSB. This means that the ADC can’t accurately measure voltage around these points. While the input changes by around 10 steps, the ADC output value doesn’t change. The reading is off at times by as many as five steps, and is not responding linearly. The INL (integral non-linearity) plot from the RP2040 data sheet (Fig.5) shows this in another way. This plot shows the deviation in the perforFig.5 mance of the actual ADC from that of an ideal ADC. In practice, the line should be quite flat. The final Analyser software includes a correction stage that attempts to compensate for the ADC non-linearity. This brings the measurable THD down to 0.3% from 0.4%. The applied correction is shown in Fig.6. This makes it act like the four ADC values noted above occupy a wider space in the span. That makes the overall plot more linear, but we still cannot get around the fact that these values occupy a wider range of voltages than the others. This plot is similar to the INL plot. We also tried to apply the INL plot as a correction, as well several Fig.6 others, including some that correct for the lesser errors in some of the other ADC bits. In practice, we chose this one as it gave the best improvement in distortion readings. The correction data is stored in an array named “ADCADJ” in the “util.h” file. To see the effects before adjustment is applied, you can comment out calls to the ADCfix() function. Currently, all RP2040 chips in circulation have this flaw. We may see future chip releases which correct the issue and render the adjustment obsolete. The lesson from all this is: always read the data sheet! Australia's electronics magazine siliconchip.com.au If you are measuring the Analyser’s output, you will see THD figures around 1% for a sinewave, with about 0.7% due to the output stage and 0.3% due to the input stage. These figures will vary depending on the frequency. The final mode is the frequency sweep and response. Screen 11 shows the setup, while Screen 12 shows the results. The lower and upper frequencies can be set in powers of 10 between 10Hz and 10kHz, and up to 30 steps can be applied. Each step takes about 1/3 of a second to process. There is also the option of running a single sweep pass or a continuously updating loop. The default of 10 steps over this range gives a typical display seen in Screen 12; this is with the output connected to the input. The horizontal frequency scale is logarithmic; the dashed grid lines correspond to the second and fifth divisions of their respective decades. The vertical scale is adjustable with the UP and DOWN buttons and the intermediate grid line corresponds to the -3dB point. As an exercise, we connected a simple low-pass RC filter circuit (using a 1kW resistor and a 1μF capacitor) between the input and output. As expected, the SWEEP showed a -3dB point around 160Hz, rolling off more at higher frequencies. While a direct connection from output to input should give a perfectly flat response, there are slight dips at 10Hz and 10kHz as the low-pass and high-pass filters start to take effect. The small peak around 20Hz is a side-effect of the windowing function. Pressing OK from the graph page will end the looping behaviour, or if <OK> is shown, return to the setup menu. Screen 11: SWEEP uses the UP, DOWN and OK buttons like the OUTPUT mode. There is the option of running a single sweep pass or performing a continuous loop. Screen 12: in this display, the UP and DOWN buttons change the vertical scaling; the unlabelled horizontal line being the -3dB point compared to the set level at the output. Most of the remaining commands emulate the controls of the WAVE OUTPUT mode. Since they will work while another mode is active, they can save you the time of cycling between modes to change settings and then trying to view the results. “a” or “A” followed by a number will set the output RMS amplitude in millivolts. For example, “a500” sets the output to 500mV RMS. Similarly, “p” or “P” will set the peak-to-peak amplitude in millivolts. The “f”/“F” option sets the frequency in Hertz, the “w”/”W” command sets the type of waveform, while “o”/“O” turns the wave output off or on. Note that setting parameters too high might result in corrupted waveforms. Another command, “d”/“D”, provides a ‘data dump’ of the next scan in the SCOPE, SPECTRUM, HARMONIC ANALYSIS or SWEEP modes. The data is formatted similarly to a CSV (comma-separated variable) file, so you can paste the data directly into spreadsheet programs that support CSV data. For a SWEEP, the dump will occur after the next pass has completed; Screen 13 shows the same data as in Screen 12 as a spreadsheet. Finally, the “~” command resets the Pico. Holding the BOOTSEL button while issuing this command will enter bootloader mode for reprogramming the Pico. siliconchip.com.au The Pico Analyser is a simple and compact device that uses little in the way of hardware apart from the Pico itself. Its performance is modest, but we think its simplicity and cost make SC it a handy tool. Screen 13: the “d” command at the serial terminal triggers a dump of data in CSV format. We pasted the data shown here, from the SWEEP mode, into a spreadsheet program. Computer control Since we have a USB port on the Pico, we use it to provide alternative controls and data outputs. We recommend using a terminal program such as TeraTerm (on Windows) or minicom (on Linux), as the Arduino serial monitor is quite basic. Most commands are followed by the Enter key, but the commands that emulate the buttons on the Analyser act instantly. For a full list of commands, type “?” and press Enter. The keys listed at the bottom emulate the four onboard buttons. Conclusion Screen 14: this view of TeraTerm shows the commands provided by the virtual USB serial port. The list can be shown by using the “?” command. Australia's electronics magazine November 2023 45