#include "main.h" #include #include #define POINTS 640 // Степень двойки удобнее для памяти #define PI 3.1415926F // Выравниваем массив по 4 байта, чтобы DMA не ошибся с адресом uint16_t DualSineWave[POINTS] = { 2730, 2763, 2797, 2831, 2865, 2899, 2933, 2967, 3001, 3034, 3067, 3099, 3131, 3162, 3192, 3221, 3250, 3277, 3303, 3329, 3352, 3375, 3396, 3416, 3434, 3450, 3465, 3478, 3490, 3499, 3507, 3513, 3517, 3520, 3520, 3518, 3515, 3509, 3502, 3492, 3481, 3467, 3452, 3435, 3416, 3395, 3372, 3348, 3322, 3294, 3265, 3234, 3201, 3168, 3133, 3096, 3059, 3020, 2981, 2941, 2900, 2858, 2816, 2773, 2730, 2686, 2642, 2599, 2555, 2512, 2469, 2426, 2384, 2342, 2301, 2261, 2222, 2183, 2146, 2111, 2076, 2043, 2012, 1982, 1954, 1927, 1903, 1880, 1859, 1841, 1824, 1810, 1797, 1787, 1780, 1774, 1771, 1770, 1772, 1776, 1782, 1790, 1801, 1815, 1830, 1848, 1868, 1890, 1914, 1941, 1969, 2000, 2032, 2066, 2102, 2139, 2178, 2219, 2260, 2303, 2348, 2393, 2439, 2486, 2534, 2582, 2631, 2680, 2730, 2779, 2828, 2878, 2927, 2975, 3023, 3071, 3118, 3164, 3208, 3252, 3295, 3336, 3376, 3414, 3450, 3485, 3518, 3550, 3579, 3606, 3631, 3654, 3674, 3693, 3709, 3722, 3733, 3742, 3748, 3752, 3753, 3752, 3748, 3742, 3733, 3722, 3709, 3693, 3674, 3654, 3631, 3606, 3579, 3550, 3518, 3485, 3450, 3414, 3376, 3336, 3295, 3252, 3208, 3164, 3118, 3071, 3023, 2975, 2927, 2878, 2828, 2779, 2730, 2680, 2631, 2582, 2534, 2486, 2439, 2393, 2348, 2303, 2260, 2219, 2178, 2139, 2102, 2066, 2032, 2000, 1969, 1941, 1914, 1890, 1868, 1848, 1830, 1815, 1801, 1790, 1782, 1776, 1772, 1770, 1771, 1774, 1780, 1787, 1797, 1810, 1824, 1841, 1859, 1880, 1903, 1927, 1954, 1982, 2012, 2043, 2076, 2111, 2146, 2183, 2222, 2261, 2301, 2342, 2384, 2426, 2469, 2512, 2555, 2599, 2642, 2686, 2730, 2773, 2816, 2858, 2900, 2941, 2981, 3020, 3059, 3096, 3133, 3168, 3201, 3234, 3265, 3294, 3322, 3348, 3372, 3395, 3416, 3435, 3452, 3467, 3481, 3492, 3502, 3509, 3515, 3518, 3520, 3520, 3517, 3513, 3507, 3499, 3490, 3478, 3465, 3450, 3434, 3416, 3396, 3375, 3352, 3329, 3303, 3277, 3250, 3221, 3192, 3162, 3131, 3099, 3067, 3034, 3001, 2967, 2933, 2899, 2865, 2831, 2797, 2763, 2730, 2696, 2663, 2631, 2599, 2568, 2537, 2507, 2479, 2451, 2424, 2398, 2373, 2349, 2326, 2305, 2285, 2266, 2248, 2232, 2217, 2204, 2192, 2182, 2173, 2165, 2159, 2154, 2151, 2149, 2149, 2150, 2152, 2156, 2162, 2168, 2176, 2185, 2195, 2207, 2220, 2233, 2248, 2264, 2281, 2299, 2317, 2336, 2356, 2377, 2399, 2421, 2443, 2466, 2489, 2513, 2537, 2561, 2585, 2609, 2633, 2658, 2682, 2706, 2730, 2753, 2776, 2799, 2821, 2843, 2865, 2886, 2906, 2925, 2944, 2963, 2980, 2997, 3012, 3027, 3041, 3055, 3067, 3078, 3089, 3098, 3106, 3114, 3120, 3126, 3130, 3134, 3136, 3137, 3138, 3137, 3136, 3133, 3130, 3126, 3121, 3115, 3108, 3100, 3091, 3082, 3072, 3061, 3049, 3037, 3024, 3011, 2997, 2983, 2968, 2952, 2937, 2920, 2904, 2887, 2870, 2853, 2835, 2818, 2800, 2782, 2765, 2747, 2730, 2712, 2695, 2677, 2660, 2644, 2627, 2611, 2595, 2580, 2565, 2550, 2536, 2523, 2510, 2497, 2485, 2474, 2463, 2453, 2444, 2435, 2427, 2420, 2413, 2407, 2402, 2398, 2395, 2392, 2390, 2389, 2388, 2389, 2390, 2392, 2395, 2398, 2402, 2407, 2413, 2420, 2427, 2435, 2444, 2453, 2463, 2474, 2485, 2497, 2510, 2523, 2536, 2550, 2565, 2580, 2595, 2611, 2627, 2644, 2660, 2677, 2695, 2712, 2730, 2747, 2765, 2782, 2800, 2818, 2835, 2853, 2870, 2887, 2904, 2920, 2937, 2952, 2968, 2983, 2997, 3011, 3024, 3037, 3049, 3061, 3072, 3082, 3091, 3100, 3108, 3115, 3121, 3126, 3130, 3133, 3136, 3137, 3138, 3137, 3136, 3134, 3130, 3126, 3120, 3114, 3106, 3098, 3089, 3078, 3067, 3055, 3041, 3027, 3012, 2997, 2980, 2963, 2944, 2925, 2906, 2886, 2865, 2843, 2821, 2799, 2776, 2753, 2730, 2706, 2682, 2658, 2633, 2609, 2585, 2561, 2537, 2513, 2489, 2466, 2443, 2421, 2399, 2377, 2356, 2336, 2317, 2299, 2281, 2264, 2248, 2233, 2220, 2207, 2195, 2185, 2176, 2168, 2162, 2156, 2152, 2150, 2149, 2149, 2151, 2154, 2159, 2165, 2173, 2182, 2192, 2204, 2217, 2232, 2248, 2266, 2285, 2305, 2326, 2349, 2373, 2398, 2424, 2451, 2479, 2507, 2537, 2568, 2599, 2631, 2663, 2696 }; // Функция для простой проверки (Генерирует "Пилу") // Если с синусом беда - раскомментируйте вызов этой функции в main void Calc_Sawtooth(void) { int i = 0; for (; i < POINTS; i++) { // Просто линейный рост от 0 до 4095 DualSineWave[i] = (uint16_t)((i * 4095) / POINTS); } } // Функция по заданию (Синус + гармоника) void Calc_ComplexWave(void) { /*int i = 0; for (;i < POINTS; i++) { // V = sin(t) + 0.5 * sin(2t) // float val = sinf(t) + 0.5f * sinf(2.0f * t); float val = 1365.0 * sinf(2.0*PI / 16.0 * (float)i) + 1365.0; // Масштабируем: диапазон формулы от -1.3 до +1.3 (примерно) // Сдвигаем на +1.5 и умножаем, чтобы влезть в 0..4095 // float scaled = (val + 1.5f) * (4095.0f / 3.0f); // Жесткое ограничение (Clamping), чтобы убрать "выбросы" // if (scaled > 4095.0f) scaled = 4095.0f; // if (scaled < 0.0f) scaled = 0.0f; DualSineWave[i] = (uint16_t)val; }*/ } void Delay_Loop(volatile uint32_t count) { while(count--) {} } int main(void) { SystemInit(); // На всякий случай обновляем частоты // --- ВЫБОР РЕЖИМА --- Calc_ComplexWave(); // По заданию // Calc_Sawtooth(); // <-- Раскомментируйте, если видите шум. Должна быть ровная пила. // Инициализация LEDs_ini(); // Чтобы видеть, что МК работает GPIO_Ini(); DMA_Ini(DualSineWave, POINTS); DAC_Ini(); TIM_Ini(); while(1) { // Мигаем светодиодом (PD12 - Зеленый), чтобы видеть, что плата не висит // GPIO_ToggleBits(GPIOD, GPIO_Pin_12); Delay_Loop(5000000); } }