The idea is to design a board with a small ARM microcontroller (Cortex-M4) that can be used to implement audio effects for things like guitar effects. It is small enough to be implanted in an electric guitar or in a small stomp box.
The board is based on a STM32F405RG microcontroller (192KiB RAM, Cortex-M4 with DSP and floating point instructions) and a WM8731 audio codec.
I have a working board, now at the third revision. It's being tested mounted in an old wah-wah pedal and in an electric guitar.
I have noticed for some time that the line-in signal from the codec (WM8731) can have some strange noise components. When the input is silent, like when it's left open or shorted to ground, I would have expected the signal to be pretty close to zero and have a flat noise floor when looked at in the frequency domain. I noticed that the noise components can be moved around, and sometimes made to almost disappear, by poking at the audio input in different ways or feeding it different signals. My guess was that there was something non-optimal about the power supply or the I2S clocking. But the weirdness reached a new level when I noticed that a new batch of chips (labelled "58AJMDN") made different noises than the old ones ("56ADMDN"). The old would have a soft band of noise around 2 kHz + harmonics, while the new ones had a sharper noise peak around 1 kHz. This prompted deeper investigations, and furrows upon my forehead.
It turned out to be a bit tricky to get a stable and working USB connection, but I think I've got it now. There have been issues with interrupt priorities, device descriptors, buffer sizes, … I have implemented an ACM "serial port", where log messages can be sent to the host, and an audio interface that essentially presents a stereo microphone to the host. This works well and stable when talking to a Linux computer, and I have had the chance to test the ACM serial port on MacOS (where it turns out to be hard to find a program that is happy to handle lines with a simple \n ending from a serial port).
One tricky thing that I haven't solved yet is synchronisation between the two clock domains (USB host and audio sampling clock), which shows up as glitches in the audio stream at regular intervals.
I recently borrowed a thermal camera to figure out how hot the board gets, especially when powered from the higher end of the expected supply voltage range.
This is an image of the board taken with a thermal imaging camera. The shot was taken after feeding the board with a 10V supply for an hour or so. The LDO—where the voltage is dropped to 3.3V—obviously shows up as hottest, peaking at about 74°C. Supply current is around 80 mA here, meaning that the LDO and the diode before it have to dump about half a Watt into the air and board.
The conclusion is that it's wise to feed the board with a lower voltage to keep losses down. No surprises there :-)
A package arrived in the mail today with a new run of PCBs from ITEAD Studio. Two weeks from order to delivered goods is quite impressive!
I'm amused by their imprecise approach to doing business. The order was for ten boards but I got 17 plus some other random stuff from the warehouse floor — 10mH inductors, a bag of diodes and some random board.
I sent off the Gerber files for the rev.B iteration of the board to production yesterday. This second revision contains basically the same parts, but the placement and routing has been refactored and I've added more test points and stuff.
This time I'm using ITEAD studio (itead.cc) for making PCB prototypes — the rev.A PCB run was made by OSH Park. OSH Park's PCBs are really beautiful and manufactured to a very high standard and the delivery time is not atrociously long. ITEAD studio is none of the above, but quite a bit cheaper for non-tiny boards if I'm actually going to use all the 12 that they promise to produce.
So I guess I'll have something to do this Christmas.