PDA

View Full Version : MCP4261 Digital Pot Control example - A quick little project



mtripoli
- 3rd March 2011, 21:45
I'm working on a project using the Microchip MCP4261 Digital Pots. Cute little parts...
Here's a code snippet and a schematic as example. The code is an example of reading a "real" pot via A/D and updating a "digital pot" with the value. I'm using the LAB-X2 board from meLabs for testing. The code uses the on-board POT1 for one channel (RA0) and a second off-board pot for channel two (RA1). Put a voltmeter on the wiper of the digital pot to see the values update. There are a few other features of the digital pot that can be used simply by changing the "address" value. There's code in there for writing the A/D value to a serial LCD display for testing - ignore it. Simple but maybe useful to someone...
Have fun.
MT
5250

'************************************************* *****************************
'* Name : MCP4261POT_000.bas *
'* Compiler: PICBASIC PRO Compiler microEngineering Labs *
'* Author : Mike Tripoli *
'* Notes: *
'* Read an analog voltage on RA.0 and and RA.1 *
'* copy the 8 bit value to a digital pot value register *
'* Display value on serial LCD display *
'* 8-bit conversion yields 0-255 result for 0-5 volt input. *
'* Uses meLabs LAB-X2 demo board *
'* *
'* *
'* Date : 03/03/2011 *
'************************************************* *****************************




'Setup some defaults for programming the device.
'High-speed OSC, Watch dog timer-OFF, Brown-out detect OFF, Low Voltage Program OFF, Protect code OFF
@ DEVICE HS_OSC,WDT_OFF,BOD_OFF,LVP_OFF,PROTECT_OFF

include "modedefs.bas" 'Shiftout mode definitions


' Define ADCIN parameters
Define ADC_BITS 8 ' Set number of bits in result
Define ADC_CLOCK 3 ' Set clock source (3=rc)
Define ADC_SAMPLEUS 50 ' Set sampling time in uS

ADC_VAL_0 Var byte ' Only using 8 bits of ADC Channel 0
ADC_VAL_1 Var byte ' Only using 8 bits of ADC Channel 1

POT0 var word ' WORD variable to for address (high byte) and pot value (low byte) POT0
POT1 var word ' WORD variable to for address (high byte) and pot value (low byte) POT1

LED1 Var PORTB.0 ' Alias PORTB.0 to LED1 on LAB-X2 board from meLabs
LED2 VAR PORTB.1 ' Alias PORTB.1 to LED2
LED3 VAR PORTB.2 ' Alias PORTB.2 to LED3

SCK var PORTC.3 ' Alias PORTC.3 to SCK (serial data clock)
SDO var PORTC.5 ' Alias PORTC.5 to SDO (serial data out)
CS var PORTC.2 ' Alias PORTC.2 to C_EN (chip enable)
LCD_DISP var PORTB.3 ' LCD connected to PORTB.3 - LAB-X2

TRISA = %11111111 ' Set PORTA to all input
TRISB = %00000000 ' Set PORTB to all output
TRISC = %00000000 ' Set PORTC to all output
ADCON1 = %00000010 ' Set PORTA analog

'Initialize registers and variables

LOW LED1 'Initialize LEDs OFF
LOW LED2 ' "
LOW LED3 ' "
HIGH CS 'Chip enable high to start
high sck 'Mode 1,1 SCK idles high
; Serout2 LCD_DISP,396,[12] ' Clear the LCD display


;Initialize POT WORD
pot0.Highbyte = %00000000 'POT0 address in hex - easier for me to see which pot selected
pot0.lowbyte = 0 'POT0 value in DEC - initialize pot - can be any value

pot1.Highbyte = %00010000 'POT1 address in hex
pot1.lowbyte = 0 'POT1 value in DEC


mainloop:
ADCIN 0, adc_val_0 ' Read channel RA.0 to ADC_VAL_0 - Uses onboard "POT1" on LAB - X2
pot0.lowbyte = adc_val_0 'copy input voltage from pot to digital pot
pause 10
ADCIN 1, adc_val_1 ' Read channel RA.1 to ADC_VAL_1
pot1.lowbyte = adc_val_1 'copy input voltage from pot to digital pot

;***** DELETE THIS SECTION - ONLY FOR TESTING ***************
; Serout2 PORTB.3,396,[12] 'Set to beginning of LCD display
; Serout2 PORTB.3,396,["ADC_VAL_0=",DEC3 adc_val_0,148] ' Display adc channel 0
; Serout2 PORTB.3,396,["ADC_VAL_1=",DEC3 adc_val_1,13] ' Display adc channel 1
; PAUSE 10
;************************************************* ***********
GOSUB write_pots

goto mainloop

WRITE_POTS: ; Routine writes value to pots
WR_POT_0:
low CS ' Make chip active
pause 1 ' Delay after making chip active per data sheet - only need 60nS
shiftout sdo,sck,5,[pot0\16] ' Mode 1,1 in MCP4261 DS / Mode 5 PBP - clock idles high, MSB shift out first
high CS ' MCP4261 DS recommends toggling /CS between commands
pause 1 ' Delay keeps from banging CS pin
WR_POT_1:
low CS 'Make chip active
pause 1 'Delay after making chip active
shiftout sdo,sck,5,[pot1\16]
high CS
RETURN



END 'ALL PROGRAMS NEED AN END STATEMENT!

jmgelba
- 11th April 2011, 23:56
Quick question. You reference SDO. Is this PIC side or pot side?

mtripoli
- 13th April 2011, 04:11
Quick question. You reference SDO. Is this PIC side or pot side?

The code and the schematic show SDO on the PIC side...