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:
Thu Jun 06 07:59:33 2013 +0000
Revision:
2:50b3bd9af686
Parent:
0:284a85288653
Validate support of _42xx familly

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 2:50b3bd9af686 12 CMCP4xxxx_SPI::Mcp4xxxFamilly familly;
Yann 2:50b3bd9af686 13 bool isShutdown;
Yann 0:284a85288653 14 };
Yann 0:284a85288653 15
Yann 0:284a85288653 16 /*
Yann 0:284a85288653 17 * Declare functions
Yann 0:284a85288653 18 */
Yann 0:284a85288653 19 void AvailableIndicator(); // LED1 flashing for program while program is alive
Yann 2:50b3bd9af686 20 void DisplayMenuAndGetChoice(); // Display and get the user choice
Yann 0:284a85288653 21
Yann 0:284a85288653 22 /*
Yann 0:284a85288653 23 * Declare statics
Yann 0:284a85288653 24 */
Yann 0:284a85288653 25 DigitalOut g_availableLed(LED1); // To verify if program in running
Yann 0:284a85288653 26 Ticker g_available; // LED1 will flash with a period of 2s
Yann 0:284a85288653 27 CMCP4xxxx_SPI g_digitalPot(p5, p6, p7);
Yann 0:284a85288653 28 CMCP320x_SPI *g_adc = NULL;
Yann 0:284a85288653 29 DigitalOut g_cs3201(p9); // /CS mapped on pin 8 for MCP3201
Yann 0:284a85288653 30 DigitalOut g_cs3208(p10); // /CS mapped on pin 10 for MCP3208
Yann 0:284a85288653 31 DigitalOut g_cs42100(p8); // /CS mapped on pin 8 for MCP421pp
Yann 0:284a85288653 32 DigitalOut g_cs41050(p11); // /CS mapped on pin 11 for MCP41050
Yann 0:284a85288653 33
Yann 2:50b3bd9af686 34 DigitalOut g_cs4152(p13); // /CS mapped on pin 13 for MCP4152
Yann 2:50b3bd9af686 35 DigitalOut g_cs4251(p14); // /CS mapped on pin 14 for MCP4251
Yann 2:50b3bd9af686 36 DigitalOut g_shdn4251(p15); // /SHDN mapped on pin 15 for MCP4251
Yann 2:50b3bd9af686 37 DigitalOut g_wp4251(p16); // /WP mapped on pin 16 for MCP4251
Yann 2:50b3bd9af686 38
Yann 2:50b3bd9af686 39 DigitalOut *g_csCurrentAdc = NULL;
Yann 2:50b3bd9af686 40
Yann 2:50b3bd9af686 41 static UserChoice g_userChoice; // Used to store user choice from displayed menu
Yann 0:284a85288653 42
Yann 0:284a85288653 43 int main() {
Yann 2:50b3bd9af686 44 g_userChoice.familly = CMCP4xxxx_SPI::_41xxx; // Default value used by the constructor
Yann 2:50b3bd9af686 45 g_userChoice.isShutdown = false;
Yann 2:50b3bd9af686 46
Yann 0:284a85288653 47 // Deactivate all SPI devices
Yann 0:284a85288653 48 g_cs3201 = 1;
Yann 0:284a85288653 49 g_cs3208 = 1;
Yann 0:284a85288653 50 g_cs42100 = 1;
Yann 0:284a85288653 51 g_cs41050 = 1;
Yann 2:50b3bd9af686 52 g_cs4152= 1;
Yann 2:50b3bd9af686 53 g_cs4251 = 1;
Yann 2:50b3bd9af686 54 g_shdn4251 = 1; // Active at low level
Yann 2:50b3bd9af686 55 g_wp4251 = 1;
Yann 0:284a85288653 56
Yann 0:284a85288653 57 unsigned char potLevel = 0x80; // Initial digital potentiometer value
Yann 0:284a85288653 58
Yann 0:284a85288653 59 // Launch available indicator
Yann 0:284a85288653 60 g_available.attach(&AvailableIndicator, 2.0);
Yann 0:284a85288653 61
Yann 0:284a85288653 62 while (true) {
Yann 0:284a85288653 63 // Retrieve user choices
Yann 2:50b3bd9af686 64 DisplayMenuAndGetChoice();
Yann 0:284a85288653 65 // Set the pot. value
Yann 0:284a85288653 66 // 1. Enable de right digipot
Yann 0:284a85288653 67 switch (g_userChoice.potId) {
Yann 0:284a85288653 68 case 'a':
Yann 2:50b3bd9af686 69 g_userChoice.familly = CMCP4xxxx_SPI::_42xxx;
Yann 2:50b3bd9af686 70 g_digitalPot.SetFamilly(g_userChoice.familly);
Yann 0:284a85288653 71 g_cs42100 = 0;
Yann 0:284a85288653 72 break;
Yann 2:50b3bd9af686 73 case 'b':
Yann 2:50b3bd9af686 74 g_userChoice.familly = CMCP4xxxx_SPI::_41xxx;
Yann 2:50b3bd9af686 75 g_digitalPot.SetFamilly(g_userChoice.familly);
Yann 2:50b3bd9af686 76 g_cs41050 = 0;
Yann 2:50b3bd9af686 77 break;
Yann 2:50b3bd9af686 78 case 'c':
Yann 2:50b3bd9af686 79 g_userChoice.familly = CMCP4xxxx_SPI::_42xx;
Yann 2:50b3bd9af686 80 g_digitalPot.SetFamilly(g_userChoice.familly);
Yann 2:50b3bd9af686 81 g_digitalPot.ReadRegister(CMCP4xxxx_SPI::Status);
Yann 2:50b3bd9af686 82 g_cs4251 = 0;
Yann 2:50b3bd9af686 83 break;
Yann 0:284a85288653 84 default:
Yann 2:50b3bd9af686 85 g_userChoice.familly = CMCP4xxxx_SPI::_41xx;
Yann 2:50b3bd9af686 86 g_digitalPot.SetFamilly(g_userChoice.familly);
Yann 2:50b3bd9af686 87 g_digitalPot.ReadRegister(CMCP4xxxx_SPI::Status);
Yann 2:50b3bd9af686 88 g_cs4152 = 0;
Yann 0:284a85288653 89 break;
Yann 0:284a85288653 90 } // End of 'switch' statement
Yann 0:284a85288653 91 // 2. Apply user action
Yann 0:284a85288653 92 switch (g_userChoice.choice) {
Yann 0:284a85288653 93 case 'a':
Yann 0:284a85288653 94 potLevel += 1;
Yann 2:50b3bd9af686 95 g_digitalPot.Write(CMCP4xxxx_SPI::WriteToDigiPot1, potLevel);
Yann 0:284a85288653 96 break;
Yann 0:284a85288653 97 case 'b':
Yann 0:284a85288653 98 potLevel -= 1;
Yann 2:50b3bd9af686 99 g_digitalPot.Write(CMCP4xxxx_SPI::WriteToDigiPot1, potLevel);
Yann 0:284a85288653 100 break;
Yann 0:284a85288653 101 case 'c':
Yann 2:50b3bd9af686 102 g_userChoice.isShutdown = !g_userChoice.isShutdown;
Yann 2:50b3bd9af686 103 g_digitalPot.Shutdown(CMCP4xxxx_SPI::ShutdownDigiPot1, g_userChoice.isShutdown);
Yann 0:284a85288653 104 break;
Yann 0:284a85288653 105 case 'd':
Yann 0:284a85288653 106 potLevel = 0x80;
Yann 0:284a85288653 107 break;
Yann 2:50b3bd9af686 108 default:
Yann 0:284a85288653 109 std::cout << "Invalid user choice\r" << std::endl;
Yann 0:284a85288653 110 break;
Yann 0:284a85288653 111 } // End of 'switch' statement
Yann 0:284a85288653 112 // 3. Disable de right digipot
Yann 0:284a85288653 113 switch (g_userChoice.potId) {
Yann 0:284a85288653 114 case 'a':
Yann 0:284a85288653 115 g_cs42100 = 1;
Yann 0:284a85288653 116 break;
Yann 2:50b3bd9af686 117 case 'b':
Yann 2:50b3bd9af686 118 g_cs41050 = 1;
Yann 2:50b3bd9af686 119 break;
Yann 2:50b3bd9af686 120 case 'c':
Yann 2:50b3bd9af686 121 g_cs4251 = 1;
Yann 2:50b3bd9af686 122 break;
Yann 0:284a85288653 123 default:
Yann 2:50b3bd9af686 124 g_cs4152 = 1;
Yann 0:284a85288653 125 break;
Yann 0:284a85288653 126 } // End of 'switch' statement
Yann 0:284a85288653 127
Yann 0:284a85288653 128 // Set adc to use
Yann 0:284a85288653 129 switch (g_userChoice.adcId) {
Yann 0:284a85288653 130 case 'a': // MCP3201
Yann 0:284a85288653 131 g_adc = new CMCP320x_SPI(p5, p6, p7);
Yann 0:284a85288653 132 g_csCurrentAdc = &g_cs3201;
Yann 0:284a85288653 133 break;
Yann 0:284a85288653 134 case 'b': // MCP3208
Yann 0:284a85288653 135 g_adc = new CMCP320x_SPI(p5, p6, p7, NC, CMCP320x_SPI::_3208);
Yann 0:284a85288653 136 g_csCurrentAdc = &g_cs3208;
Yann 0:284a85288653 137 break;
Yann 0:284a85288653 138 } // End of 'switch' statement
Yann 0:284a85288653 139 g_csCurrentAdc->write(0);
Yann 2:50b3bd9af686 140 float sample = g_adc->Read(CMCP320x_SPI::CH2);
Yann 2:50b3bd9af686 141 g_csCurrentAdc->write(1);
Yann 2:50b3bd9af686 142 std::cout << "Voltage at PW0/41050: " << setprecision(5) << sample << "\r" << std::endl;
Yann 2:50b3bd9af686 143
Yann 2:50b3bd9af686 144 g_csCurrentAdc->write(0);
Yann 2:50b3bd9af686 145 sample = g_adc->Read(CMCP320x_SPI::CH3);
Yann 0:284a85288653 146 g_csCurrentAdc->write(1);
Yann 2:50b3bd9af686 147 std::cout << "Voltage at PW0/4152: " << setprecision(5) << sample << "\r" << std::endl;
Yann 2:50b3bd9af686 148
Yann 2:50b3bd9af686 149 g_csCurrentAdc->write(0);
Yann 2:50b3bd9af686 150 sample = g_adc->Read(CMCP320x_SPI::CH4);
Yann 2:50b3bd9af686 151 g_csCurrentAdc->write(1);
Yann 2:50b3bd9af686 152 std::cout << "Voltage at PW0/4251#1: " << setprecision(5) << sample << "\r" << std::endl;
Yann 2:50b3bd9af686 153
Yann 2:50b3bd9af686 154 g_csCurrentAdc->write(0);
Yann 2:50b3bd9af686 155 sample = g_adc->Read(CMCP320x_SPI::CH5);
Yann 2:50b3bd9af686 156 g_csCurrentAdc->write(1);
Yann 2:50b3bd9af686 157 std::cout << "Voltage at PW0/4251#2: " << setprecision(5) << sample << "\r" << std::endl;
Yann 2:50b3bd9af686 158 // Remove instance
Yann 0:284a85288653 159 delete g_adc;
Yann 0:284a85288653 160 g_csCurrentAdc = NULL;
Yann 0:284a85288653 161 } // End of 'while' statement
Yann 0:284a85288653 162 } // End of program - nerver reached
Yann 0:284a85288653 163
Yann 0:284a85288653 164 void AvailableIndicator() {
Yann 0:284a85288653 165 g_availableLed = !g_availableLed;
Yann 0:284a85288653 166 } // End of AvailableIndicator
Yann 0:284a85288653 167
Yann 2:50b3bd9af686 168 void DisplayMenuAndGetChoice() {
Yann 0:284a85288653 169 // Display the title
Yann 2:50b3bd9af686 170 std::cout << "\r" << std::endl << "MCP320x_SPI v0.3\r" << std::endl;
Yann 0:284a85288653 171
Yann 0:284a85288653 172 // Display the pot selection menu
Yann 2:50b3bd9af686 173 std::cout << "\tUse pot 42100:\t\t\ta\r" << std::endl;
Yann 2:50b3bd9af686 174 std::cout << "\tUse pot 41050:\t\t\tb\r" << std::endl;
Yann 2:50b3bd9af686 175 std::cout << "\tUse pot 4251:\t\t\tc\r" << std::endl;
Yann 0:284a85288653 176 std::cout << "Enter your choice: " << std::flush;
Yann 2:50b3bd9af686 177 g_userChoice.potId = getchar();
Yann 0:284a85288653 178 std::cout << "\r" << std::endl << std::flush;
Yann 0:284a85288653 179
Yann 0:284a85288653 180 // Display the adc selection menu
Yann 0:284a85288653 181 std::cout << "\tUse adc 3201:\t\t\ta\r" << std::endl;
Yann 0:284a85288653 182 std::cout << "\tUse adc 3208:\t\t\tb\r" << std::endl;
Yann 0:284a85288653 183 std::cout << "Enter your choice: " << std::flush;
Yann 2:50b3bd9af686 184 g_userChoice.adcId = getchar();
Yann 0:284a85288653 185 std::cout << "\r" << std::endl << std::flush;
Yann 0:284a85288653 186
Yann 0:284a85288653 187 // Display the menu
Yann 0:284a85288653 188 std::cout << "\tIncrease level of pot:\t\t\ta\r" << std::endl;
Yann 0:284a85288653 189 std::cout << "\tDecrease level of pot:\t\t\tb\r" << std::endl;
Yann 0:284a85288653 190 std::cout << "\tShutdown pot :\t\t\tc\r" << std::endl;
Yann 0:284a85288653 191 std::cout << "\tReset pot :\t\t\td\r" << std::endl;
Yann 0:284a85288653 192 std::cout << "Enter your choice: " << std::flush;
Yann 2:50b3bd9af686 193 g_userChoice.choice = getchar();
Yann 0:284a85288653 194 std::cout << "\r" << std::endl << std::flush;
Yann 0:284a85288653 195 }