From 01d85538bb52bbe6416efd54097e2720ad557144 Mon Sep 17 00:00:00 2001 From: Cynopolis Date: Sun, 10 Oct 2021 11:39:32 -0500 Subject: [PATCH] Initial commit --- .gitattributes | 2 + .gitignore | 5 + .vscode/extensions.json | 7 + LiquidCrystal_I2C-master.zip | Bin 0 -> 20720 bytes Sample_Waveform.awv | 600 +++++++++++++++++++++++++++++++++++ Sample_Waveform2.awv | 600 +++++++++++++++++++++++++++++++++++ Waveform Converter.xlsx | Bin 0 -> 34145 bytes include/README | 39 +++ lib/README | 46 +++ platformio.ini | 18 ++ sinewave_waveform.awv | 600 +++++++++++++++++++++++++++++++++++ squarewave_waveform.awv | 600 +++++++++++++++++++++++++++++++++++ src/main.cpp | 163 ++++++++++ test/README | 11 + 14 files changed, 2691 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 LiquidCrystal_I2C-master.zip create mode 100644 Sample_Waveform.awv create mode 100644 Sample_Waveform2.awv create mode 100644 Waveform Converter.xlsx create mode 100644 include/README create mode 100644 lib/README create mode 100644 platformio.ini create mode 100644 sinewave_waveform.awv create mode 100644 squarewave_waveform.awv create mode 100644 src/main.cpp create mode 100644 test/README diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..89cc49c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..e80666b --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ] +} diff --git a/LiquidCrystal_I2C-master.zip b/LiquidCrystal_I2C-master.zip new file mode 100644 index 0000000000000000000000000000000000000000..81ae275f3131d933fc53bd787445df15c5109eb8 GIT binary patch literal 20720 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°0pgA;qJ=KRpy9Lm;+)-PN-T$JCw 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 THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/platformio.ini b/platformio.ini new file mode 100644 index 0000000..f0aadad --- /dev/null +++ b/platformio.ini @@ -0,0 +1,18 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:due] +platform = atmelsam +board = due +framework = arduino +monitor_speed = 115200 +lib_deps = + paulstoffregen/Encoder@^1.4.1 + C:\Users\Quinn\.platformio\lib\LiquidCrystal_I2C diff --git a/sinewave_waveform.awv b/sinewave_waveform.awv new file mode 100644 index 0000000..ef32bac --- /dev/null +++ b/sinewave_waveform.awv @@ -0,0 +1,600 @@ +2188 2083 +-1 2075 +-1 2067 +-1 2059 +-1 2071 +-1 2086 +-1 2100 +-1 2115 +-1 2129 +-1 2135 +-1 2141 +-1 2147 +-1 2153 +-1 2176 +-1 2176 +-1 2176 +-1 2176 +-1 2188 +-1 2201 +-1 2215 +-1 2228 +-1 2242 +-1 2255 +-1 2269 +-1 2282 +-1 2294 +-1 2305 +2317 2340 +-1 2352 +-1 2363 +-1 2376 +-1 2389 +-1 2401 +-1 2414 +-1 2427 +-1 2440 +-1 2453 +-1 2466 +-1 2478 +-1 2491 +-1 2504 +-1 2522 +-1 2539 +-1 2557 +-1 2574 +-1 2586 +-1 2597 +-1 2609 +-1 2621 +-1 2633 +-1 2644 +-1 2656 +-1 2668 +-1 2679 +-1 2691 +-1 2703 +-1 2714 +-1 2726 +-1 2738 +-1 2749 +-1 2761 +-1 2777 +-1 2792 +-1 2808 +-1 2820 +-1 2831 +-1 2843 +-1 2855 +-1 2867 +-1 2878 +-1 2890 +-1 2902 +2937 2960 +-1 2972 +-1 2984 +-1 2996 +-1 3007 +-1 3019 +-1 3030 +-1 3042 +-1 3053 +-1 3065 +-1 3078 +-1 3092 +-1 3105 +-1 3118 +-1 3131 +-1 3145 +-1 3158 +-1 3171 +-1 3181 +-1 3192 +-1 3202 +-1 3212 +-1 3223 +-1 3233 +-1 3243 +-1 3254 +-1 3264 +3276 3288 +-1 3294 +-1 3299 +-1 3314 +-1 3329 +-1 3343 +-1 3358 +-1 3364 +-1 3370 +-1 3393 +-1 3405 +-1 3417 +-1 3428 +-1 3440 +-1 3440 +-1 3452 +-1 3463 +-1 3463 +-1 3463 +-1 3463 +-1 3472 +-1 3481 +-1 3489 +-1 3498 +-1 3498 +-1 3498 +-1 3498 +-1 3498 +-1 3498 +-1 3510 +-1 3522 +-1 3522 +-1 3522 +-1 3522 +-1 3522 +-1 3522 +-1 3522 +-1 3522 +-1 3522 +-1 3522 +-1 3522 +-1 3522 +-1 3522 +-1 3522 +-1 3522 +-1 3522 +-1 3522 +-1 3522 +-1 3522 +-1 3522 +-1 3516 +-1 3510 +-1 3510 +3510 3498 +-1 3493 +-1 3487 +-1 3475 +-1 3471 +-1 3467 +-1 3463 +-1 3451 +-1 3440 +-1 3428 +-1 3416 +-1 3408 +-1 3401 +3393 3358 +-1 3346 +-1 3323 +3311 3288 +-1 3276 +-1 3253 +-1 3229 +-1 3218 +-1 3195 +-1 3171 +-1 3148 +-1 3124 +-1 3083 +-1 3042 +-1 3025 +-1 3007 +-1 2978 +-1 2948 +-1 2931 +-1 2913 +-1 2872 +-1 2831 +2785 2750 +2703 2668 +-1 2645 +-1 2621 +-1 2586 +-1 2551 +-1 2480 +-1 2445 +2410 2328 +-1 2270 +-1 2247 +-1 2223 +-1 2184 +-1 2145 +2106 1989 +-1 1954 +-1 1931 +1919 1872 +-1 1866 +-1 1860 +-1 1849 +-1 1837 +-1 1802 +-1 1785 +-1 1767 +-1 1747 +-1 1728 +-1 1708 +-1 1673 +-1 1650 +-1 1626 +-1 1609 +-1 1591 +-1 1568 +-1 1533 +-1 1521 +-1 1474 +-1 1462 +-1 1451 +-1 1439 +-1 1381 +-1 1346 +-1 1310 +-1 1264 +-1 1229 +-1 1205 +-1 1176 +-1 1147 +-1 1135 +-1 1112 +-1 1088 +-1 1077 +-1 1065 +-1 1048 +-1 1030 +-1 983 +-1 966 +-1 948 +-1 928 +-1 909 +-1 889 +-1 866 +-1 849 +-1 831 +-1 819 +-1 808 +-1 796 +-1 784 +-1 761 +-1 749 +725 714 +-1 702 +-1 691 +-1 679 +-1 667 +-1 655 +-1 650 +-1 644 +-1 626 +-1 608 +-1 597 +-1 591 +-1 585 +-1 574 +-1 562 +-1 550 +-1 539 +527 503 +-1 492 +-1 480 +-1 468 +-1 456 +-1 445 +-1 433 +-1 433 +-1 433 +-1 433 +-1 433 +-1 421 +-1 421 +-1 418 +-1 416 +-1 413 +-1 410 +-1 410 +-1 410 +-1 410 +-1 407 +-1 404 +-1 401 +-1 398 +-1 398 +-1 398 +-1 398 +-1 398 +-1 398 +-1 398 +-1 398 +-1 398 +-1 398 +-1 398 +-1 404 +-1 410 +-1 415 +-1 421 +-1 425 +-1 429 +-1 433 +-1 439 +-1 445 +-1 451 +-1 456 +-1 458 +-1 461 +-1 463 +-1 466 +-1 468 +-1 476 +-1 483 +-1 491 +-1 496 +-1 501 +-1 505 +-1 510 +-1 515 +-1 523 +-1 530 +-1 538 +-1 544 +-1 550 +-1 556 +-1 562 +-1 574 +-1 585 +-1 587 +-1 590 +-1 592 +-1 595 +-1 597 +-1 609 +-1 620 +-1 623 +-1 626 +-1 629 +-1 632 +-1 638 +-1 644 +-1 644 +-1 655 +-1 661 +-1 667 +-1 673 +-1 679 +-1 687 +-1 694 +-1 702 +-1 720 +-1 737 +-1 755 +-1 772 +-1 796 +-1 819 +-1 843 +-1 866 +-1 892 +-1 919 +-1 945 +-1 971 +995 1030 +-1 1053 +1088 1123 +-1 1147 +-1 1178 +-1 1209 +-1 1240 +-1 1310 +-1 1345 +-1 1381 +-1 1416 +-1 1445 +-1 1474 +-1 1509 +-1 1544 +1568 1580 +-1 1603 +-1 1619 +-1 1634 +-1 1650 +-1 1685 +-1 1720 +-1 1767 +1825 1872 +-1 1884 +-1 1895 +-1 1907 +1919 1942 +-1 1954 +-1 1966 +-1 2012 +-1 2030 +-1 2048 +2094 2129 +-1 2188 +2211 2258 +2282 2293 +2340 2352 +2399 2434 +-1 2463 +-1 2492 +2539 2609 +-1 2656 +2714 2726 +-1 2734 +-1 2742 +-1 2750 +2785 2820 +-1 2837 +-1 2854 +-1 2871 +-1 2888 +-1 2904 +-1 2921 +-1 2938 +-1 2955 +-1 2972 +-1 2996 +-1 3019 +-1 3048 +-1 3077 +-1 3083 +-1 3089 +-1 3101 +3136 3147 +-1 3159 +-1 3171 +-1 3183 +3194 3218 +-1 3230 +-1 3241 +3264 3288 +-1 3311 +-1 3319 +-1 3327 +-1 3335 +-1 3381 +-1 3399 +-1 3416 +-1 3440 +-1 3452 +-1 3463 +-1 3463 +-1 3463 +-1 3475 +-1 3475 +-1 3475 +-1 3487 +-1 3491 +-1 3494 +-1 3498 +-1 3498 +-1 3498 +-1 3498 +-1 3498 +-1 3498 +-1 3498 +-1 3498 +-1 3502 +-1 3506 +-1 3510 +-1 3510 +-1 3510 +-1 3510 +-1 3510 +-1 3510 +-1 3510 +-1 3510 +-1 3510 +-1 3510 +-1 3510 +-1 3510 +-1 3510 +-1 3510 +-1 3487 +-1 3487 +-1 3485 +-1 3482 +-1 3480 +-1 3477 +-1 3475 +-1 3463 +-1 3459 +-1 3456 +-1 3452 +-1 3446 +-1 3440 +-1 3432 +-1 3424 +-1 3416 +-1 3411 +-1 3405 +-1 3399 +-1 3393 +-1 3370 +-1 3346 +-1 3342 +-1 3339 +-1 3335 +-1 3323 +-1 3311 +-1 3299 +-1 3299 +-1 3299 +-1 3264 +-1 3259 +-1 3253 +-1 3247 +-1 3241 +-1 3235 +-1 3229 +-1 3218 +-1 3206 +-1 3200 +-1 3194 +-1 3188 +-1 3182 +-1 3177 +-1 3171 +-1 3163 +-1 3155 +-1 3147 +-1 3136 +3124 3112 +-1 3101 +-1 3089 +-1 3074 +-1 3060 +-1 3045 +-1 3030 +-1 2995 +-1 2990 +-1 2984 +-1 2972 +-1 2960 +-1 2948 +-1 2925 +-1 2919 +-1 2913 +-1 2890 +-1 2885 +-1 2881 +-1 2876 +-1 2872 +-1 2867 +-1 2861 +-1 2855 +-1 2831 +-1 2820 +-1 2808 +-1 2802 +-1 2796 +-1 2787 +-1 2779 +-1 2770 +-1 2761 +-1 2745 +-1 2730 +2714 2691 +-1 2679 +-1 2656 +-1 2650 +2644 2597 +-1 2574 +-1 2551 +-1 2528 +2504 2399 +-1 2393 +-1 2387 +-1 2375 +-1 2363 +-1 2352 +-1 2340 +-1 2328 +-1 2305 +-1 2282 +-1 2278 +-1 2274 +-1 2270 +-1 2258 +-1 2247 +-1 2235 +-1 2223 +-1 2212 +-1 2200 diff --git a/squarewave_waveform.awv b/squarewave_waveform.awv new file mode 100644 index 0000000..dabda27 --- /dev/null +++ b/squarewave_waveform.awv @@ -0,0 +1,600 @@ +2083 2083 +-1 2090 +-1 2097 +-1 2104 +-1 2111 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2118 +-1 2120 +-1 2122 +-1 2125 +-1 2127 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2129 +-1 2131 +-1 2134 +-1 2136 +-1 2139 +-1 2141 +-1 2146 +-1 2151 +-1 2155 +-1 2160 +-1 2165 +-1 2168 +-1 2171 +-1 2173 +-1 2176 +-1 2185 +-1 2194 +-1 2202 +-1 2211 +-1 2211 +2211 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +4095 2831 +2750 281 +269 234 +222 12 +-1 12 +-1 12 +-1 12 +-1 12 +-1 12 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 2 +-1 3 +-1 5 +-1 6 +-1 8 +-1 9 +-1 11 +-1 12 +-1 14 +-1 16 +-1 19 +-1 21 +-1 23 +-1 25 +-1 28 +-1 30 +-1 33 +-1 35 +-1 35 +-1 35 +-1 35 +-1 35 +-1 35 +-1 35 +-1 35 +-1 35 +-1 35 +-1 29 +-1 23 +-1 23 +-1 23 +-1 23 +-1 23 +-1 23 +-1 23 +-1 23 +-1 23 +-1 23 +-1 23 +-1 18 +-1 14 +-1 9 +-1 5 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 0 +-1 23 +-1 59 +-1 94 +105 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +-1 4095 +4095 2083 +-1 2083 +-1 2083 +-1 2083 +-1 2083 +-1 2083 +-1 2083 +-1 2083 +-1 2083 +-1 2083 diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..63815c6 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,163 @@ +/* +* Code Written by Quinn Henthorne: quinn.henthorne@gmail.com +* 10/7/2021 +* +* Pinout List +* Dac0 - Waveform output +* Dac1 - Amplitude output +* D2 - Synch Pin Output (For debugging purposes) +* D22 - Ampltidue Encoder Input +* D23 - Amplitude Encoder Input +* D24 - Period Encoder Input +* D25 - Period Encoder Input +* D26 - Waveform Select Encoder +* D27 - Waveform Select Encoder +*/ + + +#include +#include +#include +#include +//#include + +//uncomment to enable serial output for debugging +#define enable_serial_debug + +#define waveform_pin DAC0 +#define amplitude_pin DAC1 +#define sync_pin 2 + +// Number of waveforms available +#define waveform_num 4 +// Array of waveform arrays. Currently holds four waveforms with 600 samples each. +int waveforms[waveform_num][600] = { + {2083,2075,2067,2059,2071,2086,2100,2115,2129,2135,2141,2147,2153,2176,2176,2176,2176,2188,2201,2215,2228,2242,2255,2269,2282,2294,2305,2340,2352,2363,2376,2389,2401,2414,2427,2440,2453,2466,2478,2491,2504,2522,2539,2557,2574,2586,2597,2609,2621,2633,2644,2656,2668,2679,2691,2703,2714,2726,2738,2749,2761,2777,2792,2808,2820,2831,2843,2855,2867,2878,2890,2902,2960,2972,2984,2996,3007,3019,3030,3042,3053,3065,3078,3092,3105,3118,3131,3145,3158,3171,3181,3192,3202,3212,3223,3233,3243,3254,3264,3288,3294,3299,3314,3329,3343,3358,3364,3370,3393,3405,3417,3428,3440,3440,3452,3463,3463,3463,3463,3472,3481,3489,3498,3498,3498,3498,3498,3498,3510,3522,3522,3522,3522,3522,3522,3522,3522,3522,3522,3522,3522,3522,3522,3522,3522,3522,3522,3522,3522,3516,3510,3510,3498,3493,3487,3475,3471,3467,3463,3451,3440,3428,3416,3408,3401,3358,3346,3323,3288,3276,3253,3229,3218,3195,3171,3148,3124,3083,3042,3025,3007,2978,2948,2931,2913,2872,2831,2750,2668,2645,2621,2586,2551,2480,2445,2328,2270,2247,2223,2184,2145,1989,1954,1931,1872,1866,1860,1849,1837,1802,1785,1767,1747,1728,1708,1673,1650,1626,1609,1591,1568,1533,1521,1474,1462,1451,1439,1381,1346,1310,1264,1229,1205,1176,1147,1135,1112,1088,1077,1065,1048,1030,983,966,948,928,909,889,866,849,831,819,808,796,784,761,749,714,702,691,679,667,655,650,644,626,608,597,591,585,574,562,550,539,503,492,480,468,456,445,433,433,433,433,433,421,421,418,416,413,410,410,410,410,407,404,401,398,398,398,398,398,398,398,398,398,398,398,404,410,415,421,425,429,433,439,445,451,456,458,461,463,466,468,476,483,491,496,501,505,510,515,523,530,538,544,550,556,562,574,585,587,590,592,595,597,609,620,623,626,629,632,638,644,644,655,661,667,673,679,687,694,702,720,737,755,772,796,819,843,866,892,919,945,971,1030,1053,1123,1147,1178,1209,1240,1310,1345,1381,1416,1445,1474,1509,1544,1580,1603,1619,1634,1650,1685,1720,1767,1872,1884,1895,1907,1942,1954,1966,2012,2030,2048,2129,2188,2258,2293,2352,2434,2463,2492,2609,2656,2726,2734,2742,2750,2820,2837,2854,2871,2888,2904,2921,2938,2955,2972,2996,3019,3048,3077,3083,3089,3101,3147,3159,3171,3183,3218,3230,3241,3288,3311,3319,3327,3335,3381,3399,3416,3440,3452,3463,3463,3463,3475,3475,3475,3487,3491,3494,3498,3498,3498,3498,3498,3498,3498,3498,3502,3506,3510,3510,3510,3510,3510,3510,3510,3510,3510,3510,3510,3510,3510,3510,3487,3487,3485,3482,3480,3477,3475,3463,3459,3456,3452,3446,3440,3432,3424,3416,3411,3405,3399,3393,3370,3346,3342,3339,3335,3323,3311,3299,3299,3299,3264,3259,3253,3247,3241,3235,3229,3218,3206,3200,3194,3188,3182,3177,3171,3163,3155,3147,3136,3112,3101,3089,3074,3060,3045,3030,2995,2990,2984,2972,2960,2948,2925,2919,2913,2890,2885,2881,2876,2872,2867,2861,2855,2831,2820,2808,2802,2796,2787,2779,2770,2761,2745,2730,2691,2679,2656,2650,2597,2574,2551,2528,2399,2393,2387,2375,2363,2352,2340,2328,2305,2282,2278,2274,2270,2258,2247,2235,2223,2212,2200, + }, + {2083,2090,2097,2104,2111,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2118,2120,2122,2125,2127,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2131,2134,2136,2139,2141,2146,2151,2155,2160,2165,2168,2171,2173,2176,2185,2194,2202,2211,2211,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,2831,281,234,12,12,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,5,6,8,9,11,12,14,16,19,21,23,25,28,30,33,35,35,35,35,35,35,35,35,35,35,29,23,23,23,23,23,23,23,23,23,23,23,18,14,9,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,59,94,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,2083,2083,2083,2083,2083,2083,2083,2083,2083,2083, + }, + {1637,1637,1637,4095,4086,4078,4069,4061,4052,4044,4035,4027,4018,4010,4001,3993,3985,3977,3968,3960,3952,3944,3936,3928,3920,3912,3903,3896,3888,3880,3872,3864,3856,3848,3840,3833,3825,3817,3810,3802,3794,3787,3779,3772,3764,3757,3749,3742,3734,3727,3720,3712,3705,3698,3690,3683,3676,3669,3662,3655,3647,3640,3633,3626,3619,3612,3605,3598,3591,3585,3578,3571,3564,3557,3551,3544,3537,3530,3524,3517,3510,3504,3497,3491,3484,3478,3471,3465,3458,3452,3446,3439,3433,3427,3420,3414,3408,3401,3395,3389,3383,3377,3371,3365,3358,3352,3346,3340,3334,3328,3322,3316,3311,3305,3299,3293,3287,3281,3276,3270,3264,3258,3253,3247,3241,3236,3230,3224,3219,3213,3208,3202,3197,3191,3186,3180,3175,3169,3164,3159,3153,3148,3143,3137,3132,3127,3121,3116,3111,3106,3101,3096,3090,3085,3080,3075,3070,3065,3060,3055,3050,3045,3040,3035,3030,3025,3020,3016,3011,3006,3001,2996,2991,2987,2982,2977,2972,2968,2963,2958,2954,2949,2945,2940,2935,2931,2926,2922,2917,2913,2908,2904,2899,2895,2890,2886,2882,2877,2873,2868,2864,2860,2855,2851,2847,2843,2838,2834,2830,2826,2822,2817,2813,2809,2805,2801,2797,2793,2789,2785,2781,2777,2773,2769,2765,2761,2757,2753,2749,2745,2741,2737,2733,2729,2725,2722,2718,2714,2710,2706,2703,2699,2695,2691,2688,2684,2680,2677,2673,2669,2666,2662,2659,2655,2651,2648,2644,2641,2637,2634,2630,2627,2623,2620,2616,2613,2609,2606,2603,2599,2596,2592,2589,2586,2582,2579,2576,2572,2569,2566,2563,2559,2556,2553,2550,2546,2543,1637,1637,1637,1637,1637,1637,1637,1637,1637,1637,1637,1637,1637,1637,1637,1637,1637,1637,1637,1637,1637,1637,1637,1637,1637,1637,1637,1637,0,6,12,17,23,29,34,40,46,51,57,62,68,73,79,84,90,95,101,106,112,117,122,128,133,138,143,149,154,159,164,170,175,180,185,190,195,200,205,210,215,220,225,230,235,240,245,250,255,260,265,270,274,279,284,289,294,298,303,308,312,317,322,326,331,336,340,345,349,354,358,363,367,372,376,381,385,389,394,398,403,407,411,416,420,424,428,433,437,441,445,450,454,458,462,466,470,474,479,483,487,491,495,499,503,507,511,515,519,523,527,531,534,538,542,546,550,554,558,561,565,569,573,576,580,584,588,591,595,599,602,606,610,613,617,620,624,628,631,635,638,642,645,649,652,656,659,663,666,669,673,676,680,683,686,690,693,696,700,703,706,709,713,716,719,722,726,729,732,735,738,742,745,748,751,754,757,760,764,767,770,773,776,779,782,785,788,791,794,797,800,803,806,809,811,814,817,820,823,826,829,832,834,837,840,843,846,848,851,854,857,860,862,865,868,870,873,876,879,881,884,887,889,892,894,897,900,902,905,907,910,913,915,918,920,923,925,928,930,933,935,938,940,943,945,947,950,952,955,957,960,962,964,967,969,971,974,976,978,981,983,985,988,990,992,994,997,999,1001,1003,1006,1008,1010,1012,1015,1017,1019,1021,1023,1025,1028,1030,1032,1034,1637, + }, + {1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,2875,4095,4079,4062,4046,4030,4014,3999,3983,3967,3952,3937,3921,3906,3891,3876,3861,3846,3832,3817,3803,3788,3774,3760,3746,3732,3718,3704,3690,3677,3663,3650,3636,3623,3610,3597,3584,3571,3558,3545,3532,3520,3507,3495,3483,3470,3458,3446,3434,3422,3410,3399,3387,3375,3364,3352,3341,3329,3318,3307,3296,3285,3274,3263,3252,3242,3231,3220,3210,3199,3189,3179,3169,3158,3148,3138,3128,3118,3109,3099,3089,3079,3070,3060,3051,3041,3032,3023,3014,3005,2995,2986,2977,2969,2960,2951,2942,2934,2925,2916,2908,2899,2891,2883,2874,2866,2858,2850,2842,2834,2826,2818,2810,2802,2795,2787,2779,2772,2764,2757,2749,2742,2735,2727,2720,2713,2706,2699,2692,2685,2678,2671,2664,2657,2650,2644,2637,2630,2624,2617,2611,2604,2598,2591,2585,2579,2573,2566,2560,2554,2093,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,814,0,11,22,32,43,54,64,75,85,95,106,116,126,136,146,156,166,176,185,195,204,214,223,233,242,251,261,270,279,288,297,306,315,323,332,341,350,358,367,375,383,392,400,408,416,425,433,441,449,456,464,472,480,488,495,503,510,518,525,533,540,547,555,562,569,576,583,590,597,604,611,618,624,631,638,645,651,658,664,671,677,683,690,696,702,709,715,721,727,733,739,745,751,757,763,769,774,780,786,791,797,803,808,814,819,825,830,835,841,846,851,856,862,867,872,877,882,887,892,897,902,907,912,917,921,926,931,936,940,945,949,954,959,963,968,972,976,981,985,990,994,998,1002,1007,1011,1015,1019,1023,1027,1335,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638,1638, + } +}; + +//Setup encoders and their corresponding variables +Encoder amp_encoder(22, 23); +long new_amp = 64; +long old_amp = 64; +Encoder period_encoder(24, 25); +long new_period = 10; +long old_period = 10; +Encoder waveform_encoder(26, 27); +long new_waveform = 2; +long old_waveform = 2; +int waveform_select = 2; + +//Setup LCD Display +LiquidCrystal_I2C lcd(0x27,16,2); + +// Timer to regulate the step width +int timer = 0; +unsigned int millis_period = 13; + +void setup() { + //The sync pin can be run into an oscilliscope's trig channel to easiy find the waveform + pinMode(sync_pin, OUTPUT); + //Change the resolution of the analog ourput to its maximum (12 bit res) + analogWriteResolution(12); + //If serial debugging is enabled set up serial + #ifdef enable_serial_debug + Serial.begin(115200); + #endif + // Initialize timers and encoders + timer = micros(); + amp_encoder.write(new_amp*4); + period_encoder.write(new_period*4); + waveform_encoder.write(new_waveform*4); + + lcd.init(); // initialize the lcd + lcd.backlight(); +} + +void loop() { + lcd.setCursor(0,0); + lcd.print("Hello"); + // Read in encoder values + new_amp = amp_encoder.read()/4; + new_period = period_encoder.read()/4; + new_waveform = waveform_encoder.read()/4; + + // Check to see if any of the encoder values have changed. If they have, update their values. + //Handles ampltidue encoder + if(new_amp != old_amp){ + // Make sure the value is within a valid range + if(new_amp > 127){ + //128 ampltidue steps should be enough granularity + new_amp = 127; + amp_encoder.write(new_amp*4); + } + if(new_amp < 0){ + new_amp = 0; + amp_encoder.write(new_amp*4); + } + old_amp = new_amp; + } + + //Handles period encoder + if(new_period != old_period){ + // Make sure the value is within a valid range + if(new_period > 100){ + new_period = 100; + period_encoder.write(new_period*4); + } + //Anything less than three will cause errors + if(new_period < 3){ + new_period = 3; + period_encoder.write(new_period*4); + } + old_period = new_period; + } + + //Handles waveform encoder + if(new_waveform != old_waveform){ + // Make sure the value is within a valid range + if(new_waveform > waveform_num-1){ + new_waveform = waveform_num-1; + waveform_encoder.write(new_waveform*4); + } + if(new_waveform < 0){ + new_waveform = 0; + waveform_encoder.write(new_waveform*4); + } + old_waveform = new_waveform; + } + + // Creates a synch signal so an oscilliscope can more easily read irregular pulses + digitalWrite(sync_pin, !digitalRead(sync_pin)); + + // Output a signal to control the amplitude + analogWrite(amplitude_pin, map(new_amp, 0, 127, 0, 4095)); + + // The period of time each sample in the array should take in microseconds + // The 1000 converts from milliseconds to microseconds, and the 600 deivides by the number of samples in the array + // The -3 offset compensates for a 3 millisecond overhead created by the time it takes to do all of the calculations + unsigned int sample_period = (new_period-3)*1000/600; + + #ifdef enable_serial_debug + Serial.print("Ampltidue: "); + Serial.println(map(new_amp, 0, 127, 0, 4095)); + Serial.print("Period: "); + Serial.println(new_period); + Serial.print("Waveform #: "); + Serial.println(new_waveform); + delay(500); + #endif + + // Cycle through the waveform samples over a given period of time + for(int i = 0; i < 600; i++){ + while(micros()-timer < sample_period); + analogWrite(waveform_pin, waveforms[new_waveform][i]); + timer = micros(); + } +} \ No newline at end of file diff --git a/test/README b/test/README new file mode 100644 index 0000000..b94d089 --- /dev/null +++ b/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Unit Testing and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html