Two simple 8 bit D/A-converters

Figure out, you conceive a powerful digital sensor and you want to use it with the LEGO RCX. You must transform the digital information to an analog signal. Generally this is done through a special IC. While such a solution is the easiest for engineers, amateurs may have difficulties in finding the optimal chip, or may be limited in budget. We already presented a crude 8-bit converter based on a simple resistor-net.

Here now two other types of converters.

The LEGO-Mindstorms project in an educational context rapidly shows its power around heuristic thinking. In team-discussions about solving a problem, several approaches appear in concurrence. The team must proceed to an evaluation, which solution is the best. In the case of deciding if the team should prefer a D/A-integrated circuit to another solution, different arguments must be weighted such as efficiency, speed, costs, simplicity, space needed on the PC-board, choice of micro-controller (if ever), number of micro-controller I/O's available, and so on. For example, sometimes you need only a rather slow conversion, but you want to spare some room on the board and you want to work with one of the cheapest PICs. In this case you'll use the following device.

1. Pulsing D/A converter (Integrator)

A PIC (16F84) is driven at 4 MHz. One I/O-pin is configured to be an output. The idea is to generate a pulse at a given duty x%. This signifies that the pin is set to 1 (=5V) during x% of the period and to 0 (=0V) during (100-x)% of the period. The PIC-pin is buffered through an operation amplifier which changes the impedance. Then the signal is led to an RC-cascade. The couple R1-C1 integrates the signal. This means that the capacitor C1 is charged during x% of the time then discharged during (100-x)% of the time.

Suppose the capacitor's voltage is zero initially. As the charge rate depends on the charge time, the initial voltage and the time constant T=RC, every cycle the capacitor is not completely discharged. To be precise only (100-x)% of the charge is lost.

Example: x=50%, the voltage after one cycle is either 1.25 or 3.25 V depending on the capacitor's initial state. This is half of the charge. (The timerate in the picture does not correspond to R1C1!! It is only an illustration of what is going on)

The R2-C2 / R3-C3 cascade filters the signal.

If we choose y as a value of the interval 0 .. 255 with x = y / 256,  we'll divide one cycle into 256 segments. Thus we may transform any byte-number to a proportional voltage.

At 4MHz, the internal PIC program counter is incremented at 1 MHz. Deviding into 256 segments gives a frequency of 3.9kHz. As you can see in the following pictures, the voltage is stabilized around the duty-percentage after about 6ms. By choosing other values of R1, R2, R3, C1, C2 or C3, it is possible to have a quicker respons. You'll have to make a compromise between speed and signal-stability.

Note that the charging of a capacitor obeys to the formula:

The discharging has the formula:

Constantly driven, the capacitor is charged to 98% resp. discharged to 2%  after 4t.

Note that you should test the RC-cascade with an oscilloscope or an electronic simulator on your PC.

Conclusion:

We get a direct proportional relationship between duty-percentage and the output voltage.

Here a (not too elegant) PIC test-program for a 50% duty pulse.

 ``` LIST P=16F84 ; PORTA EQU 5 PORTB EQU 6 TRISA EQU 85H TRISB EQU 86H STATUS EQU 3 INTCON EQU 0BH OPTREG EQU 81H TMR0 EQU 1``` ```CY EQU 0 RP0 EQU 5 TOIF EQU 2 TOIE EQU 5 GIE EQU 7``` ```#DEFINE BANK0 BCF STATUS,RP0 ;SELECT BANK 0 #DEFINE BANK1 BSF STATUS,RP0 ;SELECT BANK 1``` ` ` `;********************************************************` ``` ORG 0 GOTO START``` ``` ORG 4 COMF PORTB,F ;INVERT PORTB BCF INTCON,TOIF ;CLEAR INTERRUPT FLAG RETFIE``` ```LOOP GOTO LOOP ;DO NOTHING FOREVER ``` ```START BANK1 CLRF TRISA^80H ;PORTA ALL OUTPUTS CLRF TRISB^80H ;PORTB ALL OUTPUTS MOVLW B'00000001' ;TIMER0 PRESCALE 1:2 MOVWF OPTREG^80H BANK0``` ``` CLRF PORTA CLRF PORTB BSF INTCON,TOIE ;ALLOW TIMER INTERRUPT BSF INTCON,GIE ;ALLOW ALL INTERRUPTS CLRF TMR0 BCF INTCON,TOIF ;CLEAR INTERRUPT FLAG GOTO LOOP ``` ` END`

2. Resistor-net

Trying to understand this astute resistor-net designed to transform a digital port-value to an analog signal is a very interesting didactical exercise. The trick is to combine resistors of only two different values R and 2R in such a way that the net finally gives the exact voltage-output which is proportional to the PIC output-value. The respons of this converter is very quick compared to the former example, but instead you need more than one PIC output-pin, according to the desired accuracy.

For better understanding here a three-bit example:

HINT: analyse the pictures in the order:

port_value=0, port_value=4, port_value=2, port_value=1

As you can see, the sub-systems of the nets are always parallel or serial resistors of values:

2R = R + R  or  R = 2R*2R/(2R+2R) or more complex combinations.

Main Page