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
- Committer:
- Yann
- Date:
- 2013-04-05
- Revision:
- 0:284a85288653
- Child:
- 2:50b3bd9af686
File content as of revision 0:284a85288653:
#include <string>
#include <iostream>
#include <iomanip>
#include "MCP4xxxx_SPI.h" // Use SPI module #1 and /CS mapped on pin 8
#include "MCP320x_SPI.h" // Use SPI module #1 and /CS mapped on pin 9
struct UserChoice {
char choice;
unsigned char potId;
unsigned char adcId;
};
/*
* Declare functions
*/
void AvailableIndicator(); // LED1 flashing for program while program is alive
UserChoice DisplayMenuAndGetChoice(); // Display and get the user choice
/*
* Declare statics
*/
DigitalOut g_availableLed(LED1); // To verify if program in running
Ticker g_available; // LED1 will flash with a period of 2s
CMCP4xxxx_SPI g_digitalPot(p5, p6, p7);
CMCP320x_SPI *g_adc = NULL;
DigitalOut g_cs3201(p9); // /CS mapped on pin 8 for MCP3201
DigitalOut g_cs3208(p10); // /CS mapped on pin 10 for MCP3208
DigitalOut g_cs42100(p8); // /CS mapped on pin 8 for MCP421pp
DigitalOut g_cs41050(p11); // /CS mapped on pin 11 for MCP41050
DigitalOut *g_csCurrentAdc = NULL;
UserChoice g_userChoice; // Used to store user choice from displayed menu
int main() {
// Deactivate all SPI devices
g_cs3201 = 1;
g_cs3208 = 1;
g_cs42100 = 1;
g_cs41050 = 1;
unsigned char potLevel = 0x80; // Initial digital potentiometer value
// Launch available indicator
g_available.attach(&AvailableIndicator, 2.0);
while (true) {
// Retrieve user choices
g_userChoice = DisplayMenuAndGetChoice();
// Set the pot. value
// 1. Enable de right digipot
switch (g_userChoice.potId) {
case 'a':
g_cs42100 = 0;
break;
default:
g_cs41050 = 0;
break;
} // End of 'switch' statement
// 2. Apply user action
switch (g_userChoice.choice) {
case 'a':
potLevel += 1;
g_digitalPot.Write(CMCP4xxxx_SPI::WriteToPot1, potLevel);
break;
case 'b':
potLevel -= 1;
g_digitalPot.Write(CMCP4xxxx_SPI::WriteToPot1, potLevel);
break;
case 'c':
potLevel -= 1;
g_digitalPot.Write(CMCP4xxxx_SPI::ShutdownPot1);
break;
case 'd':
//g_digitalPot->Reset();
potLevel = 0x80;
break;
default:
std::cout << "Invalid user choice\r" << std::endl;
break;
} // End of 'switch' statement
// 3. Disable de right digipot
switch (g_userChoice.potId) {
case 'a':
g_cs42100 = 1;
break;
default:
g_cs41050 = 1;
break;
} // End of 'switch' statement
// Set adc to use
switch (g_userChoice.adcId) {
case 'a': // MCP3201
g_adc = new CMCP320x_SPI(p5, p6, p7);
g_csCurrentAdc = &g_cs3201;
break;
case 'b': // MCP3208
g_adc = new CMCP320x_SPI(p5, p6, p7, NC, CMCP320x_SPI::_3208);
g_csCurrentAdc = &g_cs3208;
break;
} // End of 'switch' statement
g_csCurrentAdc->write(0);
float sample = g_adc->Read(CMCP320x_SPI::CH3);
g_csCurrentAdc->write(1);
std::cout << "Voltage at PW0: " << setprecision(5) << sample << "\r" << std::endl;
delete g_adc;
g_csCurrentAdc = NULL;
} // End of 'while' statement
} // End of program - nerver reached
void AvailableIndicator() {
g_availableLed = !g_availableLed;
} // End of AvailableIndicator
UserChoice DisplayMenuAndGetChoice() {
static UserChoice userChoice;
// Display the title
std::cout << "\r" << std::endl << "MCP320x_SPI v0.2\r" << std::endl;
// Display the pot selection menu
std::cout << "\tUse pot #1:\t\t\ta\r" << std::endl;
std::cout << "\tUse pot #2:\t\t\tb\r" << std::endl;
std::cout << "Enter your choice: " << std::flush;
userChoice.potId = getchar();
std::cout << "\r" << std::endl << std::flush;
// Display the adc selection menu
std::cout << "\tUse adc 3201:\t\t\ta\r" << std::endl;
std::cout << "\tUse adc 3208:\t\t\tb\r" << std::endl;
std::cout << "Enter your choice: " << std::flush;
userChoice.adcId = getchar();
std::cout << "\r" << std::endl << std::flush;
// Display the menu
std::cout << "\tIncrease level of pot:\t\t\ta\r" << std::endl;
std::cout << "\tDecrease level of pot:\t\t\tb\r" << std::endl;
std::cout << "\tShutdown pot :\t\t\tc\r" << std::endl;
std::cout << "\tReset pot :\t\t\td\r" << std::endl;
std::cout << "Enter your choice: " << std::flush;
userChoice.choice = getchar();
std::cout << "\r" << std::endl << std::flush;
return userChoice;
}
Yann Garcia