lunes, 26 de diciembre de 2011

SPI Potenciómetro digital MCP41010



Obtendremos varios valores de resistencia mediante el potenciómetro digital MCP41010. Este integrado estará conectado al PIC por medio del bus serie SPI. Veremos los valores de resistencia en un LCD alfanumérico 16x2.
Descargar documentos.


Características:

Potenciómetro digital MCP41010:
Es un potenciómetro de 10K ajustable integrado. Al ser de 8bits se puede ajustar en 256 posiciones controlables por nuestro micro.
El potenciómetro consta de una EEPROM interna que almacena la última posición enviada y previene de desconexiones.
Este integrado solo se conecta a los pines CS, SDO y CLK del bus SPI.
Las salidas PA0, PW0 Y PB0 no podrán sobrepasar los 5v del integrado.


Nos ayudaremos de la librería mcp41010.c del CCSC para programar el PIC. También utilizaremos nuestra librería del LCD.


Diseño del esquemático:

- El microcontrolador utilizado será el PIC18F4550, con un reloj externo de 20Mz y un pulsador con circuito R-C a modo de reset:


- Utilizaremos el potenciómetro digital MCP41010 y un indicador de resistencia. Este integrado irá conectado a los pines SCK, SDO y CS del bus SPI de nuestro micro.


- Mostraremos el valor resistivo del potenciómetro en un LCD alfanumérico 16x2, tendrá un potenciómetro para modificar el contraste y un condensador de desacoplo.


- Utilizaremos el depurador SPI para depurar el programa.



Código:

////////////////////////////////////////////////////////////////////////////////////
//   AUTOR: Daniel de Cos                                       Noviembre/2011    //
////////////////////////////////////////////////////////////////////////////////////
//   PROGRAMA:    Potenciómetro                         VERSIÓN:    1.0
//   DISPOSITIVO: PIC 18F4550                           COMPILADOR:    CCS vs4.023
//   Entorno IDE: MPLAB ID v8.56                        SIMULADOR:    Proteus 7.7 sp2
//   TARJETA DE APLICACIÓN:  interface_2011             DEBUGGER:   ICD3
////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////
// CABECERA ////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

#include <C:\H\18F4550.h>
//#FUSES INTHS    //reloj interno     
#FUSES HS     //reloj de alta velocidad
#FUSES MCLR    //Master clear pin enable
#use delay(clock=20000000)  //20MHz
//#use delay(internal=1Mhz)   // Selecciona la velocidad del oscilador interno
#include <mcp41010.c>
#include <LCD_flexible.c>

////////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

float dato;
  
////////////////////////////////////////////////////////////////////////////////////
// FUNCIONES ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////
// PRINCIPAL ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
void main()
{
     //setup_spi(spi_master | spi_l_to_h | spi_clk_div_16);   //Configuracion SPI
     lcd_init();
     lcd_putc("POT. MCP41010");
    
     //7.5K
     set_pot(192);
     lcd_gotoxy(1, 2);
     dato= (192* 10000.0)/256.0;
     printf(lcd_putc, "%f Ohm", dato);
     delay_ms(1000);
    
     //5K
     set_pot(128);
     lcd_gotoxy(1, 2);
     dato= (128* 10000.0)/256.0;
     printf(lcd_putc, "%f Ohm", dato);
     delay_ms(1000);
    
     //2.5K
     set_pot(64);
     lcd_gotoxy(1, 2);
     dato= (64* 10000.0)/256.0;
     printf(lcd_putc, "%f Ohm", dato);
     delay_ms(1000);
    
     //1.25K
     set_pot(32);
     lcd_gotoxy(1, 2);
     dato= (32* 10000.0)/256.0;
     printf(lcd_putc, "%f Ohm", dato);
     delay_ms(1000);
    
     //625R
     set_pot(16);
     lcd_gotoxy(1, 2);
     dato= (16* 10000.0)/256.0;
     printf(lcd_putc, "%f Ohm", dato);
     delay_ms(1000);
    
     //312.5R
     set_pot(8);
     lcd_gotoxy(1, 2);
     dato= (8* 10000.0)/256.0;
     printf(lcd_putc, "%f Ohm", dato);
     delay_ms(1000);
      
     while(1);
}


Simulación:

El valor resistivo que nos da en la simulación no coincide con el de la realidad. 



Comprobación programa:

3 comentarios:

  1. Gracias Daniel.
    Puedo usar el MCP41xxx sin microcontrolador pero con pulsadores up y down ? Me puedes ayudar con el esquemático ? me puedes enviar a julenrique55 de yahoo.com ?

    ResponderEliminar
  2. como puedo controlar este potenciometro desde una gui en qt4?

    ResponderEliminar
  3. para poder compilar necesito las librerias podria subir de nuevo los archivos

    ResponderEliminar