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.
main.cpp@2:50b3bd9af686, 2013-06-06 (annotated)
- 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?
User | Revision | Line number | New 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 | } |