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@0:284a85288653, 2013-04-05 (annotated)
- 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?
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 | 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 | } |