On the subject of front panels, have you considered laser cutting services? I was just looking and found quite a few that were reasonable, especially if you can get away with plastic. If shielding is an issue it may still be more viable to simply line the inside of a plastic panel with foil. Given that they can not only cut holes of whatever shape but may also be able to do 2 tone legend engraving

Dunno if anyone is going to get stroppy over copyright on these old texts, but here is a bit on capacitor leakage and dielectric absorption from Computer Handbook Huskey & Korn, and Electronic Analog and Hybrid Computers, Korn & Korn. Numerous other ancient texts cover the same ground too.

I'm sorry to say it but Bob Pease was a little late to the party on this one.

On the subject of front panels, have you considered laser cutting services? I was just looking and found quite a few that were reasonable, especially if you can get away with plastic. If shielding is an issue it may still be more viable to simply line the inside of a plastic panel with foil. Given that they can not only cut holes of whatever shape but may also be able to do 2 tone legend engraving

Just a thought

Thanks, but I'm not sure that plastic would be strong enough; especially so to support the weight of each "modular" chassis. Another thing is that the entire composite rack system front panel serves as a ground plane for my signal ground.

Well, finally, here is the Lorenz Attractor in 3-D projection with variable angles of rotation (the 3-D projection unit in action). I have to say that I am quite happy with the way the synthesized sine/cosine potentiometers worked out with the 8-bit digital pots and the sine/cosine look up table. The 1 degree step resolution and 8-bit accuracy gives a fluid variation in display that is, for all sakes and purposes, totally analog as far as I as the operator can discern. In all honesty the Lorenz Attractor probably isn't the best 3-D "object" to demonstrate the operation of the projection unit, as it is a bit complex and an interpretation of the display isn't intuitively obvious as it is with simpler shapes and objects, such as the assorted springs I posted screen photos of a few posts previously.

Here is a simplified schematic of the initial, prototype projection unit. It is based on the basic 3-D projection principle outlined in chapter 9 (Multi-Dimensional Displays) of Analog Computing At Ultra High Speed, D M.MacKay, M E. Fischer.

I have made a significant improvement to the above described 3D projection unit. The unit as shown above is only capable of rotating the projection on both the X and Y axes over the range of 0 to 90 degrees. This is quite adequate an adjustable range for graphs and shapes in isometric projection, which are typically shown at a "perspective" of 45 degrees. However I figured that it would be a lot cooler if the projection unit could in fact spin the projected display on either axis the full 360 degrees.

The reason the design detailed above is limited to 0-to-90 degree range is that the digital pots connected as potential dividers (to implement the necessary sine and cosine multiplications) can only effectively multiply in two quadrants (the positive ones) as the range of multiplication of the applied input signal is limited to the range of 0 to 1. Now while 2 quadrants of operation for either a sine or cosine function on its own represents a 180 degree range of rotation, the range is in fact limited 90 degrees when a sine/cosine complement is generated as only a 90 degrees of variation is achievable before one function hits its limit at the point of transition into an off-limits negative quadrant.

However I figured out a simple way to achieve the full 4-quadrant range of operation with each digital pot, thus eliminating the above described restriction and permitting a full 360 degree range of variable rotation on each axis. It's quite simple really. I just followed each of the 8 digital pots implementing the sine and cosine multiplication functions with an individual "amplifier" having a gain of either 1 or -1, depending on the state of a logic control input. The range of multiplication is thus extended from 1 to 0, to 1 to -1, simply by asserting the logic control line to switch the amplifier from a gain of 1 to -1 whenever operation in the negative quadrants are required.

Here is a video of the resultant prototype in action. At the moment the angles of rotation are not manually variable/settable as they were previously as I haven't gotten that far with the code yet. I just wrote a test subroutine to linearly and continuously rotate the projected display on each axis the full 0-to-360 degrees at a fixed and steady rate (one axis rotating twice as fast at the other). Once again the "object" being displayed is the Rössler Attractor:

Such a problem may probably best be broken down into something simple and then built upon. Really don't have much time to devote to that now though! Thoroughly stuck into the computers hardware construction right now.

BTW, could anyone suggest to me a more elegant way of converting a long integer (value ranging 0 to 360) into three seperate decimals (0 to 9) (hundreds [xh], tens [xt] and units [xu])? It should probably be obvious but it is getting close to 1am now.

I've added digital readouts (7-segment LED) for the variable angles of rotation to my 3-D projection unit. The code and hardware is done and operational, but I am now tidying it up the firmware and annotating.

BTW, could anyone suggest to me a more elegant way of converting a long integer (value ranging 0 to 360) into three seperate decimals (0 to 9) (hundreds [xh], tens [xt] and units [xu])? It should probably be obvious but it is getting close to 1am now.

One approach is to convert to BCD, then mask off nibbles - if you happen to have a library function for that, or an app note with efficient code for your uC (I presume this is in the 'pretend pot' firmware?), that might be reasonably elegant.

Another way to avoid the hit of the division and multiplication is to loop over it:

BTW, could anyone suggest to me a more elegant way of converting a long integer (value ranging 0 to 360) into three seperate decimals (0 to 9) (hundreds [xh], tens [xt] and units [xu])? It should probably be obvious but it is getting close to 1am now.

Hi there, I don't know your language, am assuming some sort of embedded C, but if you have a MOD operator or function available then you could so an equivalent of this VB.NET code (works with either positive or negative angle, just returns absolute digit):Sub Main() Dim angle_of_rotation_X_axis As Long = -359 Dim xh As Short = GetDigit(angle_of_rotation_X_axis, 100) Dim xt As Short = GetDigit(angle_of_rotation_X_axis, 10) Dim xu As Short = GetDigit(angle_of_rotation_X_axis, 1) End Sub

OK, thanks for the replies. The language is C; code for a PIC uC using "Custom computer services" (CCS) PIC-C compiler. Yes, it for my "pretend pot" firmware of the 3-D projection unit. I've written a lot of PIC C firmware but I am far from a professional code writer. Here is the complete program. It's functional and I think relatively tidy, but those who program for a living may very well see things that could be done better.Also attached is the complete schematic of the final unit.

Here is a video of the unit in action, with a full 360 degrees of variable rotation of both X and Y axes. Once again I am using my Rössler Attractor signal generator as the source. I'm currently laying out a PCB for that one will post up the circuit details when done.

there are a few things you can do to improve the code wrt. the table-lookup, avoiding a lot of calculations and stuff. It is a tradeoff between ROM/FLASH usage for the table on one side, and codesize & execution speed on the other side. But since you are using the table a lot with lots of code calculating it, i guess the overall ROM/FLASH used will be less, plus a faster processing speed.

First, make the lookup-table 256 entries large. The native data size of the PIC is 8 bits, using that as table size allows for some really fast methods for reversing the lookup direction and inverting the value.

Then, the PIC has a 10-bit ADC. Use that! This will make things even simpler. To store the result, the PIC uses two registers, ADRESL and ADRESH. Configure the ADC to give you a right-justified result. (register ADCON1 bit ADFM set to 1). This will result in the lower 8 bits of the readout to be stored in ADRESL, and the upper 2 bits into the lower 2 bits of ADRESH.

The effect of this is that in ADRESH you get only the value 0, 1, 2 or 3 over the full range. Now, 4 values, 4 quadrants, a table with 256 entries and a ADRESL of 8 bits... I guess you can already start to see where this goes.

Now about how to access it using simple methods and the ADRESH bits of the result. The lookup table contains the first 90° of a sinewave here. If you invert the index value, you read that table backwards. That way you now have 180°. To decide wether to read forwards or backwwards, you use bit 0 of ADRESH. If it is set, you simply invert the index into the table.

if (ADRESH & 0x01){ result = sintab[~ADRESL];}else{ result = sintab[ADRESL];}

Now for the inverting of the read value of the lookup. You use bit 1 of ADRESL to do that. If it set to 1, you simply invert the value you just read from the lookup-table. Again, in code this looks like:

This is OK because only the lowest two bits are evaluated anyways. Now, if you want to have the full sine or cosine inverted, you simply add another 2 to ADRESH. Doing all the above allows you to write a single routine that does this. With a little more bit-magic the polarity bits that you use to control the actual output can also be set. You can also combine those bits into a single byte instead of spreading it over four int's. There is the nifty thing of #define, which allows you to define things with a name.

Attached is a textfile with some ad-hoc example code of all that with lots of comments. Of course not tested for bugs, just to show you the overall process. Hope that helps. If you have any questions, let me know.

What i forgot to mention. In my example i do invert the readout value _and_ set the negative-polarity bit. I just assumed that when you toggle the output pin that the DAC output is inverted after the OpAmps, that is 5V input becomes 0V and 0V input becomes -5V output when negative, while for the positive half 5V in becomes 5V out, and 0V in becomes 0V out (just as an example). If that is not the case, simple comment out the "result = ~result" line there.

Also, note that due to the way the lookuptable is read, the first and last value in it are duplicated at each start/end of a quadrant. That is, for example, the zero-crossing at 180° will become 0 at an ADC value of 511 (end of second quadrant) but also 0 at a ADC value of 512 (start of third quadrant). There are two ways to eliminate that error. One is to create the table so there is no 0° and 90°. So the sequence instead of, for example, 8-4-0 0-4-8 becomes 10-6-2 2-6-10. Another way is to limit the maximum value in the table, and then add a fixed value if you go negative. So if the sequence from the table would be 8-4-0 0-4-8 you simply add 4 if negative, and get 8-4-0 4-8-12 instead. Of course this means that the maximum value can not be 255 but must be 251 instead, to avoid an overflow when adding 4.

Personally i would prefer the first method. This ensures that the generated quadrants are symetrical. And at 8 bits for one quadrant you have a resolution of roundabout 0.35°, so the small "error" of not having complete 0° or 90° is just roundabout +/- 0.175°.

Just got a copy of the Korn Electronic and Hybrid Analogue Computers book. I like it. Dates from 1963 so right at the very end of both designing with valves and analogue computers, a few years later both were history. And all those ECC83s that were junked!

What is really nice is that the book can be read as a guide to design, there is lots of useful and interesting information. If you like the MIT Rad Lab books then you will like this. So many, most, text books are, quite frankly, boring and a chore to read, but every now and then a real gem pops up. Others are ones by Scroggie, Cathode Ray of Wireless World, Steinmetz from the early 1900s.