Test application for simplified access to the Microchip 1/4/8-Channels 12-Bit A/D Converters with SPI Serial Interface library

Dependencies:   DebugLibrary MCP320x_SPI MCP4xxxx_SPI mbed

Here is the schematic used to validate both libraries MCP320x_SPI and MCP4xxx_SPI.

/media/uploads/Yann/mbed.jpg

Committer:
Yann
Date:
Fri Apr 05 13:36:35 2013 +0000
Revision:
0:284a85288653
Child:
2:50b3bd9af686
Add support of MCP3204/8

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Yann 0:284a85288653 1 #include <string>
Yann 0:284a85288653 2 #include <iostream>
Yann 0:284a85288653 3 #include <iomanip>
Yann 0:284a85288653 4
Yann 0:284a85288653 5 #include "MCP4xxxx_SPI.h" // Use SPI module #1 and /CS mapped on pin 8
Yann 0:284a85288653 6 #include "MCP320x_SPI.h" // Use SPI module #1 and /CS mapped on pin 9
Yann 0:284a85288653 7
Yann 0:284a85288653 8 struct UserChoice {
Yann 0:284a85288653 9 char choice;
Yann 0:284a85288653 10 unsigned char potId;
Yann 0:284a85288653 11 unsigned char adcId;
Yann 0:284a85288653 12 };
Yann 0:284a85288653 13
Yann 0:284a85288653 14 /*
Yann 0:284a85288653 15 * Declare functions
Yann 0:284a85288653 16 */
Yann 0:284a85288653 17 void AvailableIndicator(); // LED1 flashing for program while program is alive
Yann 0:284a85288653 18 UserChoice DisplayMenuAndGetChoice(); // Display and get the user choice
Yann 0:284a85288653 19
Yann 0:284a85288653 20 /*
Yann 0:284a85288653 21 * Declare statics
Yann 0:284a85288653 22 */
Yann 0:284a85288653 23 DigitalOut g_availableLed(LED1); // To verify if program in running
Yann 0:284a85288653 24 Ticker g_available; // LED1 will flash with a period of 2s
Yann 0:284a85288653 25 CMCP4xxxx_SPI g_digitalPot(p5, p6, p7);
Yann 0:284a85288653 26 CMCP320x_SPI *g_adc = NULL;
Yann 0:284a85288653 27 DigitalOut g_cs3201(p9); // /CS mapped on pin 8 for MCP3201
Yann 0:284a85288653 28 DigitalOut g_cs3208(p10); // /CS mapped on pin 10 for MCP3208
Yann 0:284a85288653 29 DigitalOut g_cs42100(p8); // /CS mapped on pin 8 for MCP421pp
Yann 0:284a85288653 30 DigitalOut g_cs41050(p11); // /CS mapped on pin 11 for MCP41050
Yann 0:284a85288653 31 DigitalOut *g_csCurrentAdc = NULL;
Yann 0:284a85288653 32
Yann 0:284a85288653 33 UserChoice g_userChoice; // Used to store user choice from displayed menu
Yann 0:284a85288653 34
Yann 0:284a85288653 35 int main() {
Yann 0:284a85288653 36 // Deactivate all SPI devices
Yann 0:284a85288653 37 g_cs3201 = 1;
Yann 0:284a85288653 38 g_cs3208 = 1;
Yann 0:284a85288653 39 g_cs42100 = 1;
Yann 0:284a85288653 40 g_cs41050 = 1;
Yann 0:284a85288653 41
Yann 0:284a85288653 42 unsigned char potLevel = 0x80; // Initial digital potentiometer value
Yann 0:284a85288653 43
Yann 0:284a85288653 44 // Launch available indicator
Yann 0:284a85288653 45 g_available.attach(&AvailableIndicator, 2.0);
Yann 0:284a85288653 46
Yann 0:284a85288653 47 while (true) {
Yann 0:284a85288653 48 // Retrieve user choices
Yann 0:284a85288653 49 g_userChoice = DisplayMenuAndGetChoice();
Yann 0:284a85288653 50 // Set the pot. value
Yann 0:284a85288653 51 // 1. Enable de right digipot
Yann 0:284a85288653 52 switch (g_userChoice.potId) {
Yann 0:284a85288653 53 case 'a':
Yann 0:284a85288653 54 g_cs42100 = 0;
Yann 0:284a85288653 55 break;
Yann 0:284a85288653 56 default:
Yann 0:284a85288653 57 g_cs41050 = 0;
Yann 0:284a85288653 58 break;
Yann 0:284a85288653 59 } // End of 'switch' statement
Yann 0:284a85288653 60 // 2. Apply user action
Yann 0:284a85288653 61 switch (g_userChoice.choice) {
Yann 0:284a85288653 62 case 'a':
Yann 0:284a85288653 63 potLevel += 1;
Yann 0:284a85288653 64 g_digitalPot.Write(CMCP4xxxx_SPI::WriteToPot1, potLevel);
Yann 0:284a85288653 65 break;
Yann 0:284a85288653 66 case 'b':
Yann 0:284a85288653 67 potLevel -= 1;
Yann 0:284a85288653 68 g_digitalPot.Write(CMCP4xxxx_SPI::WriteToPot1, potLevel);
Yann 0:284a85288653 69 break;
Yann 0:284a85288653 70 case 'c':
Yann 0:284a85288653 71 potLevel -= 1;
Yann 0:284a85288653 72 g_digitalPot.Write(CMCP4xxxx_SPI::ShutdownPot1);
Yann 0:284a85288653 73 break;
Yann 0:284a85288653 74 case 'd':
Yann 0:284a85288653 75 //g_digitalPot->Reset();
Yann 0:284a85288653 76 potLevel = 0x80;
Yann 0:284a85288653 77 break;
Yann 0:284a85288653 78 default:
Yann 0:284a85288653 79 std::cout << "Invalid user choice\r" << std::endl;
Yann 0:284a85288653 80 break;
Yann 0:284a85288653 81 } // End of 'switch' statement
Yann 0:284a85288653 82 // 3. Disable de right digipot
Yann 0:284a85288653 83 switch (g_userChoice.potId) {
Yann 0:284a85288653 84 case 'a':
Yann 0:284a85288653 85 g_cs42100 = 1;
Yann 0:284a85288653 86 break;
Yann 0:284a85288653 87 default:
Yann 0:284a85288653 88 g_cs41050 = 1;
Yann 0:284a85288653 89 break;
Yann 0:284a85288653 90 } // End of 'switch' statement
Yann 0:284a85288653 91
Yann 0:284a85288653 92 // Set adc to use
Yann 0:284a85288653 93 switch (g_userChoice.adcId) {
Yann 0:284a85288653 94 case 'a': // MCP3201
Yann 0:284a85288653 95 g_adc = new CMCP320x_SPI(p5, p6, p7);
Yann 0:284a85288653 96 g_csCurrentAdc = &g_cs3201;
Yann 0:284a85288653 97 break;
Yann 0:284a85288653 98 case 'b': // MCP3208
Yann 0:284a85288653 99 g_adc = new CMCP320x_SPI(p5, p6, p7, NC, CMCP320x_SPI::_3208);
Yann 0:284a85288653 100 g_csCurrentAdc = &g_cs3208;
Yann 0:284a85288653 101 break;
Yann 0:284a85288653 102 } // End of 'switch' statement
Yann 0:284a85288653 103 g_csCurrentAdc->write(0);
Yann 0:284a85288653 104 float sample = g_adc->Read(CMCP320x_SPI::CH3);
Yann 0:284a85288653 105 g_csCurrentAdc->write(1);
Yann 0:284a85288653 106 std::cout << "Voltage at PW0: " << setprecision(5) << sample << "\r" << std::endl;
Yann 0:284a85288653 107 delete g_adc;
Yann 0:284a85288653 108 g_csCurrentAdc = NULL;
Yann 0:284a85288653 109 } // End of 'while' statement
Yann 0:284a85288653 110 } // End of program - nerver reached
Yann 0:284a85288653 111
Yann 0:284a85288653 112 void AvailableIndicator() {
Yann 0:284a85288653 113 g_availableLed = !g_availableLed;
Yann 0:284a85288653 114 } // End of AvailableIndicator
Yann 0:284a85288653 115
Yann 0:284a85288653 116 UserChoice DisplayMenuAndGetChoice() {
Yann 0:284a85288653 117 static UserChoice userChoice;
Yann 0:284a85288653 118
Yann 0:284a85288653 119 // Display the title
Yann 0:284a85288653 120 std::cout << "\r" << std::endl << "MCP320x_SPI v0.2\r" << std::endl;
Yann 0:284a85288653 121
Yann 0:284a85288653 122 // Display the pot selection menu
Yann 0:284a85288653 123 std::cout << "\tUse pot #1:\t\t\ta\r" << std::endl;
Yann 0:284a85288653 124 std::cout << "\tUse pot #2:\t\t\tb\r" << std::endl;
Yann 0:284a85288653 125 std::cout << "Enter your choice: " << std::flush;
Yann 0:284a85288653 126 userChoice.potId = getchar();
Yann 0:284a85288653 127 std::cout << "\r" << std::endl << std::flush;
Yann 0:284a85288653 128
Yann 0:284a85288653 129 // Display the adc selection menu
Yann 0:284a85288653 130 std::cout << "\tUse adc 3201:\t\t\ta\r" << std::endl;
Yann 0:284a85288653 131 std::cout << "\tUse adc 3208:\t\t\tb\r" << std::endl;
Yann 0:284a85288653 132 std::cout << "Enter your choice: " << std::flush;
Yann 0:284a85288653 133 userChoice.adcId = getchar();
Yann 0:284a85288653 134 std::cout << "\r" << std::endl << std::flush;
Yann 0:284a85288653 135
Yann 0:284a85288653 136 // Display the menu
Yann 0:284a85288653 137 std::cout << "\tIncrease level of pot:\t\t\ta\r" << std::endl;
Yann 0:284a85288653 138 std::cout << "\tDecrease level of pot:\t\t\tb\r" << std::endl;
Yann 0:284a85288653 139 std::cout << "\tShutdown pot :\t\t\tc\r" << std::endl;
Yann 0:284a85288653 140 std::cout << "\tReset pot :\t\t\td\r" << std::endl;
Yann 0:284a85288653 141 std::cout << "Enter your choice: " << std::flush;
Yann 0:284a85288653 142 userChoice.choice = getchar();
Yann 0:284a85288653 143 std::cout << "\r" << std::endl << std::flush;
Yann 0:284a85288653 144 return userChoice;
Yann 0:284a85288653 145 }