Hi, not sure if this is the right forum but I'm dealing with signal generation which is almost audio generation.
I'm trying to make a signal generator. I have a digital set of values that I need converted to analog. Everytime I press a button I want it to spit out just that one set of values rather than continously running through the values over and over. I just want one wavelength so to say.
What I've done so far: I am using an Arduino Mega, an Adafruit MCP2745 DAC breakout board, and a Hantek Oscilloscope to verify my signal.
What I've tried so far: I've tried two methods. One being that whenever I push the button I unblock the code. This works except it can send out multiple signals at once which I do not want. Two: I calculated the time in between button presses and tried to force a delay by however long that time was. That did not work.
What I think I should do but don't know how: I think I should set up a timer interrupt that runs at the frequency of the output signal I want times the number of samples and then increment a counter in the interrupt handler. Although I think I2C has its own internal timer separate from that of the Arduino timers so I'm also not sure how to access that timer
I must admit though that my google-fu skills are lacking and I'm not sure where to find documentation on that. If someone could perhaps link documentation and maybe sample code on how to do that it'd be much appreciated
Heres my code:
#include <Wire.h>
#include <Adafruit_MCP4725.h>
Adafruit_MCP4725 dac;
#define DAC_RESOLUTION (9)
const int buttonPin = 2; // the number of the pushbutton pin
int button = 0;
int timerCheck = 0;
int timerRunning=0;
unsigned long startTime;
unsigned long endTime;
unsigned long duration;
const PROGMEM uint16_t DACLookup_FullSine_9Bit[512] =
{
939, 945, 946, 947, 951, 956,
962, 967, 973, 978, 983, 989, 994, 1000, 1005, 1015,
1024, 1034, 1043, 1053, 1062, 1075, 1087, 1100, 1112, 1121,
1126, 1131, 1136, 1141, 1146, 1151, 1156, 1164, 1172, 1179,
1187, 1194, 1202, 1209, 1216, 1222, 1229, 1235, 1241, 1248,
1254, 1260, 1264, 1268, 1271, 1275, 1279, 1283, 1287, 1286,
1284, 1281, 1279, 1276, 1274, 1271, 1268, 1266, 1263, 1261,
1258, 1256, 1253, 1251, 1246, 1242, 1237, 1232, 1227, 1222,
1218, 1215, 1211, 1207, 1203, 1199, 1195, 1191, 1184, 1178,
1171, 1165, 1159, 1152, 1146, 1141, 1136, 1130, 1125, 1120,
1115, 1110, 1103, 1096, 1088, 1080, 1073, 1065, 1057, 1049,
1040, 1030, 1021, 1012, 1004, 995, 987, 982, 978, 974,
970, 966, 963, 959, 955, 952, 949, 945, 942, 939,
938, 939, 940, 941, 943, 944, 945, 946, 946, 946,
946, 946, 946, 946, 946, 947, 950, 952, 954, 956,
958, 960, 962, 964, 965, 965, 965, 965, 965, 965,
963, 960, 957, 954, 951, 947, 944, 941, 938, 932,
926, 920, 913, 907, 901, 894, 885, 865, 820, 733,
606, 555, 507, 632, 697, 752, 807, 896, 977, 1023,
1069, 1127, 1237, 1347, 1457, 2085, 2246, 2474, 2549, 2595,
2641, 2695, 3083, 3135, 3187, 3217, 3315, 3403, 3492, 3581,
3804, 3847, 3890, 3798, 3443, 3453, 3297, 3053, 2819, 2810,
2225, 2258, 1892, 1734, 1625, 998, 903, 355, 376, 203,
30, 33, 61, 90, 119, 160, 238, 275, 292, 309,
325, 343, 371, 399, 429, 484, 542, 602, 652, 703,
758, 802, 838, 856, 875, 895, 917, 938, 967, 1016,
1035, 1041, 1047, 1054, 1060, 1066, 1066, 1064, 1061, 1058,
1056, 1053, 1051, 1048, 1046, 1043, 1041, 1038, 1035, 1033,
1030, 1028, 1025, 1022, 1019, 1017, 1014, 1011, 1008, 1006,
1003, 1001, 999, 998, 996, 994, 993, 991, 990, 988,
986, 985, 983, 981, 978, 976, 973, 971, 968, 966,
963, 963, 963, 963, 963, 963, 963, 963, 963, 963,
963, 963, 963, 963, 963, 963, 963, 963, 963, 963,
964, 965, 966, 967, 968, 969, 970, 971, 972, 974,
976, 978, 980, 989, 991, 993, 995,
997, 999, 1002, 1006, 1011, 1015, 1019, 1023, 1028, 1032,
1036, 1040, 1045, 1050, 1055, 1059, 1064, 1069, 1076, 1082,
1088, 1095, 1101, 1107, 1114, 1120, 1126, 1132, 1141, 1149,
1158, 1166, 1173, 1178, 1183, 1188, 1193, 1198, 1203, 1208,
1214, 1221, 1246, 1250, 1254, 1259, 1263,
1269, 1278, 1286, 1294, 1303, 1309, 1315, 1322, 1328, 1334,
1341, 1343, 1353, 1355, 1357, 1359,
1359, 1359, 1359, 1359, 1358, 1356, 1354, 1352, 1350, 1347,
1345, 1343, 1341, 1327, 1324,
1322, 1320, 1317, 1315, 1312, 1307, 1301, 1294, 1288, 1281,
1275, 1270, 1265, 1260, 1256, 1251, 1246, 1240, 1233, 1227,
1221, 1214, 1208, 1201, 1194, 1186, 1178, 1170, 1162, 1154,
1148, 1144, 1140, 1136, 1131, 1127, 1123, 1118, 1114, 1107,
1099, 1090, 1082, 1074, 1069, 1064, 1058, 1053, 1048, 1043,
1038, 1034, 1029, 1025, 1021, 1017, 1013, 1009, 1005, 1001,
997, 994, 990, 991, 992, 994, 996, 997, 999, 998,
997, 996, 995, 994, 993, 991, 990, 989, 989, 989,
989, 988, 986, 984, 983, 981, 980, 1002,
1005, 1008, 1012
};
void setup(void) {
Serial.begin(9600);
dac.begin(0x62);
pinMode(buttonPin, INPUT);
Serial.println("Generating a pulse");
}
void loop(void) {
if(timerCheck==0){
if (timerRunning == 0 && digitalRead(button) == LOW){ // button pressed & timer not running already
startTime = millis();
timerRunning = 1;
}
else
if (timerRunning == 1 && digitalRead(button) == HIGH){ // timer running, button released
endTime = millis();
timerRunning = 0;
duration = endTime - startTime;
Serial.print ("button press time in milliseconds: ");
Serial.println (duration);
timerCheck=1;
}
}
uint16_t i;
#if DAC_RESOLUTION == 9
for (i = 0; i < 512; i++)
{
dac.setVoltage(pgm_read_word(&(DACLookup_FullSine_9Bit[i])), false);
}
#else // Use 8-bit data if nothing else is specified
for (i = 0; i < 256; i++)
{
dac.setVoltage(pgm_read_word(&(DACLookup_FullSine_8Bit[i])), false);
}
#endif
delay (duration);
}